1 //
2 // Copyright 2002 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 LIBANGLE_SHADER_H_
13 #define LIBANGLE_SHADER_H_
14 
15 #include <list>
16 #include <memory>
17 #include <string>
18 #include <vector>
19 
20 #include <GLSLANG/ShaderLang.h>
21 #include "angle_gl.h"
22 
23 #include "common/Optional.h"
24 #include "common/angleutils.h"
25 #include "libANGLE/Caps.h"
26 #include "libANGLE/Compiler.h"
27 #include "libANGLE/Debug.h"
28 #include "libANGLE/angletypes.h"
29 
30 namespace rx
31 {
32 class GLImplFactory;
33 class ShaderImpl;
34 class ShaderSh;
35 class WaitableCompileEvent;
36 }  // namespace rx
37 
38 namespace angle
39 {
40 class WaitableEvent;
41 class WorkerThreadPool;
42 }  // namespace angle
43 
44 namespace gl
45 {
46 class CompileTask;
47 class Context;
48 class ShaderProgramManager;
49 class State;
50 
51 // We defer the compile until link time, or until properties are queried.
52 enum class CompileStatus
53 {
54     NOT_COMPILED,
55     COMPILE_REQUESTED,
56     COMPILED,
57 };
58 
59 class ShaderState final : angle::NonCopyable
60 {
61   public:
62     ShaderState(ShaderType shaderType);
63     ~ShaderState();
64 
getLabel()65     const std::string &getLabel() const { return mLabel; }
66 
getSource()67     const std::string &getSource() const { return mSource; }
isCompiledToBinary()68     bool isCompiledToBinary() const { return !mCompiledBinary.empty(); }
getTranslatedSource()69     const std::string &getTranslatedSource() const { return mTranslatedSource; }
getCompiledBinary()70     const sh::BinaryBlob &getCompiledBinary() const { return mCompiledBinary; }
71 
getShaderType()72     ShaderType getShaderType() const { return mShaderType; }
getShaderVersion()73     int getShaderVersion() const { return mShaderVersion; }
74 
getInputVaryings()75     const std::vector<sh::ShaderVariable> &getInputVaryings() const { return mInputVaryings; }
getOutputVaryings()76     const std::vector<sh::ShaderVariable> &getOutputVaryings() const { return mOutputVaryings; }
getUniforms()77     const std::vector<sh::ShaderVariable> &getUniforms() const { return mUniforms; }
getUniformBlocks()78     const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
getShaderStorageBlocks()79     const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const
80     {
81         return mShaderStorageBlocks;
82     }
getActiveAttributes()83     const std::vector<sh::ShaderVariable> &getActiveAttributes() const { return mActiveAttributes; }
getAllAttributes()84     const std::vector<sh::ShaderVariable> &getAllAttributes() const { return mAllAttributes; }
getActiveOutputVariables()85     const std::vector<sh::ShaderVariable> &getActiveOutputVariables() const
86     {
87         return mActiveOutputVariables;
88     }
89 
compilePending()90     bool compilePending() const { return mCompileStatus == CompileStatus::COMPILE_REQUESTED; }
91 
getLocalSize()92     const sh::WorkGroupSize &getLocalSize() const { return mLocalSize; }
93 
getEarlyFragmentTestsOptimization()94     bool getEarlyFragmentTestsOptimization() const { return mEarlyFragmentTestsOptimization; }
getSpecConstUsageBits()95     rx::SpecConstUsageBits getSpecConstUsageBits() const { return mSpecConstUsageBits; }
96 
getNumViews()97     int getNumViews() const { return mNumViews; }
98 
getGeometryShaderInputPrimitiveType()99     Optional<PrimitiveMode> getGeometryShaderInputPrimitiveType() const
100     {
101         return mGeometryShaderInputPrimitiveType;
102     }
103 
getGeometryShaderOutputPrimitiveType()104     Optional<PrimitiveMode> getGeometryShaderOutputPrimitiveType() const
105     {
106         return mGeometryShaderOutputPrimitiveType;
107     }
108 
geoGeometryShaderMaxVertices()109     Optional<GLint> geoGeometryShaderMaxVertices() const { return mGeometryShaderMaxVertices; }
110 
getGeometryShaderInvocations()111     Optional<GLint> getGeometryShaderInvocations() const { return mGeometryShaderInvocations; }
112 
getCompileStatus()113     CompileStatus getCompileStatus() const { return mCompileStatus; }
114 
115   private:
116     friend class Shader;
117 
118     std::string mLabel;
119 
120     ShaderType mShaderType;
121     int mShaderVersion;
122     std::string mTranslatedSource;
123     sh::BinaryBlob mCompiledBinary;
124     std::string mSource;
125 
126     sh::WorkGroupSize mLocalSize;
127 
128     std::vector<sh::ShaderVariable> mInputVaryings;
129     std::vector<sh::ShaderVariable> mOutputVaryings;
130     std::vector<sh::ShaderVariable> mUniforms;
131     std::vector<sh::InterfaceBlock> mUniformBlocks;
132     std::vector<sh::InterfaceBlock> mShaderStorageBlocks;
133     std::vector<sh::ShaderVariable> mAllAttributes;
134     std::vector<sh::ShaderVariable> mActiveAttributes;
135     std::vector<sh::ShaderVariable> mActiveOutputVariables;
136 
137     bool mEarlyFragmentTestsOptimization;
138     rx::SpecConstUsageBits mSpecConstUsageBits;
139 
140     // ANGLE_multiview.
141     int mNumViews;
142 
143     // Geometry Shader.
144     Optional<PrimitiveMode> mGeometryShaderInputPrimitiveType;
145     Optional<PrimitiveMode> mGeometryShaderOutputPrimitiveType;
146     Optional<GLint> mGeometryShaderMaxVertices;
147     int mGeometryShaderInvocations;
148 
149     // Tessellation Shader
150     int mTessControlShaderVertices;
151     GLenum mTessGenMode;
152     GLenum mTessGenSpacing;
153     GLenum mTessGenVertexOrder;
154     GLenum mTessGenPointMode;
155 
156     // Indicates if this shader has been successfully compiled
157     CompileStatus mCompileStatus;
158 };
159 
160 class Shader final : angle::NonCopyable, public LabeledObject
161 {
162   public:
163     Shader(ShaderProgramManager *manager,
164            rx::GLImplFactory *implFactory,
165            const gl::Limitations &rendererLimitations,
166            ShaderType type,
167            ShaderProgramID handle);
168 
169     void onDestroy(const Context *context);
170 
171     void setLabel(const Context *context, const std::string &label) override;
172     const std::string &getLabel() const override;
173 
getType()174     ShaderType getType() const { return mType; }
175     ShaderProgramID getHandle() const;
176 
getImplementation()177     rx::ShaderImpl *getImplementation() const { return mImplementation.get(); }
178 
179     void setSource(GLsizei count, const char *const *string, const GLint *length);
180     int getInfoLogLength();
181     void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
getInfoLogString()182     std::string getInfoLogString() const { return mInfoLog; }
183     int getSourceLength() const;
getSourceString()184     const std::string &getSourceString() const { return mState.getSource(); }
185     void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
186     int getTranslatedSourceLength();
187     int getTranslatedSourceWithDebugInfoLength();
188     const std::string &getTranslatedSource();
189     void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer);
190     void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer);
191     const sh::BinaryBlob &getCompiledBinary();
192 
193     void compile(const Context *context);
194     bool isCompiled();
195     bool isCompleted();
196 
197     void addRef();
198     void release(const Context *context);
199     unsigned int getRefCount() const;
200     bool isFlaggedForDeletion() const;
201     void flagForDeletion();
hasEarlyFragmentTestsOptimization()202     bool hasEarlyFragmentTestsOptimization() const
203     {
204         return mState.mEarlyFragmentTestsOptimization;
205     }
getSpecConstUsageBits()206     rx::SpecConstUsageBits getSpecConstUsageBits() const { return mState.mSpecConstUsageBits; }
207 
208     int getShaderVersion();
209 
210     const std::vector<sh::ShaderVariable> &getInputVaryings();
211     const std::vector<sh::ShaderVariable> &getOutputVaryings();
212     const std::vector<sh::ShaderVariable> &getUniforms();
213     const std::vector<sh::InterfaceBlock> &getUniformBlocks();
214     const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks();
215     const std::vector<sh::ShaderVariable> &getActiveAttributes();
216     const std::vector<sh::ShaderVariable> &getAllAttributes();
217     const std::vector<sh::ShaderVariable> &getActiveOutputVariables();
218 
219     // Returns mapped name of a transform feedback varying. The original name may contain array
220     // brackets with an index inside, which will get copied to the mapped name. The varying must be
221     // known to be declared in the shader.
222     std::string getTransformFeedbackVaryingMappedName(const std::string &tfVaryingName);
223 
224     const sh::WorkGroupSize &getWorkGroupSize();
225 
226     int getNumViews();
227 
228     Optional<PrimitiveMode> getGeometryShaderInputPrimitiveType();
229     Optional<PrimitiveMode> getGeometryShaderOutputPrimitiveType();
230     int getGeometryShaderInvocations();
231     Optional<GLint> getGeometryShaderMaxVertices();
232     int getTessControlShaderVertices();
233     GLenum getTessGenMode();
234     GLenum getTessGenSpacing();
235     GLenum getTessGenVertexOrder();
236     GLenum getTessGenPointMode();
237 
238     const std::string &getCompilerResourcesString() const;
239 
getState()240     const ShaderState &getState() const { return mState; }
241 
getCurrentMaxComputeWorkGroupInvocations()242     GLuint getCurrentMaxComputeWorkGroupInvocations() const
243     {
244         return mCurrentMaxComputeWorkGroupInvocations;
245     }
246 
getMaxComputeSharedMemory()247     unsigned int getMaxComputeSharedMemory() const { return mMaxComputeSharedMemory; }
hasBeenDeleted()248     bool hasBeenDeleted() const { return mDeleteStatus; }
249 
250   private:
251     struct CompilingState;
252 
253     ~Shader() override;
254     static void GetSourceImpl(const std::string &source,
255                               GLsizei bufSize,
256                               GLsizei *length,
257                               char *buffer);
258 
259     void resolveCompile();
260 
261     ShaderState mState;
262     std::unique_ptr<rx::ShaderImpl> mImplementation;
263     const gl::Limitations mRendererLimitations;
264     const ShaderProgramID mHandle;
265     const ShaderType mType;
266     unsigned int mRefCount;  // Number of program objects this shader is attached to
267     bool mDeleteStatus;  // Flag to indicate that the shader can be deleted when no longer in use
268     std::string mInfoLog;
269 
270     // We keep a reference to the translator in order to defer compiles while preserving settings.
271     BindingPointer<Compiler> mBoundCompiler;
272     std::unique_ptr<CompilingState> mCompilingState;
273     std::string mCompilerResourcesString;
274 
275     ShaderProgramManager *mResourceManager;
276 
277     GLuint mCurrentMaxComputeWorkGroupInvocations;
278     unsigned int mMaxComputeSharedMemory;
279 };
280 
281 bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y);
282 
283 const char *GetShaderTypeString(ShaderType type);
284 }  // namespace gl
285 
286 #endif  // LIBANGLE_SHADER_H_
287