diff options
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Shader.h')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/Shader.h | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Shader.h b/gfx/angle/checkout/src/libANGLE/Shader.h new file mode 100644 index 0000000000..5b1bb6c24b --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/Shader.h @@ -0,0 +1,286 @@ +// +// Copyright 2002 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// Shader.h: Defines the abstract gl::Shader class and its concrete derived +// classes VertexShader and FragmentShader. Implements GL shader objects and +// related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section +// 3.8 page 84. + +#ifndef LIBANGLE_SHADER_H_ +#define LIBANGLE_SHADER_H_ + +#include <list> +#include <memory> +#include <string> +#include <vector> + +#include <GLSLANG/ShaderLang.h> +#include "angle_gl.h" + +#include "common/Optional.h" +#include "common/angleutils.h" +#include "libANGLE/Caps.h" +#include "libANGLE/Compiler.h" +#include "libANGLE/Debug.h" +#include "libANGLE/angletypes.h" + +namespace rx +{ +class GLImplFactory; +class ShaderImpl; +class ShaderSh; +class WaitableCompileEvent; +} // namespace rx + +namespace angle +{ +class WaitableEvent; +class WorkerThreadPool; +} // namespace angle + +namespace gl +{ +class CompileTask; +class Context; +class ShaderProgramManager; +class State; + +// 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: + ShaderState(ShaderType shaderType); + ~ShaderState(); + + const std::string &getLabel() const { return mLabel; } + + const std::string &getSource() const { return mSource; } + bool isCompiledToBinary() const { return !mCompiledBinary.empty(); } + const std::string &getTranslatedSource() const { return mTranslatedSource; } + const sh::BinaryBlob &getCompiledBinary() const { return mCompiledBinary; } + + ShaderType getShaderType() const { return mShaderType; } + int getShaderVersion() const { return mShaderVersion; } + + const std::vector<sh::ShaderVariable> &getInputVaryings() const { return mInputVaryings; } + const std::vector<sh::ShaderVariable> &getOutputVaryings() const { return mOutputVaryings; } + const std::vector<sh::ShaderVariable> &getUniforms() const { return mUniforms; } + const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; } + const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const + { + return mShaderStorageBlocks; + } + const std::vector<sh::ShaderVariable> &getActiveAttributes() const { return mActiveAttributes; } + const std::vector<sh::ShaderVariable> &getAllAttributes() const { return mAllAttributes; } + const std::vector<sh::ShaderVariable> &getActiveOutputVariables() const + { + return mActiveOutputVariables; + } + + bool compilePending() const { return mCompileStatus == CompileStatus::COMPILE_REQUESTED; } + + const sh::WorkGroupSize &getLocalSize() const { return mLocalSize; } + + bool getEarlyFragmentTestsOptimization() const { return mEarlyFragmentTestsOptimization; } + rx::SpecConstUsageBits getSpecConstUsageBits() const { return mSpecConstUsageBits; } + + int getNumViews() const { return mNumViews; } + + Optional<PrimitiveMode> getGeometryShaderInputPrimitiveType() const + { + return mGeometryShaderInputPrimitiveType; + } + + Optional<PrimitiveMode> getGeometryShaderOutputPrimitiveType() const + { + return mGeometryShaderOutputPrimitiveType; + } + + Optional<GLint> geoGeometryShaderMaxVertices() const { return mGeometryShaderMaxVertices; } + + Optional<GLint> getGeometryShaderInvocations() const { return mGeometryShaderInvocations; } + + CompileStatus getCompileStatus() const { return mCompileStatus; } + + private: + friend class Shader; + + std::string mLabel; + + ShaderType mShaderType; + int mShaderVersion; + std::string mTranslatedSource; + sh::BinaryBlob mCompiledBinary; + std::string mSource; + + sh::WorkGroupSize mLocalSize; + + std::vector<sh::ShaderVariable> mInputVaryings; + std::vector<sh::ShaderVariable> mOutputVaryings; + std::vector<sh::ShaderVariable> mUniforms; + std::vector<sh::InterfaceBlock> mUniformBlocks; + std::vector<sh::InterfaceBlock> mShaderStorageBlocks; + std::vector<sh::ShaderVariable> mAllAttributes; + std::vector<sh::ShaderVariable> mActiveAttributes; + std::vector<sh::ShaderVariable> mActiveOutputVariables; + + bool mEarlyFragmentTestsOptimization; + rx::SpecConstUsageBits mSpecConstUsageBits; + + // ANGLE_multiview. + int mNumViews; + + // Geometry Shader. + Optional<PrimitiveMode> mGeometryShaderInputPrimitiveType; + Optional<PrimitiveMode> mGeometryShaderOutputPrimitiveType; + Optional<GLint> mGeometryShaderMaxVertices; + int mGeometryShaderInvocations; + + // Tessellation Shader + int mTessControlShaderVertices; + GLenum mTessGenMode; + GLenum mTessGenSpacing; + GLenum mTessGenVertexOrder; + GLenum mTessGenPointMode; + + // 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, + ShaderType type, + ShaderProgramID handle); + + void onDestroy(const Context *context); + + void setLabel(const Context *context, const std::string &label) override; + const std::string &getLabel() const override; + + ShaderType getType() const { return mType; } + ShaderProgramID getHandle() const; + + rx::ShaderImpl *getImplementation() const { return mImplementation.get(); } + + void setSource(GLsizei count, const char *const *string, const GLint *length); + int getInfoLogLength(); + void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); + std::string getInfoLogString() const { return mInfoLog; } + int getSourceLength() const; + const std::string &getSourceString() const { return mState.getSource(); } + void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const; + int getTranslatedSourceLength(); + int getTranslatedSourceWithDebugInfoLength(); + const std::string &getTranslatedSource(); + void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer); + void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer); + const sh::BinaryBlob &getCompiledBinary(); + + void compile(const Context *context); + bool isCompiled(); + bool isCompleted(); + + void addRef(); + void release(const Context *context); + unsigned int getRefCount() const; + bool isFlaggedForDeletion() const; + void flagForDeletion(); + bool hasEarlyFragmentTestsOptimization() const + { + return mState.mEarlyFragmentTestsOptimization; + } + rx::SpecConstUsageBits getSpecConstUsageBits() const { return mState.mSpecConstUsageBits; } + + int getShaderVersion(); + + const std::vector<sh::ShaderVariable> &getInputVaryings(); + const std::vector<sh::ShaderVariable> &getOutputVaryings(); + const std::vector<sh::ShaderVariable> &getUniforms(); + const std::vector<sh::InterfaceBlock> &getUniformBlocks(); + const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks(); + const std::vector<sh::ShaderVariable> &getActiveAttributes(); + const std::vector<sh::ShaderVariable> &getAllAttributes(); + const std::vector<sh::ShaderVariable> &getActiveOutputVariables(); + + // 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 sh::WorkGroupSize &getWorkGroupSize(); + + int getNumViews(); + + Optional<PrimitiveMode> getGeometryShaderInputPrimitiveType(); + Optional<PrimitiveMode> getGeometryShaderOutputPrimitiveType(); + int getGeometryShaderInvocations(); + Optional<GLint> getGeometryShaderMaxVertices(); + int getTessControlShaderVertices(); + GLenum getTessGenMode(); + GLenum getTessGenSpacing(); + GLenum getTessGenVertexOrder(); + GLenum getTessGenPointMode(); + + const std::string &getCompilerResourcesString() const; + + const ShaderState &getState() const { return mState; } + + GLuint getCurrentMaxComputeWorkGroupInvocations() const + { + return mCurrentMaxComputeWorkGroupInvocations; + } + + unsigned int getMaxComputeSharedMemory() const { return mMaxComputeSharedMemory; } + bool hasBeenDeleted() const { return mDeleteStatus; } + + private: + struct CompilingState; + + ~Shader() override; + static void GetSourceImpl(const std::string &source, + GLsizei bufSize, + GLsizei *length, + char *buffer); + + void resolveCompile(); + + ShaderState mState; + std::unique_ptr<rx::ShaderImpl> mImplementation; + const gl::Limitations mRendererLimitations; + const ShaderProgramID mHandle; + const ShaderType 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 + std::string mInfoLog; + + // We keep a reference to the translator in order to defer compiles while preserving settings. + BindingPointer<Compiler> mBoundCompiler; + std::unique_ptr<CompilingState> mCompilingState; + std::string mCompilerResourcesString; + + ShaderProgramManager *mResourceManager; + + GLuint mCurrentMaxComputeWorkGroupInvocations; + unsigned int mMaxComputeSharedMemory; +}; + +bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y); + +const char *GetShaderTypeString(ShaderType type); +} // namespace gl + +#endif // LIBANGLE_SHADER_H_ |