Changeset 273188 in webkit


Ignore:
Timestamp:
Feb 19, 2021 6:09:07 PM (3 years ago)
Author:
dino@apple.com
Message:

Fix a number of functional regressions caused by enabling the Metal ANGLE backend by default.
https://bugs.webkit.org/show_bug.cgi?id=220895
<rdar://problem/73539537>

Patch by Kyle Piddington <Kyle Piddington> on 2021-02-19
Reviewed by Kenneth Russell.

Fixed webgl/1.0.3/conformance/context/context-hidden-alpha.html

MTL Translator direct fixes for webgl/1.0.3/conformance/glsl/constructors/glsl-construct-*vec2 tests, Plus fix for GL_VertexIndex

Fix EmitMetal crash for missing function textureRect.

Additional fixes for 73675990, shaders-with-invariance.html, shaders-with-uniform-structs.html, struct-specifiers-in-uniforms.html, framebuffer-object-attachment.html

Fixed clamping of array elements.

  • ANGLE.xcodeproj/project.pbxproj:
  • src/compiler/translator/TranslatorMetalDirect.cpp:

(sh::TranslatorMetalDirect::translateImpl):

  • src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp:

(GenMetalTraverser::emitPostQualifier):
(GenMetalTraverser::visitBinary):
(GenMetalTraverser::BuildFuncToName):

  • src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp: Added.

(sh::FixTypeTraverser::FixTypeTraverser):
(sh::FixTypeConstructors):

  • src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h: Added.
  • src/compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.cpp: Added.

(sh::NameEmbeddedStructUniformsMetal):

  • src/compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.h: Added.
  • src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp:

(SaturateVectorOf):

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

(sh::ProgramPrelude::ProgramPrelude):

  • src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp:

(sh::Reducer::Reducer):
(sh::ReduceInterfaceBlocks):

  • src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h:
  • src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp:
  • src/libANGLE/renderer/load_functions_table_autogen.cpp:
  • src/libANGLE/renderer/metal/ContextMtl.mm:

(rx::ContextMtl::drawElementsImpl):

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

(rx::IOSurfaceSurfaceMtl::IOSurfaceSurfaceMtl):
(rx::IOSurfaceSurfaceMtl::createBackingTexture):

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

(rx::RenderbufferMtl::setStorageImpl):

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

(rx::VertexArrayMtl::getIndexBuffer):
(rx::VertexArrayMtl::convertIndexBuffer):
(rx::VertexArrayMtl::streamIndexBufferFromClient):

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

(rx::mtl::InitializeDepthStencilTextureContentsGPU):

  • src/libANGLE/renderer/metal/shaders/blit.metal:
  • src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc:
Location:
trunk/Source/ThirdParty/ANGLE
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj

    r270733 r273188  
    11811181                A3D3291823CFCB7700375657 /* RemoveInactiveInterfaceVariables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3D3291223CFCB7600375657 /* RemoveInactiveInterfaceVariables.cpp */; };
    11821182                A3D3291923CFCB7700375657 /* RemoveInactiveInterfaceVariables.h in Headers */ = {isa = PBXBuildFile; fileRef = A3D3291323CFCB7600375657 /* RemoveInactiveInterfaceVariables.h */; };
     1183                FF2D2F5425C8B14A002FB699 /* FixTypeConstructors.h in Headers */ = {isa = PBXBuildFile; fileRef = FF2D2F5225C8B14A002FB699 /* FixTypeConstructors.h */; };
     1184                FF2D2F5525C8B14A002FB699 /* FixTypeConstructors.h in Headers */ = {isa = PBXBuildFile; fileRef = FF2D2F5225C8B14A002FB699 /* FixTypeConstructors.h */; };
     1185                FF2D2F5625C8B14A002FB699 /* FixTypeConstructors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FF2D2F5325C8B14A002FB699 /* FixTypeConstructors.cpp */; };
    11831186                FF81FED025818D6800894E24 /* mtl_glslang_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = FF81FE8025818D6800894E24 /* mtl_glslang_utils.h */; };
    11841187                FF81FED125818D6800894E24 /* ProgramMtl.h in Headers */ = {isa = PBXBuildFile; fileRef = FF81FE8125818D6800894E24 /* ProgramMtl.h */; };
     
    13161319                FF81FFA32581AD0400894E24 /* gen_mipmap.metal in Sources */ = {isa = PBXBuildFile; fileRef = FF81FEB225818D6800894E24 /* gen_mipmap.metal */; };
    13171320                FF81FFA42581AD0400894E24 /* gen_indices.metal in Sources */ = {isa = PBXBuildFile; fileRef = FF81FEB325818D6800894E24 /* gen_indices.metal */; };
     1321                FFA0C2C725CB6A7700105306 /* NameEmbeddedUniformStructsMetal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FFA0C2C525CB6A7600105306 /* NameEmbeddedUniformStructsMetal.cpp */; };
     1322                FFA0C2C825CB6A7700105306 /* NameEmbeddedUniformStructsMetal.h in Headers */ = {isa = PBXBuildFile; fileRef = FFA0C2C625CB6A7700105306 /* NameEmbeddedUniformStructsMetal.h */; };
    13181323/* End PBXBuildFile section */
    13191324
     
    21662171                FB39D0D11200F0E300088E69 /* libANGLE.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libANGLE.a; sourceTree = BUILT_PRODUCTS_DIR; };
    21672172                FB39D2BF1200F3E600088E69 /* ShaderLang.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = ShaderLang.h; sourceTree = "<group>"; };
     2173                FF2D2F5225C8B14A002FB699 /* FixTypeConstructors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FixTypeConstructors.h; sourceTree = "<group>"; };
     2174                FF2D2F5325C8B14A002FB699 /* FixTypeConstructors.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FixTypeConstructors.cpp; sourceTree = "<group>"; };
    21682175                FF81FE8025818D6800894E24 /* mtl_glslang_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mtl_glslang_utils.h; sourceTree = "<group>"; };
    21692176                FF81FE8125818D6800894E24 /* ProgramMtl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProgramMtl.h; sourceTree = "<group>"; };
     
    23032310                FF81FF992581A3C100894E24 /* IntermRebuild.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntermRebuild.cpp; sourceTree = "<group>"; };
    23042311                FF81FF9A2581A3C200894E24 /* IntermRebuild.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntermRebuild.h; sourceTree = "<group>"; };
     2312                FFA0C2C525CB6A7600105306 /* NameEmbeddedUniformStructsMetal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NameEmbeddedUniformStructsMetal.cpp; sourceTree = "<group>"; };
     2313                FFA0C2C625CB6A7700105306 /* NameEmbeddedUniformStructsMetal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NameEmbeddedUniformStructsMetal.h; sourceTree = "<group>"; };
    23052314/* End PBXFileReference section */
    23062315
     
    35743583                                FF81FF522581919700894E24 /* EmitMetal.h */,
    35753584                                FF81FF282581919700894E24 /* EnvironmentVariable.h */,
     3585                                FF2D2F5325C8B14A002FB699 /* FixTypeConstructors.cpp */,
     3586                                FF2D2F5225C8B14A002FB699 /* FixTypeConstructors.h */,
    35763587                                FF81FF482581919700894E24 /* HoistConstants.cpp */,
    35773588                                FF81FF4C2581919700894E24 /* HoistConstants.h */,
     
    35883599                                FF81FF212581919700894E24 /* Name.cpp */,
    35893600                                FF81FF242581919700894E24 /* Name.h */,
     3601                                FFA0C2C525CB6A7600105306 /* NameEmbeddedUniformStructsMetal.cpp */,
     3602                                FFA0C2C625CB6A7700105306 /* NameEmbeddedUniformStructsMetal.h */,
    35903603                                FF81FF372581919700894E24 /* Pipeline.cpp */,
    35913604                                FF81FF492581919700894E24 /* Pipeline.h */,
     
    37383751                                31CDFFB6249184A100486F27 /* FindSymbolNode.h in Headers */,
    37393752                                31CDFF682491848C00486F27 /* FixedVector.h in Headers */,
     3753                                FF2D2F5525C8B14A002FB699 /* FixTypeConstructors.h in Headers */,
    37403754                                A3C49C16255DF866005E8DF7 /* FlagSamplersWithTexelFetch.h in Headers */,
    37413755                                31CDFFC0249184A700486F27 /* FlagStd140Structs.h in Headers */,
     
    41704184                                5C55D6FB22826CB300B5BA2C /* FindSymbolNode.h in Headers */,
    41714185                                5C55D7282282747700B5BA2C /* FixedVector.h in Headers */,
     4186                                FF2D2F5425C8B14A002FB699 /* FixTypeConstructors.h in Headers */,
    41724187                                A3C49C12255DF865005E8DF7 /* FlagSamplersWithTexelFetch.h in Headers */,
    41734188                                5C9FFF4F19102A000025B8FA /* FlagStd140Structs.h in Headers */,
     
    42754290                                FF81FF5E2581919700894E24 /* Name.h in Headers */,
    42764291                                5C55D66922826B9F00B5BA2C /* NameEmbeddedUniformStructs.h in Headers */,
     4292                                FFA0C2C825CB6A7700105306 /* NameEmbeddedUniformStructsMetal.h in Headers */,
    42774293                                A303070B2305F6B5002DA972 /* no_destructor.h in Headers */,
    42784294                                5C55D70722826CB300B5BA2C /* NodeSearch.h in Headers */,
     
    47474763                                5C55D6FD22826CB300B5BA2C /* FindMain.cpp in Sources */,
    47484764                                5C55D70322826CB300B5BA2C /* FindSymbolNode.cpp in Sources */,
     4765                                FF2D2F5625C8B14A002FB699 /* FixTypeConstructors.cpp in Sources */,
    47494766                                A3C49C0B255DF85F005E8DF7 /* FlagSamplersWithTexelFetch.cpp in Sources */,
    47504767                                5C9FFF4E19102A000025B8FA /* FlagStd140Structs.cpp in Sources */,
     
    48294846                                FF81FF5B2581919700894E24 /* Name.cpp in Sources */,
    48304847                                5C55D6B622826BC800B5BA2C /* NameEmbeddedUniformStructs.cpp in Sources */,
     4848                                FFA0C2C725CB6A7700105306 /* NameEmbeddedUniformStructsMetal.cpp in Sources */,
    48314849                                315EBDBF1FCE44BF00AC7A89 /* null_functions.cpp in Sources */,
    48324850                                5CCD59692284F7960018F2D8 /* Observer.cpp in Sources */,
  • trunk/Source/ThirdParty/ANGLE/ChangeLog

    r273137 r273188  
     12021-02-19  Kyle Piddington  <kpiddington@apple.com>
     2
     3        Fix a number of functional regressions caused by enabling the Metal ANGLE backend by default.
     4        https://bugs.webkit.org/show_bug.cgi?id=220895
     5        <rdar://problem/73539537>
     6
     7        Reviewed by Kenneth Russell.
     8
     9        Fixed webgl/1.0.3/conformance/context/context-hidden-alpha.html
     10
     11        MTL Translator direct fixes for webgl/1.0.3/conformance/glsl/constructors/glsl-construct-*vec2 tests, Plus fix for GL_VertexIndex
     12
     13        Fix EmitMetal crash for missing function textureRect.
     14
     15        Additional fixes for 73675990, shaders-with-invariance.html, shaders-with-uniform-structs.html, struct-specifiers-in-uniforms.html, framebuffer-object-attachment.html
     16
     17        Fixed clamping of array elements.
     18
     19        * ANGLE.xcodeproj/project.pbxproj:
     20        * src/compiler/translator/TranslatorMetalDirect.cpp:
     21        (sh::TranslatorMetalDirect::translateImpl):
     22        * src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp:
     23        (GenMetalTraverser::emitPostQualifier):
     24        (GenMetalTraverser::visitBinary):
     25        (GenMetalTraverser::BuildFuncToName):
     26        * src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp: Added.
     27        (sh::FixTypeTraverser::FixTypeTraverser):
     28        (sh::FixTypeConstructors):
     29        * src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h: Added.
     30        * src/compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.cpp: Added.
     31        (sh::NameEmbeddedStructUniformsMetal):
     32        * src/compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.h: Added.
     33        * src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp:
     34        (SaturateVectorOf):
     35        * src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp:
     36        (sh::ProgramPrelude::ProgramPrelude):
     37        * src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp:
     38        (sh::Reducer::Reducer):
     39        (sh::ReduceInterfaceBlocks):
     40        * src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h:
     41        * src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp:
     42        * src/libANGLE/renderer/load_functions_table_autogen.cpp:
     43        * src/libANGLE/renderer/metal/ContextMtl.mm:
     44        (rx::ContextMtl::drawElementsImpl):
     45        * src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.h:
     46        * src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.mm:
     47        (rx::IOSurfaceSurfaceMtl::IOSurfaceSurfaceMtl):
     48        (rx::IOSurfaceSurfaceMtl::createBackingTexture):
     49        * src/libANGLE/renderer/metal/RenderBufferMtl.mm:
     50        (rx::RenderbufferMtl::setStorageImpl):
     51        * src/libANGLE/renderer/metal/VertexArrayMtl.h:
     52        * src/libANGLE/renderer/metal/VertexArrayMtl.mm:
     53        (rx::VertexArrayMtl::getIndexBuffer):
     54        (rx::VertexArrayMtl::convertIndexBuffer):
     55        (rx::VertexArrayMtl::streamIndexBufferFromClient):
     56        * src/libANGLE/renderer/metal/mtl_utils.mm:
     57        (rx::mtl::InitializeDepthStencilTextureContentsGPU):
     58        * src/libANGLE/renderer/metal/shaders/blit.metal:
     59        * src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc:
     60
    1612021-02-19  Kyle Piddington  <kpiddington@apple.com>
    262
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.cpp

    r270733 r273188  
    2828#include "compiler/translator/TranslatorMetalDirect/SeparateCompoundExpressions.h"
    2929#include "compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.h"
     30#include "compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h"
    3031#include "compiler/translator/TranslatorMetalDirect/SymbolEnv.h"
    3132#include "compiler/translator/TranslatorMetalDirect/ToposortStructs.h"
     
    3334#include "compiler/translator/TranslatorMetalUtils.h"
    3435#include "compiler/translator/tree_ops/InitializeVariables.h"
    35 #include "compiler/translator/tree_ops/NameEmbeddedUniformStructs.h"
     36#include "compiler/translator/TranslatorMetalDirect/NameEmbeddedUniformStructsMetal.h"
    3637#include "compiler/translator/tree_ops/RemoveAtomicCounterBuiltins.h"
    3738#include "compiler/translator/tree_ops/RemoveInactiveInterfaceVariables.h"
     
    601602    root.insertChildNodes(FindMainIndex(&root),
    602603                          TIntermSequence{new TIntermDeclaration{BuiltInVariable::gl_FragDepth()}});
     604}
     605
     606void AddFragDepthEXTDeclaration(TCompiler &compiler, TIntermBlock &root, TSymbolTable &symbolTable)
     607{   
     608    const TIntermSymbol *glFragDepthExt = FindSymbolNode(&root, ImmutableString("gl_FragDepthEXT"));
     609    ASSERT(glFragDepthExt);
     610
     611    // Replace gl_FragData with our globally defined fragdata.
     612    if (!ReplaceVariable(&compiler, &root, &(glFragDepthExt->variable()), BuiltInVariable::gl_FragDepth()))
     613    {
     614        return;
     615    }
     616    AddFragDepthDeclaration(root, symbolTable);
    603617}
    604618
     
    940954    if (aggregateTypesUsedForUniforms > 0)
    941955    {
    942         if (!NameEmbeddedStructUniforms(this, &root, &symbolTable))
     956        if (!NameEmbeddedStructUniformsMetal(this, &root, &symbolTable))
    943957        {
    944958            return false;
     
    11061120        bool usesFragData  = false;
    11071121        bool usesFragDepth = false;
     1122        bool usesFragDepthEXT = false;
    11081123        for (const ShaderVariable &outputVarying : mOutputVariables)
    11091124        {
     
    11221137                    usesFragDepth = true;
    11231138                }
     1139                else if (outputVarying.name == "gl_FragDepthEXT")
     1140                {
     1141                    usesFragDepthEXT = true;
     1142                }
    11241143            }
    11251144        }
     
    11421161            }
    11431162        }
    1144 
    1145         if (usesFragDepth)
     1163        if(usesFragDepthEXT)
     1164        {
     1165            AddFragDepthEXTDeclaration(*this, root, symbolTable);
     1166        }
     1167        else if (usesFragDepth)
    11461168        {
    11471169            AddFragDepthDeclaration(root, symbolTable);
     
    12211243            DeclareRightBeforeMain(root, kgl_VertexIndexMetal);
    12221244        }
     1245        else if (FindSymbolNode(&root, BuiltInVariable::gl_VertexID()->name()))
     1246        {
     1247            if (!ReplaceVariable(this, &root, BuiltInVariable::gl_VertexID(),
     1248                                 &kgl_VertexIndexMetal))
     1249            {
     1250                return false;
     1251            }
     1252            DeclareRightBeforeMain(root, kgl_VertexIndexMetal);
     1253        }
    12231254
    12241255#if 0
     
    13201351    }
    13211352
    1322     if (!ReduceInterfaceBlocks(*this, root))
     1353    if (!ReduceInterfaceBlocks(*this, root, idGen))
    13231354    {
    13241355        return false;
     
    13781409        return false;
    13791410    }
     1411    if(!FixTypeConstructors(*this, symbolEnv, root))
     1412    {
     1413        return false;
     1414    }
    13801415
    13811416    if (!ToposortStructs(*this, symbolEnv, root, ppc))
     
    13831418        return false;
    13841419    }
    1385 
     1420 
    13861421    if (!EmitMetal(*this, root, idGen, pipelineStructs, invariants, symbolEnv, ppc))
    13871422    {
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp

    r271334 r273188  
    356356            if ((argType0->isVector() && argType1->isVector()) ||
    357357                (argType0->getStruct() && argType1->getStruct()) ||
    358                 (argType0->isArray() && argType1->isArray()))
     358                (argType0->isArray() && argType1->isArray()) ||
     359                (argType0->isMatrix() && argType1->isMatrix()))
    359360
    360361            {
     
    366367        case TOperator::EOpNotEqual:
    367368            if ((argType0->isVector() && argType1->isVector()) ||
    368                 (argType0->isArray() && argType1->isArray()))
     369                (argType0->isArray() && argType1->isArray())||
     370                (argType0->isMatrix() && argType1->isMatrix()))
    369371            {
    370372                return "ANGLE_notEqual";
     
    934936
    935937    const bool isInvariant =
    936         decl.isField() ? mInvariants.contains(decl.field()) : mInvariants.contains(decl.variable());
     938        (decl.isField() ? mInvariants.contains(decl.field()) : mInvariants.contains(decl.variable())) && (qualifier == TQualifier::EvqPosition || qualifier == TQualifier::EvqFragCoord);
    937939
    938940    if (isInvariant)
     
    15481550        case TOperator::EOpIndexIndirect:
    15491551        {
     1552            TType leftType = leftNode.getType();
    15501553            groupedTraverse(leftNode);
    15511554            mOut << "[";
    1552             rightNode.traverse(this);
     1555            {
     1556                mOut << "ANGLE_int_clamp(";
     1557                groupedTraverse(rightNode);
     1558                mOut << ", 0, ";
     1559                if(leftType.isUnsizedArray())
     1560                {
     1561                    groupedTraverse(leftNode);
     1562                    mOut << ".size()";
     1563                }
     1564                else
     1565                {
     1566                    int maxSize;
     1567                    if (leftType.isArray())
     1568                    {
     1569                        maxSize = static_cast<int>(leftType.getOutermostArraySize()) - 1;
     1570                    }
     1571                    else
     1572                    {
     1573                        maxSize = leftType.getNominalSize() - 1;
     1574                    }
     1575                    mOut << maxSize;
     1576                }
     1577                mOut << ")";
     1578
     1579            }
    15531580            mOut << "]";
    15541581        }
     
    18691896    putAngle("texture2DLod");
    18701897    putAngle("texture2DProj");
     1898    putAngle("texture2DRect");
    18711899    putAngle("texture2DProjLod");
     1900    putAngle("texture2DRectProj");
    18721901    putAngle("texture3D");
    18731902    putAngle("texture3DLod");
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp

    r270733 r273188  
    299299
    300300    const bool cond = type.getBasicType() == BT && !type.isArray() &&
    301                       CompareBy(Cmp, type.getNominalSize(), MatchDim);
     301                      CompareBy(Cmp, type.getNominalSize(), MatchDim) && type.getQualifier() != TQualifier::EvqFragDepth;
     302
    302303
    303304    if (cond)
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp

    r270733 r273188  
    3434    {
    3535        ALWAYS_INLINE();
    36 
     36        int_clamp();
    3737        if (ppc.hasStructEq)
    3838        {
     
    110110    void matmulAssign();
    111111    void atan();
     112    void int_clamp();
    112113    void addMatrixScalarAssign();
    113114    void subMatrixScalarAssign();
     
    130131    void notEqualVector();
    131132    void notEqualStruct();
     133    void notEqualMatrix();
    132134    void equalArray();
    133135    void notEqualArray();
     
    169171    void texture2DProj();
    170172    void texture2DProjLod();
     173    void texture2DRect();
     174    void texture2DRectProj();
    171175    void texture3DLod();
    172176    void texture3DProj();
     
    641645                        include_metal_common())
    642646
     647PROGRAM_PRELUDE_DECLARE(int_clamp,
     648                        R"(
     649ANGLE_ALWAYS_INLINE int ANGLE_int_clamp(int value, int minValue, int maxValue)
     650{
     651    return ((value < minValue) ?  minValue : ((value > maxValue) ? maxValue : value));
     652};
     653)")
     654
    643655PROGRAM_PRELUDE_DECLARE(atan,
    644656                        R"(
     
    10551067                        equalVector())
    10561068
     1069
    10571070PROGRAM_PRELUDE_DECLARE(notEqualVector,
    10581071                        R"(
     
    10641077)",
    10651078                        equalVector())
     1079
     1080PROGRAM_PRELUDE_DECLARE(notEqualMatrix,
     1081                        R"(
     1082template <typename T, int C, int R>
     1083ANGLE_ALWAYS_INLINE bool ANGLE_notEqual(metal::matrix<T, C, R> u, metal::matrix<T, C, R> v)
     1084{
     1085    return !ANGLE_equal(u, v);
     1086}
     1087)",
     1088                        equalMatrix())
     1089
    10661090
    10671091PROGRAM_PRELUDE_DECLARE(notEqualStruct,
     
    17531777                        textureEnv())
    17541778
     1779PROGRAM_PRELUDE_DECLARE(texture2DRect,
     1780                        R"(
     1781#define ANGLE_texture2DRect(env, ...) ANGLE_texture2DRect_impl(*env.texture, *env.sampler, __VA_ARGS__)
     1782
     1783template <typename Texture>
     1784ANGLE_ALWAYS_INLINE auto ANGLE_texture2DRect_impl(
     1785    thread Texture &texture,
     1786    thread metal::sampler const &sampler,
     1787    thread metal::float2 const &coord)
     1788{
     1789    return texture.sample(sampler, coord);
     1790}
     1791)",
     1792                        textureEnv())
     1793
     1794
    17551795PROGRAM_PRELUDE_DECLARE(texture2DLod,
    17561796                        R"(
     
    17951835                        textureEnv())
    17961836
     1837PROGRAM_PRELUDE_DECLARE(texture2DRectProj,
     1838                        R"(
     1839#define ANGLE_texture2DRectProj(env, ...) ANGLE_texture2DRectProj_impl(*env.texture, *env.sampler, __VA_ARGS__)
     1840                       
     1841template <typename Texture>
     1842ANGLE_ALWAYS_INLINE auto ANGLE_texture2DRectProj_impl(
     1843    thread Texture &texture,
     1844    thread metal::sampler const &sampler,
     1845    thread metal::float3 const &coord)
     1846{
     1847    return texture.sample(sampler, coord.xy/coord.z);
     1848}
     1849
     1850template <typename Texture>
     1851ANGLE_ALWAYS_INLINE auto ANGLE_texture2DRectProj_impl(
     1852    thread Texture &texture,
     1853    thread metal::sampler const &sampler,
     1854    thread metal::float4 const &coord)
     1855{
     1856    return texture.sample(sampler, coord.xy/coord.w);
     1857}
     1858)",
     1859                        textureEnv())
     1860
    17971861PROGRAM_PRELUDE_DECLARE(texture2DProjLod,
    17981862                        R"(
     
    18201884)",
    18211885                        textureEnv())
     1886
    18221887
    18231888PROGRAM_PRELUDE_DECLARE(texture3DLod,
     
    29953060    putBuiltIn("texture2DLod", EMIT_METHOD(texture2DLod));
    29963061    putBuiltIn("texture2DProj", EMIT_METHOD(texture2DProj));
     3062    putBuiltIn("texture2DRect", EMIT_METHOD(texture2DRect));
     3063    putBuiltIn("texture2DRectProj", EMIT_METHOD(texture2DRectProj));
    29973064    putBuiltIn("texture3DLod", EMIT_METHOD(texture3DLod));
    29983065    putBuiltIn("texture3DProj", EMIT_METHOD(texture3DProj));
     
    33263393                equalArray();
    33273394            }
     3395            if(argType0->isMatrix() && argType1->isMatrix())
     3396            {
     3397                equalMatrix();
     3398            }
    33283399            break;
    33293400
     
    33413412            {
    33423413                notEqualArray();
     3414            }
     3415            if(argType0->isMatrix() && argType1->isMatrix())
     3416            {
     3417                notEqualMatrix();
    33433418            }
    33443419            break;
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.cpp

    r270733 r273188  
    88#include <unordered_map>
    99
     10#include "compiler/translator/TranslatorMetalDirect.h"
    1011#include "compiler/translator/TranslatorMetalDirect/AstHelpers.h"
    1112#include "compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h"
     
    2021{
    2122
     23
    2224class Reducer : public TIntermRebuild
    2325{
    24     std::unordered_map<const TInterfaceBlock *, std::map<ImmutableString, const TVariable *>>
     26    std::unordered_map<const TInterfaceBlock *,  const TVariable *>
    2527        mLiftedMap;
    2628    std::unordered_map<const TVariable *, const TVariable *> mInstanceMap;
     29    IdGen &mIdGen;
    2730
    28   public:
    29     Reducer(TCompiler &compiler) : TIntermRebuild(compiler, true, false) {}
     31public:
     32    Reducer(TCompiler &compiler, IdGen &idGen)
     33        : TIntermRebuild(compiler, true, false),
     34          mIdGen(idGen)
     35    {
     36
     37    }
    3038
    3139    PreResult visitDeclarationPre(TIntermDeclaration &declNode) override
     
    4351                if (symbolType == SymbolType::Empty)
    4452                {
    45                     auto &nameToVar = mLiftedMap[interfaceBlock];
    46                     std::vector<TIntermNode *> replacements;
    47                     for (TField *field : interfaceBlock->fields())
    48                     {
    49                         auto &liftedType = CloneType(*field->type());
    50                         ASSERT(liftedType.getQualifier() == TQualifier::EvqUniform ||
    51                                liftedType.getQualifier() == TQualifier::EvqGlobal);
    52                         liftedType.setQualifier(TQualifier::EvqUniform);
    53                         auto *liftedVar = new TVariable(&mSymbolTable, field->name(), &liftedType,
    54                                                         field->symbolType());
     53                    //Create instance variable
     54                    auto &structure =
     55                        *new TStructure(&mSymbolTable, interfaceBlock->name(),
     56                                        &interfaceBlock->fields(), interfaceBlock->symbolType());
     57                    auto &structVar = CreateStructTypeVariable(mSymbolTable, structure);
    5558
    56                         nameToVar[field->name()] = liftedVar;
     59                    auto &instanceVar =
     60                        CreateInstanceVariable(mSymbolTable, structure, mIdGen.createNewName(interfaceBlock->name()),
     61                                               TQualifier::EvqBuffer, &type.getArraySizes());
     62                    mLiftedMap[interfaceBlock] = &instanceVar;
    5763
    58                         replacements.push_back(
    59                             new TIntermDeclaration{new TIntermSymbol(liftedVar)});
    60                     }
    61                     return PreResult::Multi(std::move(replacements));
     64                    TIntermNode *replacements[] = {
     65                        new TIntermDeclaration{new TIntermSymbol(&structVar)},
     66                        new TIntermDeclaration{new TIntermSymbol(&instanceVar)}};
     67                    return PreResult::Multi(std::begin(replacements), std::end(replacements));
    6268                }
    6369                else
     
    7177                    auto &instanceVar =
    7278                        CreateInstanceVariable(mSymbolTable, structure, Name(var),
    73                                                TQualifier::EvqUniform, &type.getArraySizes());
     79                                               TQualifier::EvqBuffer, &type.getArraySizes());
    7480
    7581                    mInstanceMap[&var] = &instanceVar;
     
    101107            if (it != mLiftedMap.end())
    102108            {
    103                 auto *liftedVar = it->second[var.name()];
    104                 ASSERT(liftedVar);
    105                 return *new TIntermSymbol(liftedVar);
     109                return AccessField(*(it->second), var.name());
    106110            }
    107111        }
     
    114118////////////////////////////////////////////////////////////////////////////////
    115119
    116 bool sh::ReduceInterfaceBlocks(TCompiler &compiler, TIntermBlock &root)
     120bool sh::ReduceInterfaceBlocks(TCompiler &compiler, TIntermBlock &root, IdGen & idGen)
    117121{
    118     Reducer reducer(compiler);
     122    Reducer reducer(compiler, idGen);
    119123    if (!reducer.rebuildRoot(root))
    120124    {
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ReduceInterfaceBlocks.h

    r270733 r273188  
    2929//  struct Foo { int x; }; uniform Foo x;
    3030//
    31 ANGLE_NO_DISCARD bool ReduceInterfaceBlocks(TCompiler &compiler, TIntermBlock &root);
     31ANGLE_NO_DISCARD bool ReduceInterfaceBlocks(TCompiler &compiler, TIntermBlock &root, IdGen & idGen);
    3232
    3333}  // namespace sh
  • trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/SeparateCompoundStructDeclarations.cpp

    r270733 r273188  
    2121{
    2222  public:
     23    std::unordered_map<int, TIntermSymbol *> replacementMap;
    2324    Separator(TSymbolTable &symbolTable) : TIntermTraverser(false, false, true, &symbolTable) {}
    2425
     
    4546
    4647                TIntermSequence replacements;
     48                TIntermSymbol * instanceSymbol = new TIntermSymbol(instanceVar);
    4749                replacements.push_back(new TIntermSymbol(structVar));
    48                 replacements.push_back(new TIntermSymbol(instanceVar));
     50                replacements.push_back(instanceSymbol);
     51                replacementMap[symbolNode->uniqueId().get()] = instanceSymbol;
    4952                mMultiReplacements.push_back(
    5053                    NodeReplaceWithMultipleEntry(declNode, symbolNode, std::move(replacements)));
     
    5356
    5457        return false;
     58    }
     59   
     60    void visitSymbol(TIntermSymbol *decl) override
     61    {
     62        auto symbol = replacementMap.find(decl->uniqueId().get());
     63        if(symbol != replacementMap.end())
     64        {
     65            queueReplacement(symbol->second->deepCopy(), OriginalNode::IS_DROPPED);
     66        }
    5567    }
    5668};
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/load_functions_table_autogen.cpp

    r270733 r273188  
    22// Generated by gen_load_functions_table.py using data from load_functions_data.json
    33//
    4 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
     4// Copyright 2021 The ANGLE Project Authors. All rights reserved.
    55// Use of this source code is governed by a BSD-style license that can be
    66// found in the LICENSE file.
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm

    r270733 r273188  
    659659    size_t convertedOffset             = 0;
    660660    gl::DrawElementsType convertedType = type;
    661     size_t convertedCount              = (size_t)count;
    662 
    663661    ANGLE_TRY(mVertexArray->getIndexBuffer(context, type, mode, count, indices, &idxBuffer,
    664                                            &convertedOffset, &convertedType, &convertedCount));
     662                                           &convertedOffset, &convertedType));
    665663
    666664    ASSERT(idxBuffer);
    667665    ASSERT((convertedOffset % mtl::kIndexBufferOffsetAlignment) == 0);
    668     uint32_t convertedCounti32 = (uint32_t)convertedCount;
     666    uint32_t convertedCounti32 = (uint32_t)count;
    669667    if (mState.isTransformFeedbackActiveUnpaused())
    670668    {
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.h

    r270733 r273188  
    103103    ContextMtl *contextMTL;
    104104    IOSurfaceRef mIOSurface;
     105    GLint mGLInternalFormat;
    105106    mtl::TextureRef mIOSurfaceTexture;
    106107    mtl::TextureRef mIOSurfaceTextureView;
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.mm

    r270733 r273188  
    261261    mFormat         = display->getPixelFormat(kIOSurfaceFormats[mFormatIndex].pixelFormat);
    262262    mInternalFormat = display->getPixelFormat(kIOSurfaceFormats[mFormatIndex].internalPixelFormat);
     263    mGLInternalFormat = kIOSurfaceFormats[mFormatIndex].internalFormat;
    263264}
    264265
     
    431432        mTemporarySurfaceRef->createViewWithDifferentFormat(MTLPixelFormatBGRA8Unorm);
    432433    mRenderTarget.set(mIOSurfaceTexture, mtl::kZeroNativeMipLevel, 0, mInternalFormat);
     434
     435    if (mGLInternalFormat == GL_RGB)
     436    {
     437        // Disable subsequent rendering to alpha channel.
     438        // TODO: Investigate if this allows the higher level alpha masks can
     439        // be disabled once this backend is live.
     440        mIOSurfaceTexture->setColorWritableMask(MTLColorWriteMaskAll & (~MTLColorWriteMaskAlpha));
     441    }
     442
    433443    mIOSurfaceTextureCreated = true;
    434444    return angle::Result::Continue;
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/RenderBufferMtl.mm

    r273137 r273188  
    111111        // we need to initialize their content.
    112112        bool emulatedChannels = mtl::IsFormatEmulated(mFormat);
     113        bool isDepthStencil = mFormat.hasDepthOrStencilBits();
    113114        if (emulatedChannels)
    114115        {
     
    131132            }
    132133        }  // if (emulatedChannels)
     134        if(isDepthStencil)
     135        {
     136            gl::ImageIndex index;
     137
     138            if (actualSamples > 1)
     139            {
     140                index = gl::ImageIndex::Make2DMultisample();
     141            }
     142            else
     143            {
     144                index = gl::ImageIndex::Make2D(0);
     145            }
     146            ANGLE_TRY(mtl::InitializeDepthStencilTextureContentsGPU(context, mTexture, mFormat, mtl::ImageNativeIndex(index, 0)));
     147            if (mImplicitMSTexture)
     148            {
     149                ANGLE_TRY(mtl::InitializeDepthStencilTextureContentsGPU(context, mImplicitMSTexture, mFormat,
     150                                                         mtl::ImageNativeIndex(gl::ImageIndex::Make2DMultisample(), 0)));
     151            }
     152        }
    133153    }
    134154
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h

    r270733 r273188  
    5959                                 mtl::BufferRef *idxBufferOut,
    6060                                 size_t *idxBufferOffsetOut,
    61                                  gl::DrawElementsType *indexTypeOut,
    62                                  size_t *indexBufferCountOut);
     61                                 gl::DrawElementsType *indexTypeOut);
    6362
    6463    // Use to emulate instanced draw for instance <instanceId>.
     
    9089                                     size_t offset,
    9190                                     mtl::BufferRef *idxBufferOut,
    92                                      size_t *idxBufferOffsetOut,
    93                                      size_t *indexBufferCountOut);
     91                                     size_t *idxBufferOffsetOut);
    9492    angle::Result streamIndexBufferFromClient(const gl::Context *glContext,
    9593                                              gl::DrawElementsType indexType,
     
    9896                                              const void *sourcePointer,
    9997                                              mtl::BufferRef *idxBufferOut,
    100                                               size_t *idxBufferOffsetOut,
    101                                               size_t *idxBufferCountOut);
     98                                              size_t *idxBufferOffsetOut);
    10299
    103100    angle::Result convertIndexBufferGPU(const gl::Context *glContext,
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm

    r270733 r273188  
    8383                              bool primitiveRestartEnabled,
    8484                              mtl::BufferRef *bufferOut,
    85                               size_t *bufferOffsetOut,
    86                               size_t *indexCountOut)
     85                              size_t *bufferOffsetOut)
    8786{
    8887    dynamicBuffer->releaseInFlightBuffers(contextMtl);
     
    125124        memcpy(dst, sourcePointer, amount);
    126125    }
    127     *indexCountOut = indexCount;
    128126    ANGLE_TRY(dynamicBuffer->commit(contextMtl));
    129127
     
    704702                                             mtl::BufferRef *idxBufferOut,
    705703                                             size_t *idxBufferOffsetOut,
    706                                              gl::DrawElementsType *indexTypeOut,
    707                                              size_t *indexBufferCountOut)
     704                                             gl::DrawElementsType *indexTypeOut)
    708705{
    709706    const gl::Buffer *glElementArrayBuffer = getState().getElementArrayBuffer();
     
    713710    {
    714711        ANGLE_TRY(streamIndexBufferFromClient(context, type, mode, count, indices, idxBufferOut,
    715                                               idxBufferOffsetOut, indexBufferCountOut));
     712                                              idxBufferOffsetOut));
    716713    }
    717714    else
     
    722719        {
    723720            ANGLE_TRY(convertIndexBuffer(context, type, mode, convertedOffset, idxBufferOut,
    724                                          idxBufferOffsetOut, indexBufferCountOut));
     721                                         idxBufferOffsetOut));
    725722        }
    726723        else
     
    730727            *idxBufferOut        = bufferMtl->getCurrentBuffer();
    731728            *idxBufferOffsetOut  = convertedOffset;
    732             *indexBufferCountOut = count;
     729           
    733730        }
    734731    }
     
    749746                                                 size_t offset,
    750747                                                 mtl::BufferRef *idxBufferOut,
    751                                                  size_t *idxBufferOffsetOut,
    752                                                  size_t *indexBufferCountOut)
     748                                                 size_t *idxBufferOffsetOut)
    753749{
    754750    size_t offsetModulo = offset % mtl::kIndexBufferOffsetAlignment;
     
    786782                                  idxBuffer->getClientShadowCopyData(contextMtl) + offsetModulo,
    787783                                  indexType, indexCount, mode, glState.isPrimitiveRestartEnabled(),
    788                                   &conversion->convertedBuffer, &conversion->convertedOffset,
    789                                   indexBufferCountOut));
     784                                  &conversion->convertedBuffer, &conversion->convertedOffset));
    790785    }
    791786    else
     
    840835                                                          const void *sourcePointer,
    841836                                                          mtl::BufferRef *idxBufferOut,
    842                                                           size_t *idxBufferOffsetOut,
    843                                                           size_t *idxBufferCountOut)
     837                                                          size_t *idxBufferOffsetOut)
    844838{
    845839    ASSERT(getState().getElementArrayBuffer() == nullptr);
     
    849843    ANGLE_TRY(StreamIndexData(contextMtl, &mDynamicIndexData, srcData, indexType, indexCount, mode,
    850844                              context->getState().isPrimitiveRestartEnabled(), idxBufferOut,
    851                               idxBufferOffsetOut, idxBufferCountOut));
     845                              idxBufferOffsetOut));
    852846
    853847    return angle::Result::Continue;
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm

    r270733 r273188  
    306306    ContextMtl *contextMtl           = mtl::GetImpl(context);
    307307    const angle::Format &angleFormat = textureObjFormat.actualAngleFormat();
    308 
     308    RenderTargetMtl rtMTL;
     309
     310    uint32_t layer = index.hasLayer() ? index.getLayerIndex() : 0;
     311    rtMTL.set(texture, level, layer, textureObjFormat);
    309312    mtl::RenderPassDesc rpDesc;
    310 
    311     uint32_t layer = index.hasLayer() ? index.getLayerIndex() : 0;
    312 
     313    rtMTL.toRenderPassAttachmentDesc(&rpDesc.depthAttachment);
    313314    rpDesc.sampleCount = texture->samples();
    314315    if (angleFormat.depthBits)
    315316    {
    316         rpDesc.depthAttachment.renderTarget->texture      = texture;
    317         rpDesc.depthAttachment.renderTarget->level        = level;
    318         rpDesc.depthAttachment.renderTarget->sliceOrDepth = layer;
    319317        rpDesc.depthAttachment.loadAction   = MTLLoadActionClear;
    320318        rpDesc.depthAttachment.clearDepth   = 1.0;
     
    322320    if (angleFormat.stencilBits)
    323321    {
    324         rpDesc.stencilAttachment.renderTarget->texture      = texture;
    325         rpDesc.stencilAttachment.renderTarget->level        = level;
    326         rpDesc.stencilAttachment.renderTarget->sliceOrDepth = layer;
    327322        rpDesc.stencilAttachment.loadAction   = MTLLoadActionClear;
    328323    }
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/blit.metal

    r270733 r273188  
    3333    int srcLevel;  // Source texture level.
    3434    int srcLayer;  // Source texture layer.
    35 
     35    int srcLevel2;  // Source texture level.
     36    int srcLayer2;  // Source texture layer.
    3637    bool dstFlipViewportX;
    3738    bool dstFlipViewportY;
    3839    bool dstLuminance;  // destination texture is luminance. Unused by depth & stencil blitting.
     40    uint8_t padding[9];
    3941};
    4042
  • trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc

    r270351 r273188  
    320320    int srcLevel;
    321321    int srcLayer;
    322 
     322    int srcLevel2;
     323    int srcLayer2;
    323324    bool dstFlipViewportX;
    324325    bool dstFlipViewportY;
Note: See TracChangeset for help on using the changeset viewer.