1 // 2 // Copyright (c) 2002-2013 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 7 // Shader.h: Defines the abstract gl::Shader class and its concrete derived 8 // classes VertexShader and FragmentShader. Implements GL shader objects and 9 // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 10 // 3.8 page 84. 11 12 #ifndef LIBGLESV2_SHADER_H_ 13 #define LIBGLESV2_SHADER_H_ 14 15 #include <GLES3/gl3.h> 16 #include <GLES2/gl2.h> 17 #include <string> 18 #include <list> 19 #include <vector> 20 21 #include "common/shadervars.h" 22 #include "common/angleutils.h" 23 #include "libGLESv2/angletypes.h" 24 #include "GLSLANG/ShaderLang.h" 25 26 namespace rx 27 { 28 class Renderer; 29 } 30 31 namespace gl 32 { 33 class ResourceManager; 34 35 struct PackedVarying : public Varying 36 { 37 unsigned int registerIndex; // Assigned during link 38 39 PackedVarying(const Varying &varying) 40 : Varying(varying), 41 registerIndex(GL_INVALID_INDEX) 42 {} 43 44 bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; } 45 46 void resetRegisterAssignment() 47 { 48 registerIndex = GL_INVALID_INDEX; 49 } 50 }; 51 52 class Shader 53 { 54 friend class DynamicHLSL; 55 56 public: 57 Shader(ResourceManager *manager, const rx::Renderer *renderer, GLuint handle); 58 59 virtual ~Shader(); 60 61 virtual GLenum getType() = 0; 62 GLuint getHandle() const; 63 64 void deleteSource(); 65 void setSource(GLsizei count, const char *const *string, const GLint *length); 66 int getInfoLogLength() const; 67 void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; 68 int getSourceLength() const; 69 void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const; 70 int getTranslatedSourceLength() const; 71 void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const; 72 const std::vector<Uniform> &getUniforms() const; 73 const std::vector<InterfaceBlock> &getInterfaceBlocks() const; 74 std::vector<PackedVarying> &getVaryings(); 75 76 virtual void compile() = 0; 77 virtual void uncompile(); 78 bool isCompiled() const; 79 const std::string &getHLSL() const; 80 81 void addRef(); 82 void release(); 83 unsigned int getRefCount() const; 84 bool isFlaggedForDeletion() const; 85 void flagForDeletion(); 86 int getShaderVersion() const; 87 void resetVaryingsRegisterAssignment(); 88 89 static void releaseCompiler(); 90 static ShShaderOutput getCompilerOutputType(GLenum shader); 91 92 bool usesDepthRange() const { return mUsesDepthRange; } 93 bool usesPointSize() const { return mUsesPointSize; } 94 rx::D3DWorkaroundType getD3DWorkarounds() const; 95 96 protected: 97 void parseVaryings(void *compiler); 98 99 void compileToHLSL(void *compiler); 100 101 void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer) const; 102 103 static bool compareVarying(const PackedVarying &x, const PackedVarying &y); 104 105 const rx::Renderer *const mRenderer; 106 107 std::vector<PackedVarying> mVaryings; 108 109 bool mUsesMultipleRenderTargets; 110 bool mUsesFragColor; 111 bool mUsesFragData; 112 bool mUsesFragCoord; 113 bool mUsesFrontFacing; 114 bool mUsesPointSize; 115 bool mUsesPointCoord; 116 bool mUsesDepthRange; 117 bool mUsesFragDepth; 118 int mShaderVersion; 119 bool mUsesDiscardRewriting; 120 bool mUsesNestedBreak; 121 122 static void *mFragmentCompiler; 123 static void *mVertexCompiler; 124 125 private: 126 DISALLOW_COPY_AND_ASSIGN(Shader); 127 128 void initializeCompiler(); 129 130 const GLuint mHandle; 131 unsigned int mRefCount; // Number of program objects this shader is attached to 132 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use 133 134 std::string mSource; 135 std::string mHlsl; 136 std::string mInfoLog; 137 std::vector<Uniform> mActiveUniforms; 138 std::vector<InterfaceBlock> mActiveInterfaceBlocks; 139 140 ResourceManager *mResourceManager; 141 }; 142 143 class VertexShader : public Shader 144 { 145 friend class DynamicHLSL; 146 147 public: 148 VertexShader(ResourceManager *manager, const rx::Renderer *renderer, GLuint handle); 149 150 ~VertexShader(); 151 152 virtual GLenum getType(); 153 virtual void compile(); 154 virtual void uncompile(); 155 int getSemanticIndex(const std::string &attributeName); 156 157 const std::vector<Attribute> &activeAttributes() const { return mActiveAttributes; } 158 159 private: 160 DISALLOW_COPY_AND_ASSIGN(VertexShader); 161 162 void parseAttributes(); 163 164 std::vector<Attribute> mActiveAttributes; 165 }; 166 167 class FragmentShader : public Shader 168 { 169 public: 170 FragmentShader(ResourceManager *manager,const rx::Renderer *renderer, GLuint handle); 171 172 ~FragmentShader(); 173 174 virtual GLenum getType(); 175 virtual void compile(); 176 virtual void uncompile(); 177 const std::vector<Attribute> &getOutputVariables() const; 178 179 private: 180 DISALLOW_COPY_AND_ASSIGN(FragmentShader); 181 182 std::vector<Attribute> mActiveOutputVariables; 183 }; 184 } 185 186 #endif // LIBGLESV2_SHADER_H_ 187