Title: [278335] trunk/Source/ThirdParty/ANGLE
Revision
278335
Author
[email protected]
Date
2021-06-01 18:01:06 -0700 (Tue, 01 Jun 2021)

Log Message

[Metal ANGLE] transformFeedback samples on webglsamples.org do not render correctly
https://bugs.webkit.org/show_bug.cgi?id=226285
<rdar://78524773>

Reviewed by Dean Jackson.

Metal ANGLE does not render these samples correctly, for a number of reasons.
For transform_feedback_interleaved and seperated, We need to start a new renderEncoder to get the results from the transform feedback.
for transform_feedback-seperated_2, we need to invalidate the current render pass descriptor in order to switch to the rasterizer-enabled version of the shader.
Testing: Ran all transform feedback tests from deqp suite to ensure no regressions are present.

* src/libANGLE/renderer/metal/ContextMtl.h:
* src/libANGLE/renderer/metal/ContextMtl.mm:
(rx::ContextMtl::drawTriFanArraysWithBaseVertex):
(rx::ContextMtl::drawArraysImpl):
(rx::ContextMtl::drawTriFanElements):
(rx::ContextMtl::prepareForTransformFeedbackPassTwo):
(rx::ContextMtl::drawLineLoopElements):
(rx::ContextMtl::drawElementsImpl):
(rx::ContextMtl::onEndTransformFeedback):
* src/libANGLE/renderer/metal/TransformFeedbackMtl.mm:
(rx::TransformFeedbackMtl::end):

Modified Paths

Diff

Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (278334 => 278335)


--- trunk/Source/ThirdParty/ANGLE/ChangeLog	2021-06-02 00:27:45 UTC (rev 278334)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog	2021-06-02 01:01:06 UTC (rev 278335)
@@ -1,3 +1,28 @@
+2021-06-01  Kyle Piddington  <[email protected]>
+
+        [Metal ANGLE] transformFeedback samples on webglsamples.org do not render correctly
+        https://bugs.webkit.org/show_bug.cgi?id=226285
+        <rdar://78524773>
+
+        Reviewed by Dean Jackson.
+
+        Metal ANGLE does not render these samples correctly, for a number of reasons. 
+        For transform_feedback_interleaved and seperated, We need to start a new renderEncoder to get the results from the transform feedback. 
+        for transform_feedback-seperated_2, we need to invalidate the current render pass descriptor in order to switch to the rasterizer-enabled version of the shader.
+        Testing: Ran all transform feedback tests from deqp suite to ensure no regressions are present.
+
+        * src/libANGLE/renderer/metal/ContextMtl.h:
+        * src/libANGLE/renderer/metal/ContextMtl.mm:
+        (rx::ContextMtl::drawTriFanArraysWithBaseVertex):
+        (rx::ContextMtl::drawArraysImpl):
+        (rx::ContextMtl::drawTriFanElements):
+        (rx::ContextMtl::prepareForTransformFeedbackPassTwo):
+        (rx::ContextMtl::drawLineLoopElements):
+        (rx::ContextMtl::drawElementsImpl):
+        (rx::ContextMtl::onEndTransformFeedback):
+        * src/libANGLE/renderer/metal/TransformFeedbackMtl.mm:
+        (rx::TransformFeedbackMtl::end):
+
 2021-06-01  Kimmo Kinnunen  <[email protected]>
 
         ANGLE Metal translator pre-rotation code is unused and it asserts when used

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h (278334 => 278335)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h	2021-06-02 00:27:45 UTC (rev 278334)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h	2021-06-02 01:01:06 UTC (rev 278335)
@@ -95,7 +95,7 @@
     // a queue of mtl::Buffer and only let CPU modifies a free mtl::Buffer.
     // So, in order to let GPU use the most recent modified content, one must call this method
     // right before the draw call to retrieved the most up-to-date mtl::Buffer.
-    mtl::BufferRef getCurrentBuffer() { return mIsWeak ? mBufferWeakRef.lock() : mBuffer; }
+    mtl::BufferRef getCurrentBuffer() const { return mIsWeak ? mBufferWeakRef.lock() : mBuffer; }
 
   protected:
     mtl::BufferRef mBuffer;

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h (278334 => 278335)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h	2021-06-02 00:27:45 UTC (rev 278334)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h	2021-06-02 01:01:06 UTC (rev 278335)
@@ -280,7 +280,7 @@
     void invalidateCurrentTextures();
     void invalidateDriverUniforms();
     void invalidateRenderPipeline();
-
+    void prepareForTransformFeedbackPassTwo();
     // Call this to notify ContextMtl whenever FramebufferMtl's state changed
     void onDrawFrameBufferChangedState(const gl::Context *context,
                                        FramebufferMtl *framebuffer,

Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm (278334 => 278335)


--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm	2021-06-02 00:27:45 UTC (rev 278334)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm	2021-06-02 01:01:06 UTC (rev 278335)
@@ -266,6 +266,7 @@
         mRenderEncoder.drawIndexedInstancedBaseVertex(MTLPrimitiveTypeTriangle, genIndicesCount,
                                                       MTLIndexTypeUInt32, mTriFanArraysIndexBuffer,
                                                       0, instances, first);
+        prepareForTransformFeedbackPassTwo();
     }
 
     ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances,
@@ -305,6 +306,7 @@
 
         execDrawIndexedInstanced(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32,
                                  genIdxBuffer, genIdxBufferOffset, instances);
+        prepareForTransformFeedbackPassTwo();
     }
     ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances,
                         gl::DrawElementsType::InvalidEnum, reinterpret_cast<const void *>(0),
@@ -374,6 +376,7 @@
 
         execDrawIndexedInstanced(MTLPrimitiveTypeLineStrip, genIndicesCount, MTLIndexTypeUInt32,
                                  genIdxBuffer, genIdxBufferOffset, instances);
+        prepareForTransformFeedbackPassTwo();
     }
     ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::LineLoop, first, count, instances,
                         gl::DrawElementsType::InvalidEnum, nullptr, false));
@@ -423,6 +426,7 @@
         {
             execDrawInstanced(mtlType, first, count, instanceCount);
         }
+        prepareForTransformFeedbackPassTwo();
     }
     ANGLE_TRY(setupDraw(context, mode, first, count, instances, gl::DrawElementsType::InvalidEnum,
                         nullptr, false));
@@ -500,6 +504,7 @@
 
             execDrawIndexedInstanced(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32,
                                      genIdxBuffer, genIdxBufferOffset, instances);
+            prepareForTransformFeedbackPassTwo();
         }
 
         ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, 0, count, instances, type,
@@ -529,6 +534,15 @@
     return drawElementsImpl(context, gl::PrimitiveMode::LineStrip, count, type, indices, 0);
 }
 
+void ContextMtl::prepareForTransformFeedbackPassTwo()
+{
+    //If we don't have rasterization enabled, we can re-run the same vertex shader. Otherwise,
+    //We need to invalidate the render pipeline state.
+    if(!mState.isRasterizerDiscardEnabled())
+    {
+        invalidateRenderPipeline();
+    }
+}
 angle::Result ContextMtl::drawLineLoopElements(const gl::Context *context,
                                                GLsizei count,
                                                gl::DrawElementsType type,
@@ -565,6 +579,7 @@
 
             execDrawIndexedInstanced(MTLPrimitiveTypeLineStrip, genIndicesCount, MTLIndexTypeUInt32,
                                      genIdxBuffer, genIdxBufferOffset, instances);
+            prepareForTransformFeedbackPassTwo();
         }
 
         ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::LineLoop, 0, count, instances, type,
@@ -660,6 +675,7 @@
                                      command.offset, instanceCount);
             }
         }
+        prepareForTransformFeedbackPassTwo();
     }
 
     ANGLE_TRY(setupDraw(context, mode, 0, convertedCounti32, instances, type, indices, false));
@@ -1394,6 +1410,19 @@
     {
         onTransformFeedbackStateChanged();
     }
+    if (getDisplay()->getFeatures().hasExplicitMemBarrier.enabled)
+    {
+        for(auto & bufferRef : mCurrentTransformFeedbackBuffers)
+        {
+            const mtl::BufferRef & constBufferRef = bufferRef->getCurrentBuffer();
+            mRenderEncoder.memoryBarrierWithResource(constBufferRef, mtl::kRenderStageVertex, mtl::kRenderStageVertex);
+        }
+    }
+    else
+    {
+        //End the command encoder, so any Transform Feedback changes are available to subsequent draw calls.
+        endEncoding(false);
+    }
 }
 
 angle::Result ContextMtl::onPauseTransformFeedback()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to