// // 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 #include 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& transformFeedbackVaryings); std::string generateVertexShaderForInputLayout(const std::string &sourceShader, const gl::VertexFormat inputLayout[], const sh::Attribute shaderAttributes[]) const; std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector &outputVariables, bool usesFragDepth, const std::vector &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 &transformFeedbackVaryings, std::vector *linkedVaryings, std::map *programOutputVars, std::vector *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 *linkedVaryings) const; void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector *linkedVaryings) const; void defineOutputVariables(ShaderD3D *fragmentShader, std::map *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_