Title: [275074] trunk/Source/ThirdParty/ANGLE
Revision
275074
Author
[email protected]
Date
2021-03-25 20:13:09 -0700 (Thu, 25 Mar 2021)

Log Message

ANGLE Metal crash ASAN webgl/1.0.3/conformance/misc/object-deletion-behaviour.html
https://bugs.webkit.org/show_bug.cgi?id=223739

Patch by Kyle Piddington <[email protected]> on 2021-03-25
Reviewed by Dean Jackson.

Previously, ANGLE would try to read color attachments off of the
cached render targets. However, since validation happens before
state sync, the cached render targets may be out of date.

For non-surface backed render targets, we instead get a fresh copy
of the render target when determening the native pixel format.

* src/libANGLE/renderer/metal/FrameBufferMtl.h:
* src/libANGLE/renderer/metal/FrameBufferMtl.mm:
(rx::FramebufferMtl::getImplementationColorReadFormat const):
(rx::FramebufferMtl::getColorReadRenderTargetNoCache const):

Modified Paths

Diff

Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (275073 => 275074)


--- trunk/Source/ThirdParty/ANGLE/ChangeLog	2021-03-26 03:09:08 UTC (rev 275073)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog	2021-03-26 03:13:09 UTC (rev 275074)
@@ -1,5 +1,25 @@
 2021-03-25  Kyle Piddington  <[email protected]>
 
+        ANGLE Metal crash ASAN webgl/1.0.3/conformance/misc/object-deletion-behaviour.html
+        https://bugs.webkit.org/show_bug.cgi?id=223739
+
+        Reviewed by Dean Jackson.
+
+        Previously, ANGLE would try to read color attachments off of the
+        cached render targets. However, since validation happens before
+        state sync, the cached render targets may be out of date.
+
+        For non-surface backed render targets, we instead get a fresh copy
+        of the render target when determening the native pixel format.
+
+        * src/libANGLE/renderer/metal/FrameBufferMtl.h:
+        * src/libANGLE/renderer/metal/FrameBufferMtl.mm:
+        (rx::FramebufferMtl::getImplementationColorReadFormat const):
+        (rx::FramebufferMtl::getColorReadRenderTargetNoCache const):
+
+
+2021-03-25  Kyle Piddington  <[email protected]>
+
         [Metal ANGLE] Add CPU mipmap generation for workaround on Intel devices.
         https://bugs.webkit.org/show_bug.cgi?id=223778
 

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/FrameBufferMtl.h (275073 => 275074)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/FrameBufferMtl.h	2021-03-26 03:09:08 UTC (rev 275073)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/FrameBufferMtl.h	2021-03-26 03:13:09 UTC (rev 275074)
@@ -206,6 +206,8 @@
                                      uint32_t dstBufferRowPitch,
                                      const mtl::BufferRef *dstBuffer) const;
 
+    RenderTargetMtl * getColorReadRenderTargetNoCache(const gl::Context *context) const;
+
     // NOTE: we cannot use RenderTargetCache here because it doesn't support separate
     // depth & stencil attachments as of now. Separate depth & stencil could be useful to
     // save spaces on iOS devices. See doc/PackedDepthStencilSupport.md.

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/FrameBufferMtl.mm (275073 => 275074)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/FrameBufferMtl.mm	2021-03-26 03:09:08 UTC (rev 275073)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/FrameBufferMtl.mm	2021-03-26 03:13:09 UTC (rev 275074)
@@ -202,7 +202,7 @@
 const gl::InternalFormat &FramebufferMtl::getImplementationColorReadFormat(
     const gl::Context *context) const
 {
-    return GetReadAttachmentInfo(context, getColorReadRenderTarget(context));
+    return GetReadAttachmentInfo(context, getColorReadRenderTargetNoCache(context));
 }
 
 angle::Result FramebufferMtl::readPixels(const gl::Context *context,
@@ -641,6 +641,30 @@
     return mColorRenderTargets[mState.getReadIndex()];
 }
 
+RenderTargetMtl *FramebufferMtl::getColorReadRenderTargetNoCache(const gl::Context *context) const
+{
+    if (mState.getReadIndex() >= mColorRenderTargets.size())
+    {
+        return nullptr;
+    }
+
+    if (mBackbuffer)
+    {
+        //If we have a backbuffer/window surface, we can take the old path here and return
+        //the cached color render target.
+        return getColorReadRenderTarget(context);
+    }
+    //If we have no backbuffer, get the attachment from state color attachments, as it may have changed before syncing.
+    const gl::FramebufferAttachment * attachment = mState.getColorAttachment(mState.getReadIndex());
+    RenderTargetMtl * currentTarget = nullptr;
+    if(attachment->getRenderTarget(context, attachment->getRenderToTextureSamples(),
+                                &currentTarget) == angle::Result::Stop)
+    {
+        return nullptr;
+    }
+    return currentTarget;
+}
+
 int FramebufferMtl::getSamples() const
 {
     return mRenderPassDesc.sampleCount;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to