Edit

kc3-lang/angle/src/compiler/translator/TranslatorMetal.h

Branch :

  • Show log

    Commit

  • Author : Kenneth Russell
    Date : 2021-07-07 12:31:57
    Hash : b3cbfd55
    Message : Fix multiple end2end crashes in direct-to-MSL compiler. This set of changes: - Adds a single place (CompilerMtl::useDirectToMSLCompiler) where the direct-to-MSL compiler can be enabled, still at compile time rather than run time. It is still disabled by default. - Initializes MTLWaitableCompileEventImpl::mShader, without which all shader compiles crash. - Fixes a mismatch of the ANGLERasterizerDisabled variable name in the generated MSL. - Removes the transform feedback bindings as an argument to the vertex shader's main0(). Transform feedback support needs to be reimplemented in this compiler backend. - Added an option to the DriverUniform class to emit as either an interface block or a struct. The direct-to-MSL backend assumes it is a struct. - Disable variable reference validation when referencing either sample mask or rasterizer discard functionality in the shader. - Disable struct usage validation when inserting references to ANGLE_TextureEnv. This occurs during pipeline rewriting and it's infeasible to disable it at that point, so disable it during pipeline rewriting - which means it's disabled for all shaders. - For angle_end2end_tests, disable the file API hooking which disables the Metal shader cache. This speeds up the tests significantly - by roughly a factor of 5. With these changes, several hundred angle_end2end_tests run without any assertion failures, though still with many test failures. The next crash is in: GLSLTest.NamelessScopedStructs/ES2_Metal and will likely require a larger bug fix, or more changes to be upstreamed from WebKit's repository. Bug: angleproject:5505 Change-Id: Ia1ea9a13867f00035d4aeccf907fd032255588e3 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3010486 Commit-Queue: Kenneth Russell <kbr@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>

  • src/compiler/translator/TranslatorMetal.h
  • //
    // Copyright 2019 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // TranslatorMetal:
    //   A GLSL-based translator that outputs shaders that fit GL_KHR_vulkan_glsl.
    //   It takes into account some considerations for Metal backend also.
    //   The shaders are then fed into glslang to spit out SPIR-V.
    //   See: https://www.khronos.org/registry/vulkan/specs/misc/GL_KHR_vulkan_glsl.txt
    //
    //   The SPIR-V will then be translated to Metal Shading Language later in Metal backend.
    //
    
    #ifndef LIBANGLE_RENDERER_METAL_TRANSLATORMETAL_H_
    #define LIBANGLE_RENDERER_METAL_TRANSLATORMETAL_H_
    
    #include "compiler/translator/TranslatorVulkan.h"
    #include "compiler/translator/tree_util/DriverUniform.h"
    #include "compiler/translator/tree_util/SpecializationConstant.h"
    
    namespace sh
    {
    
    // TODO: http://anglebug.com/5339 Implement it using actual specialization constant. For now we are
    // redirecting to driver uniforms
    class SpecConstMetal : public SpecConst
    {
      public:
        SpecConstMetal(TSymbolTable *symbolTable, ShCompileOptions compileOptions, GLenum shaderType)
            : SpecConst(symbolTable, compileOptions, shaderType)
        {}
        ~SpecConstMetal() override {}
    
      private:
    };
    
    class DriverUniformMetal : public DriverUniform
    {
      public:
        DriverUniformMetal() : DriverUniform(DriverUniformMode::InterfaceBlock) {}
        ~DriverUniformMetal() override {}
    
        TIntermBinary *getHalfRenderAreaRef() const override;
        TIntermBinary *getFlipXYRef() const override;
        TIntermBinary *getNegFlipXYRef() const override;
        TIntermSwizzle *getNegFlipYRef() const override;
        TIntermBinary *getCoverageMaskFieldRef() const;
    
      protected:
        TFieldList *createUniformFields(TSymbolTable *symbolTable) override;
    };
    
    class TranslatorMetal : public TranslatorVulkan
    {
      public:
        TranslatorMetal(sh::GLenum type, ShShaderSpec spec);
    
      protected:
        ANGLE_NO_DISCARD bool translate(TIntermBlock *root,
                                        ShCompileOptions compileOptions,
                                        PerformanceDiagnostics *perfDiagnostics) override;
    
        ANGLE_NO_DISCARD bool transformDepthBeforeCorrection(
            TIntermBlock *root,
            const DriverUniform *driverUniforms) override;
    
        ANGLE_NO_DISCARD bool insertSampleMaskWritingLogic(TInfoSinkBase &sink,
                                                           TIntermBlock *root,
                                                           const DriverUniformMetal *driverUniforms);
        ANGLE_NO_DISCARD bool insertRasterizerDiscardLogic(TInfoSinkBase &sink, TIntermBlock *root);
    };
    
    }  // namespace sh
    
    #endif /* LIBANGLE_RENDERER_METAL_TRANSLATORMETAL_H_ */