1 | // Copyright 2016 The SwiftShader Authors. All Rights Reserved. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | // Shader.h: Defines the abstract Shader class and its concrete derived |
16 | // classes VertexShader and FragmentShader. Implements GL shader objects and |
17 | // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section |
18 | // 3.8 page 84. |
19 | |
20 | #ifndef LIBGLESV2_SHADER_H_ |
21 | #define LIBGLESV2_SHADER_H_ |
22 | |
23 | #include "ResourceManager.h" |
24 | |
25 | #include "compiler/TranslatorASM.h" |
26 | |
27 | #include <GLES2/gl2.h> |
28 | |
29 | #include <string> |
30 | #include <list> |
31 | #include <mutex> |
32 | #include <vector> |
33 | |
34 | namespace glsl |
35 | { |
36 | class OutputASM; |
37 | } |
38 | |
39 | namespace es2 |
40 | { |
41 | |
42 | class Shader : public glsl::Shader |
43 | { |
44 | friend class Program; |
45 | |
46 | public: |
47 | Shader(ResourceManager *manager, GLuint handle); |
48 | |
49 | virtual ~Shader(); |
50 | |
51 | virtual GLenum getType() const = 0; |
52 | GLuint getName() const; |
53 | |
54 | void deleteSource(); |
55 | void setSource(GLsizei count, const char *const *string, const GLint *length); |
56 | size_t getInfoLogLength() const; |
57 | void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); |
58 | size_t getSourceLength() const; |
59 | void getSource(GLsizei bufSize, GLsizei *length, char *source); |
60 | |
61 | void compile(); |
62 | bool isCompiled(); |
63 | |
64 | void addRef(); |
65 | void release(); |
66 | unsigned int getRefCount() const; |
67 | bool isFlaggedForDeletion() const; |
68 | void flagForDeletion(); |
69 | |
70 | static void releaseCompiler(); |
71 | |
72 | protected: |
73 | static std::mutex mutex; |
74 | static bool compilerInitialized; |
75 | |
76 | TranslatorASM *createCompiler(GLenum shaderType); |
77 | void clear(); |
78 | |
79 | static bool compareVarying(const glsl::Varying &x, const glsl::Varying &y); |
80 | |
81 | char *mSource; |
82 | std::string infoLog; |
83 | |
84 | private: |
85 | virtual void createShader() = 0; |
86 | virtual void deleteShader() = 0; |
87 | |
88 | const GLuint mHandle; |
89 | unsigned int mRefCount; // Number of program objects this shader is attached to |
90 | bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use |
91 | |
92 | ResourceManager *mResourceManager; |
93 | }; |
94 | |
95 | class VertexShader : public Shader |
96 | { |
97 | friend class Program; |
98 | |
99 | public: |
100 | VertexShader(ResourceManager *manager, GLuint handle); |
101 | |
102 | ~VertexShader(); |
103 | |
104 | virtual GLenum getType() const; |
105 | int getSemanticIndex(const std::string &attributeName) const; |
106 | |
107 | virtual sw::Shader *getShader() const; |
108 | virtual sw::VertexShader *getVertexShader() const; |
109 | |
110 | private: |
111 | virtual void createShader(); |
112 | virtual void deleteShader(); |
113 | |
114 | sw::VertexShader *vertexShader; |
115 | }; |
116 | |
117 | class FragmentShader : public Shader |
118 | { |
119 | public: |
120 | FragmentShader(ResourceManager *manager, GLuint handle); |
121 | |
122 | ~FragmentShader(); |
123 | |
124 | virtual GLenum getType() const; |
125 | |
126 | virtual sw::Shader *getShader() const; |
127 | virtual sw::PixelShader *getPixelShader() const; |
128 | |
129 | private: |
130 | virtual void createShader(); |
131 | virtual void deleteShader(); |
132 | |
133 | sw::PixelShader *pixelShader; |
134 | }; |
135 | } |
136 | |
137 | #endif // LIBGLESV2_SHADER_H_ |
138 | |