diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Shader.h')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Shader.h | 216 |
1 files changed, 138 insertions, 78 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Shader.h b/src/3rdparty/angle/src/libANGLE/Shader.h index 997977c87b..4b6be4696d 100644 --- a/src/3rdparty/angle/src/libANGLE/Shader.h +++ b/src/3rdparty/angle/src/libANGLE/Shader.h @@ -12,20 +12,22 @@ #ifndef LIBANGLE_SHADER_H_ #define LIBANGLE_SHADER_H_ -#include <string> #include <list> +#include <memory> +#include <string> #include <vector> #include "angle_gl.h" #include <GLSLANG/ShaderLang.h> +#include "common/Optional.h" #include "common/angleutils.h" -#include "libANGLE/angletypes.h" #include "libANGLE/Debug.h" +#include "libANGLE/angletypes.h" namespace rx { -class ImplFactory; +class GLImplFactory; class ShaderImpl; class ShaderSh; } @@ -33,63 +35,92 @@ class ShaderSh; namespace gl { class Compiler; +class ContextState; struct Limitations; -class ResourceManager; -struct Data; +class ShaderProgramManager; +class Context; -class Shader final : angle::NonCopyable, public LabeledObject +// We defer the compile until link time, or until properties are queried. +enum class CompileStatus +{ + NOT_COMPILED, + COMPILE_REQUESTED, + COMPILED, +}; + +class ShaderState final : angle::NonCopyable { public: - class Data final : angle::NonCopyable + ShaderState(GLenum shaderType); + ~ShaderState(); + + const std::string &getLabel() const { return mLabel; } + + const std::string &getSource() const { return mSource; } + const std::string &getTranslatedSource() const { return mTranslatedSource; } + + GLenum getShaderType() const { return mShaderType; } + int getShaderVersion() const { return mShaderVersion; } + + const std::vector<sh::Varying> &getInputVaryings() const { return mInputVaryings; } + const std::vector<sh::Varying> &getOutputVaryings() const { return mOutputVaryings; } + const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; } + const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; } + const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const { - public: - Data(GLenum shaderType); - ~Data(); - - const std::string &getLabel() const { return mLabel; } - - const std::string &getSource() const { return mSource; } - const std::string &getTranslatedSource() const { return mTranslatedSource; } - - GLenum getShaderType() const { return mShaderType; } - int getShaderVersion() const { return mShaderVersion; } - - const std::vector<sh::Varying> &getVaryings() const { return mVaryings; } - const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; } - const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const - { - return mInterfaceBlocks; - } - const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; } - const std::vector<sh::OutputVariable> &getActiveOutputVariables() const - { - return mActiveOutputVariables; - } - - private: - friend class Shader; - - std::string mLabel; - - GLenum mShaderType; - int mShaderVersion; - std::string mTranslatedSource; - std::string mSource; - - std::vector<sh::Varying> mVaryings; - std::vector<sh::Uniform> mUniforms; - std::vector<sh::InterfaceBlock> mInterfaceBlocks; - std::vector<sh::Attribute> mActiveAttributes; - std::vector<sh::OutputVariable> mActiveOutputVariables; - }; - - Shader(ResourceManager *manager, - rx::ImplFactory *implFactory, + return mShaderStorageBlocks; + } + const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; } + const std::vector<sh::OutputVariable> &getActiveOutputVariables() const + { + return mActiveOutputVariables; + } + + bool compilePending() const { return mCompileStatus == CompileStatus::COMPILE_REQUESTED; } + + private: + friend class Shader; + + std::string mLabel; + + GLenum mShaderType; + int mShaderVersion; + std::string mTranslatedSource; + std::string mSource; + + sh::WorkGroupSize mLocalSize; + + std::vector<sh::Varying> mInputVaryings; + std::vector<sh::Varying> mOutputVaryings; + std::vector<sh::Uniform> mUniforms; + std::vector<sh::InterfaceBlock> mUniformBlocks; + std::vector<sh::InterfaceBlock> mShaderStorageBlocks; + std::vector<sh::Attribute> mActiveAttributes; + std::vector<sh::OutputVariable> mActiveOutputVariables; + + // ANGLE_multiview. + int mNumViews; + + // Geometry Shader. + GLenum mGeometryShaderInputPrimitiveType; + GLenum mGeometryShaderOutputPrimitiveType; + int mGeometryShaderInvocations; + int mGeometryShaderMaxVertices; + + // Indicates if this shader has been successfully compiled + CompileStatus mCompileStatus; +}; + +class Shader final : angle::NonCopyable, public LabeledObject +{ + public: + Shader(ShaderProgramManager *manager, + rx::GLImplFactory *implFactory, const gl::Limitations &rendererLimitations, GLenum type, GLuint handle); - virtual ~Shader(); + void onDestroy(const Context *context); void setLabel(const std::string &label) override; const std::string &getLabel() const override; @@ -97,56 +128,85 @@ class Shader final : angle::NonCopyable, public LabeledObject GLenum getType() const { return mType; } GLuint getHandle() const; - const rx::ShaderImpl *getImplementation() const { return mImplementation; } + rx::ShaderImpl *getImplementation() const { return mImplementation.get(); } - void deleteSource(); void setSource(GLsizei count, const char *const *string, const GLint *length); - int getInfoLogLength() const; - void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; + int getInfoLogLength(const Context *context); + void getInfoLog(const Context *context, GLsizei bufSize, GLsizei *length, char *infoLog); int getSourceLength() const; + const std::string &getSourceString() const { return mState.getSource(); } void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const; - int getTranslatedSourceLength() const; - int getTranslatedSourceWithDebugInfoLength() const; - const std::string &getTranslatedSource() const { return mData.getTranslatedSource(); } - void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const; - void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const; - - void compile(Compiler *compiler); - bool isCompiled() const { return mCompiled; } + int getTranslatedSourceLength(const Context *context); + int getTranslatedSourceWithDebugInfoLength(const Context *context); + const std::string &getTranslatedSource(const Context *context); + void getTranslatedSource(const Context *context, + GLsizei bufSize, + GLsizei *length, + char *buffer); + void getTranslatedSourceWithDebugInfo(const Context *context, + GLsizei bufSize, + GLsizei *length, + char *buffer); + + void compile(const Context *context); + bool isCompiled(const Context *context); void addRef(); - void release(); + void release(const Context *context); unsigned int getRefCount() const; bool isFlaggedForDeletion() const; void flagForDeletion(); - int getShaderVersion() const; + int getShaderVersion(const Context *context); - const std::vector<sh::Varying> &getVaryings() const; - const std::vector<sh::Uniform> &getUniforms() const; - const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const; - const std::vector<sh::Attribute> &getActiveAttributes() const; - const std::vector<sh::OutputVariable> &getActiveOutputVariables() const; + const std::vector<sh::Varying> &getInputVaryings(const Context *context); + const std::vector<sh::Varying> &getOutputVaryings(const Context *context); + const std::vector<sh::Uniform> &getUniforms(const Context *context); + const std::vector<sh::InterfaceBlock> &getUniformBlocks(const Context *context); + const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks(const Context *context); + const std::vector<sh::Attribute> &getActiveAttributes(const Context *context); + const std::vector<sh::OutputVariable> &getActiveOutputVariables(const Context *context); - int getSemanticIndex(const std::string &attributeName) const; + // Returns mapped name of a transform feedback varying. The original name may contain array + // brackets with an index inside, which will get copied to the mapped name. The varying must be + // known to be declared in the shader. + std::string getTransformFeedbackVaryingMappedName(const std::string &tfVaryingName, + const Context *context); - private: - static void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer); + const sh::WorkGroupSize &getWorkGroupSize(const Context *context); + + int getNumViews(const Context *context); - Data mData; - rx::ShaderImpl *mImplementation; + const std::string &getCompilerResourcesString() const; + + private: + ~Shader() override; + static void GetSourceImpl(const std::string &source, + GLsizei bufSize, + GLsizei *length, + char *buffer); + + void resolveCompile(const Context *context); + + ShaderState mState; + std::string mLastCompiledSource; + std::string mLastCompiledSourcePath; + ShCompileOptions mLastCompileOptions; + std::unique_ptr<rx::ShaderImpl> mImplementation; const gl::Limitations &mRendererLimitations; const GLuint mHandle; const GLenum mType; unsigned int mRefCount; // Number of program objects this shader is attached to bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use - bool mCompiled; // Indicates if this shader has been successfully compiled std::string mInfoLog; - ResourceManager *mResourceManager; + // We keep a reference to the translator in order to defer compiles while preserving settings. + BindingPointer<Compiler> mBoundCompiler; + + ShaderProgramManager *mResourceManager; }; bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y); -} +} // namespace gl #endif // LIBANGLE_SHADER_H_ |