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
