[Webkit-unassigned] [Bug 91537] [Chromium] Textures drawn during occlusion are incorrectly re-used when unoccluded.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Thu Jul 19 08:18:22 PDT 2012


https://bugs.webkit.org/show_bug.cgi?id=91537





--- Comment #6 from zlieber at chromium.org  2012-07-19 08:18:21 PST ---
(In reply to comment #4)
> > Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp:445
> > +    if (hasOcclusionFromOutsideTargetSurface)
> > +        *hasOcclusionFromOutsideTargetSurface = (unoccludedInScreen != unoccludedInTarget);
> 
> I think you should be checking the occlusion on m_stack[lastIndex - 1].occlusionInScreen, which is the external occlusion for this surface prior to considering anything in the surface.  Any layers that draw into this target surface will update m_stack.last().occlusionInScreen as they go (if the transform to the screen is known), which muddles internal and external occlusion.

I think what you're proposing is essentially checking (external != 0), "external" being the external occlusion for the layer - right? What (I think) I'm currently checking is (external + internal != internal). I'd say the latter is a little bit more precise, even though with boolean flag the result will be the same.

If layer A occludes B partially in the surface, and both of them are occluded by layer E outside (but B's occlusion by E is smaller than B's occlusion by A), I would only get a positive result on A, whereas you would get it on both. With boolean flag I cannot see where this would fail; if we move to a rect instead, there may be benefit in only checking A, though I cannot think of an example right now.

Also I already have both rects computed anyhow, so it's simpler to implement.

-- 
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.



More information about the webkit-unassigned mailing list