2 // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 // DynamicHLSL.h: Interface for link and run-time HLSL generation
9 #ifndef LIBGLESV2_RENDERER_DYNAMIC_HLSL_H_
10 #define LIBGLESV2_RENDERER_DYNAMIC_HLSL_H_
12 #include "common/angleutils.h"
13 #include "libGLESv2/constants.h"
28 struct ShaderVariable;
34 struct VariableLocation;
36 struct VertexAttribute;
46 typedef const gl::PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
48 struct PixelShaderOutputVariable
59 explicit DynamicHLSL(rx::Renderer *const renderer);
61 int packVaryings(gl::InfoLog &infoLog, VaryingPacking packing, rx::ShaderD3D *fragmentShader,
62 rx::ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings);
63 std::string generateVertexShaderForInputLayout(const std::string &sourceShader, const gl::VertexFormat inputLayout[],
64 const sh::Attribute shaderAttributes[]) const;
65 std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables,
66 bool usesFragDepth, const std::vector<GLenum> &outputLayout) const;
67 bool generateShaderLinkHLSL(gl::InfoLog &infoLog, int registers, const VaryingPacking packing,
68 std::string& pixelHLSL, std::string& vertexHLSL,
69 rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader,
70 const std::vector<std::string>& transformFeedbackVaryings,
71 std::vector<gl::LinkedVarying> *linkedVaryings,
72 std::map<int, gl::VariableLocation> *programOutputVars,
73 std::vector<PixelShaderOutputVariable> *outPixelShaderKey,
74 bool *outUsesFragDepth) const;
76 std::string generateGeometryShaderHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const;
77 void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
80 DISALLOW_COPY_AND_ASSIGN(DynamicHLSL);
82 rx::Renderer *const mRenderer;
86 std::string getVaryingSemantic(bool pointSize) const;
87 SemanticInfo getSemanticInfo(int startRegisters, bool fragCoord, bool pointCoord, bool pointSize,
88 bool pixelShader) const;
89 std::string generateVaryingLinkHLSL(const SemanticInfo &info, const std::string &varyingHLSL) const;
90 std::string generateVaryingHLSL(const ShaderD3D *shader) const;
91 void storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
92 void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector<gl::LinkedVarying> *linkedVaryings) const;
93 void defineOutputVariables(rx::ShaderD3D *fragmentShader, std::map<int, gl::VariableLocation> *programOutputVars) const;
94 std::string generatePointSpriteHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const;
96 // Prepend an underscore
97 static std::string decorateVariable(const std::string &name);
99 std::string generateAttributeConversionHLSL(const gl::VertexFormat &vertexFormat, const sh::ShaderVariable &shaderAttrib) const;
104 #endif // LIBGLESV2_RENDERER_DYNAMIC_HLSL_H_