summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/Shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Shader.h')
-rw-r--r--src/3rdparty/angle/src/libANGLE/Shader.h216
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_