Changeset 278335 in webkit
- Timestamp:
- Jun 1, 2021, 6:01:06 PM (5 years ago)
- Location:
- trunk/Source/ThirdParty/ANGLE
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
src/libANGLE/renderer/metal/BufferMtl.h (modified) (1 diff)
-
src/libANGLE/renderer/metal/ContextMtl.h (modified) (1 diff)
-
src/libANGLE/renderer/metal/ContextMtl.mm (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/ThirdParty/ANGLE/ChangeLog
r278298 r278335 1 2021-06-01 Kyle Piddington <kpiddington@apple.com> 2 3 [Metal ANGLE] transformFeedback samples on webglsamples.org do not render correctly 4 https://bugs.webkit.org/show_bug.cgi?id=226285 5 <rdar://78524773> 6 7 Reviewed by Dean Jackson. 8 9 Metal ANGLE does not render these samples correctly, for a number of reasons. 10 For transform_feedback_interleaved and seperated, We need to start a new renderEncoder to get the results from the transform feedback. 11 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. 12 Testing: Ran all transform feedback tests from deqp suite to ensure no regressions are present. 13 14 * src/libANGLE/renderer/metal/ContextMtl.h: 15 * src/libANGLE/renderer/metal/ContextMtl.mm: 16 (rx::ContextMtl::drawTriFanArraysWithBaseVertex): 17 (rx::ContextMtl::drawArraysImpl): 18 (rx::ContextMtl::drawTriFanElements): 19 (rx::ContextMtl::prepareForTransformFeedbackPassTwo): 20 (rx::ContextMtl::drawLineLoopElements): 21 (rx::ContextMtl::drawElementsImpl): 22 (rx::ContextMtl::onEndTransformFeedback): 23 * src/libANGLE/renderer/metal/TransformFeedbackMtl.mm: 24 (rx::TransformFeedbackMtl::end): 25 1 26 2021-06-01 Kimmo Kinnunen <kkinnunen@apple.com> 2 27 -
trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h
r276569 r278335 96 96 // So, in order to let GPU use the most recent modified content, one must call this method 97 97 // right before the draw call to retrieved the most up-to-date mtl::Buffer. 98 mtl::BufferRef getCurrentBuffer() { return mIsWeak ? mBufferWeakRef.lock() : mBuffer; }98 mtl::BufferRef getCurrentBuffer() const { return mIsWeak ? mBufferWeakRef.lock() : mBuffer; } 99 99 100 100 protected: -
trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h
r278298 r278335 281 281 void invalidateDriverUniforms(); 282 282 void invalidateRenderPipeline(); 283 283 void prepareForTransformFeedbackPassTwo(); 284 284 // Call this to notify ContextMtl whenever FramebufferMtl's state changed 285 285 void onDrawFrameBufferChangedState(const gl::Context *context, -
trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm
r278298 r278335 267 267 MTLIndexTypeUInt32, mTriFanArraysIndexBuffer, 268 268 0, instances, first); 269 prepareForTransformFeedbackPassTwo(); 269 270 } 270 271 … … 306 307 execDrawIndexedInstanced(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32, 307 308 genIdxBuffer, genIdxBufferOffset, instances); 309 prepareForTransformFeedbackPassTwo(); 308 310 } 309 311 ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances, … … 375 377 execDrawIndexedInstanced(MTLPrimitiveTypeLineStrip, genIndicesCount, MTLIndexTypeUInt32, 376 378 genIdxBuffer, genIdxBufferOffset, instances); 379 prepareForTransformFeedbackPassTwo(); 377 380 } 378 381 ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::LineLoop, first, count, instances, … … 424 427 execDrawInstanced(mtlType, first, count, instanceCount); 425 428 } 429 prepareForTransformFeedbackPassTwo(); 426 430 } 427 431 ANGLE_TRY(setupDraw(context, mode, first, count, instances, gl::DrawElementsType::InvalidEnum, … … 501 505 execDrawIndexedInstanced(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32, 502 506 genIdxBuffer, genIdxBufferOffset, instances); 507 prepareForTransformFeedbackPassTwo(); 503 508 } 504 509 … … 530 535 } 531 536 537 void ContextMtl::prepareForTransformFeedbackPassTwo() 538 { 539 //If we don't have rasterization enabled, we can re-run the same vertex shader. Otherwise, 540 //We need to invalidate the render pipeline state. 541 if(!mState.isRasterizerDiscardEnabled()) 542 { 543 invalidateRenderPipeline(); 544 } 545 } 532 546 angle::Result ContextMtl::drawLineLoopElements(const gl::Context *context, 533 547 GLsizei count, … … 566 580 execDrawIndexedInstanced(MTLPrimitiveTypeLineStrip, genIndicesCount, MTLIndexTypeUInt32, 567 581 genIdxBuffer, genIdxBufferOffset, instances); 582 prepareForTransformFeedbackPassTwo(); 568 583 } 569 584 … … 661 676 } 662 677 } 678 prepareForTransformFeedbackPassTwo(); 663 679 } 664 680 … … 1394 1410 { 1395 1411 onTransformFeedbackStateChanged(); 1412 } 1413 if (getDisplay()->getFeatures().hasExplicitMemBarrier.enabled) 1414 { 1415 for(auto & bufferRef : mCurrentTransformFeedbackBuffers) 1416 { 1417 const mtl::BufferRef & constBufferRef = bufferRef->getCurrentBuffer(); 1418 mRenderEncoder.memoryBarrierWithResource(constBufferRef, mtl::kRenderStageVertex, mtl::kRenderStageVertex); 1419 } 1420 } 1421 else 1422 { 1423 //End the command encoder, so any Transform Feedback changes are available to subsequent draw calls. 1424 endEncoding(false); 1396 1425 } 1397 1426 }
Note:
See TracChangeset
for help on using the changeset viewer.