Changeset 275476 in webkit


Ignore:
Timestamp:
Apr 5, 2021 7:16:53 PM (3 years ago)
Author:
commit-queue@webkit.org
Message:

[METAL ANGLE] Stencil only formats being used as the depth attachment.
https://bugs.webkit.org/show_bug.cgi?id=224183

Patch by John Cunningham <johncunnigham@apple.com> on 2021-04-05
Reviewed by Jon Lee.

  • src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp:
  • src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp:

(sh::Rewriter::argAlreadyProcessed):

  • src/libANGLE/renderer/metal/ContextMtl.mm:

(rx::ContextMtl::setupDraw):

  • src/libANGLE/renderer/metal/mtl_command_buffer.h:
  • src/libANGLE/renderer/metal/mtl_command_buffer.mm:

(rx::mtl::RenderCommandEncoder::reset):
(rx::mtl::RenderCommandEncoder::setRenderPipelineState):
(rx::mtl::RenderCommandEncoder::draw):
(rx::mtl::RenderCommandEncoder::drawInstanced):
(rx::mtl::RenderCommandEncoder::drawIndexed):
(rx::mtl::RenderCommandEncoder::drawIndexedInstanced):
(rx::mtl::RenderCommandEncoder::drawIndexedInstancedBaseVertex):

  • src/libANGLE/renderer/metal/mtl_utils.mm:

(rx::mtl::InitializeDepthStencilTextureContentsGPU):

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

Legend:

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

    r275222 r275476  
     12021-04-05  John Cunningham  <johncunnigham@apple.com>
     2
     3        [METAL ANGLE] Stencil only formats being used as the depth attachment.
     4        https://bugs.webkit.org/show_bug.cgi?id=224183
     5
     6        Reviewed by Jon Lee.
     7
     8        * src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp:
     9        * src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp:
     10        (sh::Rewriter::argAlreadyProcessed):
     11        * src/libANGLE/renderer/metal/ContextMtl.mm:
     12        (rx::ContextMtl::setupDraw):
     13        * src/libANGLE/renderer/metal/mtl_command_buffer.h:
     14        * src/libANGLE/renderer/metal/mtl_command_buffer.mm:
     15        (rx::mtl::RenderCommandEncoder::reset):
     16        (rx::mtl::RenderCommandEncoder::setRenderPipelineState):
     17        (rx::mtl::RenderCommandEncoder::draw):
     18        (rx::mtl::RenderCommandEncoder::drawInstanced):
     19        (rx::mtl::RenderCommandEncoder::drawIndexed):
     20        (rx::mtl::RenderCommandEncoder::drawIndexedInstanced):
     21        (rx::mtl::RenderCommandEncoder::drawIndexedInstancedBaseVertex):
     22        * src/libANGLE/renderer/metal/mtl_utils.mm:
     23        (rx::mtl::InitializeDepthStencilTextureContentsGPU):
     24
    1252021-03-30  Kyle Piddington  <kpiddington@apple.com>
    226
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp

    r274884 r275476  
    12431243    ~ANGLE_Out() { mDest = mTemp; }
    12441244    ANGLE_Out(thread T &dest)
    1245         : mDest(dest)
     1245        : mTemp(dest), mDest(dest)
    12461246    {}
    12471247    operator thread T &() { return mTemp; }
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/RewriteOutArgs.cpp

    r270733 r275476  
    9191        : TIntermRebuild(compiler, false, true), mSymbolEnv(symbolEnv)
    9292    {}
     93
     94    static bool argAlreadyProcessed(TIntermTyped *arg)
     95    {
     96        if (arg->getAsAggregate())
     97        {
     98            const TFunction *func = arg->getAsAggregate()->getFunction();
     99            if (func && func->symbolType() == SymbolType::AngleInternal && func->name() == "swizzle_ref")
     100            {
     101                return true;
     102            }
     103        }
     104        return false;
     105    }
    93106
    94107    PostResult visitAggregatePost(TIntermAggregate &aggregateNode) override
     
    162175                TIntermTyped *arg = args[i]->getAsTyped();
    163176                ASSERT(arg);
    164                 const TVariable *var       = GetVariable(*arg);
    165                 const TQualifier paramQual = getParamQualifier(i);
    166 
    167                 if (hasIndeterminateVar || mVarBuffer.multiplicity(var) > 1)
     177                if (!argAlreadyProcessed(arg))
    168178                {
    169                     switch (paramQual)
     179                    const TVariable *var       = GetVariable(*arg);
     180                    const TQualifier paramQual = getParamQualifier(i);
     181
     182                    if (hasIndeterminateVar || mVarBuffer.multiplicity(var) > 1)
    170183                    {
    171                         case TQualifier::EvqOut:
    172                             args[i] = &mSymbolEnv.callFunctionOverload(Name("out"), arg->getType(),
    173                                                                        *new TIntermSequence{arg});
    174                             break;
    175 
    176                         case TQualifier::EvqInOut:
    177                             args[i] = &mSymbolEnv.callFunctionOverload(
    178                                 Name("inout"), arg->getType(), *new TIntermSequence{arg});
    179                             break;
    180 
    181                         default:
    182                             break;
     184                        switch (paramQual)
     185                        {
     186                            case TQualifier::EvqOut:
     187                                args[i] = &mSymbolEnv.callFunctionOverload(Name("out"), arg->getType(),
     188                                                                           *new TIntermSequence{arg});
     189                                break;
     190
     191                            case TQualifier::EvqInOut:
     192                                args[i] = &mSymbolEnv.callFunctionOverload(
     193                                    Name("inout"), arg->getType(), *new TIntermSequence{arg});
     194                                break;
     195
     196                            default:
     197                                break;
     198                        }
    183199                    }
    184200                }
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm

    r274547 r275476  
    131131
    132132        indexBufferPool->releaseInFlightBuffers(mContextMtl);
    133 
    134133        ANGLE_TRY(indexBufferPool->allocate(mContextMtl, 2 * sizeof(uint32_t), nullptr,
    135134                                            &mLineLoopIndexBuffer, nullptr, nullptr));
     
    22142213    }
    22152214
    2216     ANGLE_TRY(mProgram->setupDraw(context, &mRenderEncoder, mRenderPipelineDesc, changedPipeline,
    2217                                   textureChanged, uniformBuffersDirty, transformFeedbackDraw));
     2215    ANGLE_TRY(mProgram->setupDraw(context, &mRenderEncoder, mRenderPipelineDesc,
     2216                                  changedPipeline, textureChanged,
     2217                                  uniformBuffersDirty, transformFeedbackDraw));
     2218
     2219    // Setting up the draw required us to call a command buffer flush, re-run setupDraw with state invaliated to restart the command buffer from the current draw with previously set state
     2220    if (!mCmdBuffer.valid())
     2221    {
     2222        invalidateState(context);
     2223        ANGLE_TRY(setupDraw(context, mode, firstVertex, vertexOrIndexCount, instances, indexTypeOrNone, indices, transformFeedbackDraw));
     2224    }
    22182225
    22192226    return angle::Result::Continue;
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.h

    r270733 r275476  
    523523
    524524    RenderCommandEncoderStates mStateCache = {};
     525
     526    bool mPipelineStateSet = false;
    525527};
    526528
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.mm

    r275012 r275476  
    10321032    CommandEncoder::reset();
    10331033    mRecording = false;
     1034    mPipelineStateSet = false;
    10341035    mCommands.clear();
    10351036}
     
    12961297RenderCommandEncoder &RenderCommandEncoder::setRenderPipelineState(id<MTLRenderPipelineState> state)
    12971298{
     1299    mPipelineStateSet = true;
    12981300    if (mStateCache.renderPipeline == state)
    12991301    {
     
    16041606                                                 uint32_t vertexCount)
    16051607{
     1608    ASSERT(mPipelineStateSet && "Render Pipeline State was never set and we've issued a draw command.");
    16061609    mHasDrawCalls = true;
    16071610    mCommands.push(CmdType::Draw).push(primitiveType).push(vertexStart).push(vertexCount);
     
    16151618                                                          uint32_t instances)
    16161619{
     1620    ASSERT(mPipelineStateSet && "Render Pipeline State was never set and we've issued a draw command.");
    16171621    mHasDrawCalls = true;
    16181622    mCommands.push(CmdType::DrawInstanced)
     
    16311635                                                        size_t bufferOffset)
    16321636{
     1637    ASSERT(mPipelineStateSet && "Render Pipeline State was never set and we've issued a draw command.");
    16331638    if (!indexBuffer)
    16341639    {
     
    16561661                                                                 uint32_t instances)
    16571662{
     1663    ASSERT(mPipelineStateSet && "Render Pipeline State was never set and we've issued a draw command.");
    16581664    if (!indexBuffer)
    16591665    {
     
    16841690    uint32_t baseVertex)
    16851691{
     1692    ASSERT(mPipelineStateSet && "Render Pipeline State was never set and we've issued a draw command.");
    16861693    if (!indexBuffer)
    16871694    {
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm

    r274654 r275476  
    313313    rtMTL.set(texture, level, layer, textureObjFormat);
    314314    mtl::RenderPassDesc rpDesc;
    315     rtMTL.toRenderPassAttachmentDesc(&rpDesc.depthAttachment);
     315    // For formats such as MTLPixelFormatStencil8/GL_STENCIL_INDEX8 we only want to set the stencil attachment.
     316    if (angleFormat.stencilBits && !angleFormat.depthBits)
     317    {
     318        rtMTL.toRenderPassAttachmentDesc(&rpDesc.stencilAttachment);
     319    }
     320    else
     321    {
     322        rtMTL.toRenderPassAttachmentDesc(&rpDesc.depthAttachment);
     323    }
    316324    rpDesc.sampleCount = texture->samples();
    317325    if (angleFormat.depthBits)
Note: See TracChangeset for help on using the changeset viewer.