⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278335 in webkit


Ignore:
Timestamp:
Jun 1, 2021, 6:01:06 PM (5 years ago)
Author:
Kyle Piddington
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):

Location:
trunk/Source/ThirdParty/ANGLE
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/ThirdParty/ANGLE/ChangeLog

    r278298 r278335  
     12021-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
    1262021-06-01  Kimmo Kinnunen  <kkinnunen@apple.com>
    227
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/BufferMtl.h

    r276569 r278335  
    9696    // So, in order to let GPU use the most recent modified content, one must call this method
    9797    // 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; }
    9999
    100100  protected:
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h

    r278298 r278335  
    281281    void invalidateDriverUniforms();
    282282    void invalidateRenderPipeline();
    283 
     283    void prepareForTransformFeedbackPassTwo();
    284284    // Call this to notify ContextMtl whenever FramebufferMtl's state changed
    285285    void onDrawFrameBufferChangedState(const gl::Context *context,
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm

    r278298 r278335  
    267267                                                      MTLIndexTypeUInt32, mTriFanArraysIndexBuffer,
    268268                                                      0, instances, first);
     269        prepareForTransformFeedbackPassTwo();
    269270    }
    270271
     
    306307        execDrawIndexedInstanced(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32,
    307308                                 genIdxBuffer, genIdxBufferOffset, instances);
     309        prepareForTransformFeedbackPassTwo();
    308310    }
    309311    ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances,
     
    375377        execDrawIndexedInstanced(MTLPrimitiveTypeLineStrip, genIndicesCount, MTLIndexTypeUInt32,
    376378                                 genIdxBuffer, genIdxBufferOffset, instances);
     379        prepareForTransformFeedbackPassTwo();
    377380    }
    378381    ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::LineLoop, first, count, instances,
     
    424427            execDrawInstanced(mtlType, first, count, instanceCount);
    425428        }
     429        prepareForTransformFeedbackPassTwo();
    426430    }
    427431    ANGLE_TRY(setupDraw(context, mode, first, count, instances, gl::DrawElementsType::InvalidEnum,
     
    501505            execDrawIndexedInstanced(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32,
    502506                                     genIdxBuffer, genIdxBufferOffset, instances);
     507            prepareForTransformFeedbackPassTwo();
    503508        }
    504509
     
    530535}
    531536
     537void 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}
    532546angle::Result ContextMtl::drawLineLoopElements(const gl::Context *context,
    533547                                               GLsizei count,
     
    566580            execDrawIndexedInstanced(MTLPrimitiveTypeLineStrip, genIndicesCount, MTLIndexTypeUInt32,
    567581                                     genIdxBuffer, genIdxBufferOffset, instances);
     582            prepareForTransformFeedbackPassTwo();
    568583        }
    569584
     
    661676            }
    662677        }
     678        prepareForTransformFeedbackPassTwo();
    663679    }
    664680
     
    13941410    {
    13951411        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);
    13961425    }
    13971426}
Note: See TracChangeset for help on using the changeset viewer.