1 // 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. 5 // 6 // DynamicHLSL.h: Interface for link and run-time HLSL generation 7 // 8 9 #ifndef LIBGLESV2_DYNAMIC_HLSL_H_ 10 #define LIBGLESV2_DYNAMIC_HLSL_H_ 11 12 #include "common/angleutils.h" 13 #include "libGLESv2/constants.h" 14 15 namespace rx 16 { 17 class Renderer; 18 } 19 20 namespace gl 21 { 22 23 class InfoLog; 24 class FragmentShader; 25 class VertexShader; 26 struct VariableLocation; 27 struct LinkedVarying; 28 class VertexAttribute; 29 struct VertexFormat; 30 struct ShaderVariable; 31 struct Varying; 32 struct Attribute; 33 struct PackedVarying; 34 35 typedef const PackedVarying *VaryingPacking[IMPLEMENTATION_MAX_VARYING_VECTORS][4]; 36 37 class DynamicHLSL 38 { 39 public: 40 explicit DynamicHLSL(rx::Renderer *const renderer); 41 42 int packVaryings(InfoLog &infoLog, VaryingPacking packing, FragmentShader *fragmentShader, 43 VertexShader *vertexShader, const std::vector<std::string>& transformFeedbackVaryings); 44 std::string generateInputLayoutHLSL(const VertexFormat inputLayout[], const Attribute shaderAttributes[]) const; 45 bool generateShaderLinkHLSL(InfoLog &infoLog, int registers, const VaryingPacking packing, 46 std::string& pixelHLSL, std::string& vertexHLSL, 47 FragmentShader *fragmentShader, VertexShader *vertexShader, 48 const std::vector<std::string>& transformFeedbackVaryings, 49 std::vector<LinkedVarying> *linkedVaryings, 50 std::map<int, VariableLocation> *programOutputVars) const; 51 52 std::string generateGeometryShaderHLSL(int registers, FragmentShader *fragmentShader, VertexShader *vertexShader) const; 53 void getInputLayoutSignature(const VertexFormat inputLayout[], GLenum signature[]) const; 54 55 static const std::string VERTEX_ATTRIBUTE_STUB_STRING; 56 57 private: 58 DISALLOW_COPY_AND_ASSIGN(DynamicHLSL); 59 60 rx::Renderer *const mRenderer; 61 62 std::string generateVaryingHLSL(VertexShader *shader, const std::string &varyingSemantic, 63 std::vector<LinkedVarying> *linkedVaryings) const; 64 void defineOutputVariables(FragmentShader *fragmentShader, std::map<int, VariableLocation> *programOutputVars) const; 65 std::string generatePointSpriteHLSL(int registers, FragmentShader *fragmentShader, VertexShader *vertexShader) const; 66 67 // Prepend an underscore 68 static std::string decorateVariable(const std::string &name); 69 70 std::string generateAttributeConversionHLSL(const VertexFormat &vertexFormat, const ShaderVariable &shaderAttrib) const; 71 }; 72 73 // Utility method shared between ProgramBinary and DynamicHLSL 74 std::string ArrayString(unsigned int i); 75 76 } 77 78 #endif // LIBGLESV2_DYNAMIC_HLSL_H_ 79