Edit

kc3-lang/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2015-04-27 11:09:17
    Hash : 3da79b7b
    Message : Reject shaders using attribute aliasing. The current code rejects any shaders that use more than the caps allow, but a bug would crash us before the check. We don't support aliasing in shaders that use a lot of uniforms because this causes problems with the D3D back-end, currently. This changes the crash in the dEQP aliasing tests to a link error. See dEQP-GLES2.functional.attribute_location.bind_aliasing.* BUG=angleproject:901 Change-Id: I6906d3345abe9f89cfa0aa6cec4be26b5b2851d0 Reviewed-on: https://chromium-review.googlesource.com/266928 Tested-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Brandon Jones <bajones@chromium.org>

  • src/libANGLE/renderer/d3d/DynamicHLSL.h
  • //
    // Copyright (c) 2014 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.
    //
    // DynamicHLSL.h: Interface for link and run-time HLSL generation
    //
    
    #ifndef LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
    #define LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
    
    #include "common/angleutils.h"
    #include "libANGLE/Constants.h"
    
    #include "angle_gl.h"
    
    #include <vector>
    #include <map>
    
    namespace sh
    {
    struct Attribute;
    struct ShaderVariable;
    }
    
    namespace gl
    {
    class InfoLog;
    struct VariableLocation;
    struct LinkedVarying;
    struct VertexAttribute;
    struct VertexFormat;
    struct PackedVarying;
    struct Data;
    }
    
    namespace rx
    {
    class RendererD3D;
    class ShaderD3D;
    
    typedef const gl::PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
    
    struct PixelShaderOutputVariable
    {
        GLenum type;
        std::string name;
        std::string source;
        size_t outputIndex;
    };
    
    class DynamicHLSL : angle::NonCopyable
    {
      public:
        explicit DynamicHLSL(RendererD3D *const renderer);
    
        int packVaryings(gl::InfoLog &infoLog, VaryingPacking packing, ShaderD3D *fragmentShader,
                         ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings);
        std::string generateVertexShaderForInputLayout(const std::string &sourceShader,
                                                       const gl::VertexFormat inputLayout[],
                                                       const std::vector<sh::Attribute> &shaderAttributes) const;
        std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables,
                                                          bool usesFragDepth, const std::vector<GLenum> &outputLayout) const;
        bool generateShaderLinkHLSL(const gl::Data &data, gl::InfoLog &infoLog, int registers,
                                    const VaryingPacking packing,
                                    std::string &pixelHLSL, std::string &vertexHLSL,
                                    ShaderD3D *fragmentShader, ShaderD3D *vertexShader,
                                    const std::vector<std::string> &transformFeedbackVaryings,
                                    std::vector<gl::LinkedVarying> *linkedVaryings,
                                    std::map<int, gl::VariableLocation> *programOutputVars,
                                    std::vector<PixelShaderOutputVariable> *outPixelShaderKey,
                                    bool *outUsesFragDepth) const;
    
        std::string generateGeometryShaderHLSL(int registers, ShaderD3D *fragmentShader, ShaderD3D *vertexShader) const;
        void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
    
      private:
        RendererD3D *const mRenderer;
    
        struct SemanticInfo;
    
        std::string getVaryingSemantic(bool pointSize) const;
        SemanticInfo getSemanticInfo(int startRegisters, bool position, bool fragCoord, bool pointCoord,
                                     bool pointSize, bool pixelShader) const;
        std::string generateVaryingLinkHLSL(const SemanticInfo &info, const std::string &varyingHLSL) const;
        std::string generateVaryingHLSL(const ShaderD3D *shader) const;
        void storeUserLinkedVaryings(const ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
        void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector<gl::LinkedVarying> *linkedVaryings) const;
        void defineOutputVariables(ShaderD3D *fragmentShader, std::map<int, gl::VariableLocation> *programOutputVars) const;
        std::string generatePointSpriteHLSL(int registers, ShaderD3D *fragmentShader, ShaderD3D *vertexShader) const;
    
        // Prepend an underscore
        static std::string decorateVariable(const std::string &name);
    
        std::string generateAttributeConversionHLSL(const gl::VertexFormat &vertexFormat, const sh::ShaderVariable &shaderAttrib) const;
    };
    
    }
    
    #endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_