diff --git a/MobileGL/MG_Impl/Pipe/TextureEmit.h b/MobileGL/MG_Impl/Pipe/TextureEmit.h index 4858d698..cc208ada 100644 --- a/MobileGL/MG_Impl/Pipe/TextureEmit.h +++ b/MobileGL/MG_Impl/Pipe/TextureEmit.h @@ -1479,11 +1479,15 @@ namespace MobileGL::MG_Pipe { // hold GPU writes (and otherwise it re-applies the storage's box-or-rects choice // itself, so the Mali job count is the server's call as before). // - // 0 IS NOW THE WHOLE-LEVEL SPELLING ONLY: a footprint that is the whole level. Every - // other write carries its boxes, a single one included, so that the applier's - // accumulation (boxes union, lists concatenate, "0 regions" makes the entry box only) - // never widens two exact contributions into their union box. A footprint larger than - // one record may carry falls back to the storage's rect list - a COVER, stated once. + // 0 IS NOW THE WHOLE-LEVEL SPELLING - a footprint that is the whole level - with one + // exception (below). Every other write carries its boxes, a single one included, so the + // applier's accumulation (boxes union, lists concatenate, "0 regions" makes the entry + // box only) never widens two exact contributions into their union box. THE EXCEPTION: + // a footprint larger than one record may carry (kMGPipeMaxPendingUploadRegions) falls + // back to the storage's rect list - a COVER, stated once in the log - and when that list + // is withheld (0: its rects fill 3/4 of the union box) this 0 is a PARTIAL, INEXACT + // box. A reader that takes "box only" as "the client owns every texel of the box" + // (AdoptDriverLevelIntoShadow's covering-box rule) is exact everywhere but here. // // READ AS BOXES, ONCE, because both shapes below want them in that form: the // whole-level record converts each one straight back through MGPipeBuildSubRegion, diff --git a/MobileGL/MG_Pipe/PipeApply.cpp b/MobileGL/MG_Pipe/PipeApply.cpp index 54c0d06c..92cf5cb5 100644 --- a/MobileGL/MG_Pipe/PipeApply.cpp +++ b/MobileGL/MG_Pipe/PipeApply.cpp @@ -902,8 +902,12 @@ namespace MobileGL::MG_Pipe { if (entry.UploadTarget != record.Target || entry.Level != record.Level) continue; entry.UnionBox = UnionOfBoxes(entry.UnionBox, record.UnionBox); if (record.RegionCount == 0 || entry.Regions.empty()) { - // A whole-level contribution (the emitter's only box-only spelling since P11 - // M2) owns every texel of the level, so the entry is that box, exactly. + // A whole-level contribution (the emitter's box-only spelling since P11 M2) + // owns every texel of the level, so the entry is that box, exactly. The one + // other box-only record is the emitter's oversize fallback (a footprint past + // kMGPipeMaxPendingUploadRegions goes out as the storage's cover, which it + // withholds as 0 at 3/4 of the box), a partial box spanning gaps - already + // inexact, and logged once where it is emitted (TextureEmit.h). entry.Regions.clear(); return true; }