diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Program.h')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Program.h | 336 |
1 files changed, 251 insertions, 85 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Program.h b/src/3rdparty/angle/src/libANGLE/Program.h index 38fc83d29d..f885ad1694 100644 --- a/src/3rdparty/angle/src/libANGLE/Program.h +++ b/src/3rdparty/angle/src/libANGLE/Program.h @@ -10,26 +10,29 @@ #ifndef LIBANGLE_PROGRAM_H_ #define LIBANGLE_PROGRAM_H_ -#include "libANGLE/angletypes.h" -#include "libANGLE/Constants.h" -#include "libANGLE/Error.h" -#include "libANGLE/RefCountObject.h" - -#include "common/angleutils.h" - #include <GLES2/gl2.h> #include <GLSLANG/ShaderLang.h> -#include <vector> -#include <string> #include <set> +#include <sstream> +#include <string> +#include <vector> + +#include "common/angleutils.h" +#include "common/mathutil.h" +#include "common/Optional.h" + +#include "libANGLE/angletypes.h" +#include "libANGLE/Constants.h" +#include "libANGLE/Debug.h" +#include "libANGLE/Error.h" +#include "libANGLE/RefCountObject.h" namespace rx { -class Renderer; -class Renderer; -struct TranslatedAttribute; +class ImplFactory; class ProgramImpl; +struct TranslatedAttribute; } namespace gl @@ -66,14 +69,68 @@ class InfoLog : angle::NonCopyable InfoLog(); ~InfoLog(); - int getLength() const; - void getLog(GLsizei bufSize, GLsizei *length, char *infoLog); + size_t getLength() const; + void getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; void appendSanitized(const char *message); - void append(const char *info, ...); void reset(); + + // This helper class ensures we append a newline after writing a line. + class StreamHelper : angle::NonCopyable + { + public: + StreamHelper(StreamHelper &&rhs) + : mStream(rhs.mStream) + { + rhs.mStream = nullptr; + } + + StreamHelper &operator=(StreamHelper &&rhs) + { + std::swap(mStream, rhs.mStream); + return *this; + } + + ~StreamHelper() + { + // Write newline when destroyed on the stack + if (mStream) + { + (*mStream) << std::endl; + } + } + + template <typename T> + StreamHelper &operator<<(const T &value) + { + (*mStream) << value; + return *this; + } + + private: + friend class InfoLog; + + StreamHelper(std::stringstream *stream) + : mStream(stream) + { + ASSERT(stream); + } + + std::stringstream *mStream; + }; + + template <typename T> + StreamHelper operator<<(const T &value) + { + StreamHelper helper(&mStream); + helper << value; + return helper; + } + + std::string str() const { return mStream.str(); } + private: - char *mInfoLog; + std::stringstream mStream; }; // Struct used for correlating uniforms/elements of uniform arrays to handles @@ -87,32 +144,94 @@ struct VariableLocation unsigned int index; }; -struct LinkedVarying -{ - LinkedVarying(); - LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName, - unsigned int semanticIndex, unsigned int semanticIndexCount); - - // Original GL name - std::string name; - - GLenum type; - GLsizei size; - - // DirectX semantic information - std::string semanticName; - unsigned int semanticIndex; - unsigned int semanticIndexCount; -}; - -class Program : angle::NonCopyable +class Program final : angle::NonCopyable, public LabeledObject { public: - Program(rx::ProgramImpl *impl, ResourceManager *manager, GLuint handle); + class Data final : angle::NonCopyable + { + public: + Data(); + ~Data(); + + const std::string &getLabel(); + + const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; } + const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; } + const std::vector<std::string> &getTransformFeedbackVaryingNames() const + { + return mTransformFeedbackVaryingNames; + } + GLint getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; } + GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const + { + ASSERT(uniformBlockIndex < IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS); + return mUniformBlockBindings[uniformBlockIndex]; + } + const UniformBlockBindingMask &getActiveUniformBlockBindingsMask() const + { + return mActiveUniformBlockBindings; + } + const std::vector<sh::Attribute> &getAttributes() const { return mAttributes; } + const AttributesMask &getActiveAttribLocationsMask() const + { + return mActiveAttribLocationsMask; + } + const std::map<int, VariableLocation> &getOutputVariables() const + { + return mOutputVariables; + } + const std::vector<LinkedUniform> &getUniforms() const { return mUniforms; } + const std::vector<VariableLocation> &getUniformLocations() const + { + return mUniformLocations; + } + const std::vector<UniformBlock> &getUniformBlocks() const { return mUniformBlocks; } + + const LinkedUniform *getUniformByName(const std::string &name) const; + GLint getUniformLocation(const std::string &name) const; + GLuint getUniformIndex(const std::string &name) const; + + private: + friend class Program; + + std::string mLabel; + + Shader *mAttachedFragmentShader; + Shader *mAttachedVertexShader; + + std::vector<std::string> mTransformFeedbackVaryingNames; + std::vector<sh::Varying> mTransformFeedbackVaryingVars; + GLenum mTransformFeedbackBufferMode; + + GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS]; + UniformBlockBindingMask mActiveUniformBlockBindings; + + std::vector<sh::Attribute> mAttributes; + std::bitset<MAX_VERTEX_ATTRIBS> mActiveAttribLocationsMask; + + // Uniforms are sorted in order: + // 1. Non-sampler uniforms + // 2. Sampler uniforms + // 3. Uniform block uniforms + // This makes sampler validation easier, since we don't need a separate list. + std::vector<LinkedUniform> mUniforms; + std::vector<VariableLocation> mUniformLocations; + std::vector<UniformBlock> mUniformBlocks; + + // TODO(jmadill): use unordered/hash map when available + std::map<int, VariableLocation> mOutputVariables; + + bool mBinaryRetrieveableHint; + }; + + Program(rx::ImplFactory *factory, ResourceManager *manager, GLuint handle); ~Program(); GLuint id() const { return mHandle; } + void setLabel(const std::string &label) override; + const std::string &getLabel() const override; + rx::ProgramImpl *getImplementation() { return mProgram; } const rx::ProgramImpl *getImplementation() const { return mProgram; } @@ -122,41 +241,43 @@ class Program : angle::NonCopyable void bindAttributeLocation(GLuint index, const char *name); - Error link(const Data &data); - bool isLinked(); + Error link(const gl::Data &data); + bool isLinked() const; Error loadBinary(GLenum binaryFormat, const void *binary, GLsizei length); Error saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length) const; GLint getBinaryLength() const; + void setBinaryRetrievableHint(bool retrievable); + bool getBinaryRetrievableHint() const; int getInfoLogLength() const; - void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); - void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); + void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; + void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const; - GLuint getAttributeLocation(const std::string &name); - int getSemanticIndex(int attributeIndex); + GLuint getAttributeLocation(const std::string &name) const; + bool isAttribLocationActive(size_t attribLocation) const; void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GLint getActiveAttributeCount(); - GLint getActiveAttributeMaxLength(); - - GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &caps); - GLenum getSamplerTextureType(SamplerType type, unsigned int samplerIndex); - GLint getUsedSamplerRange(SamplerType type); - bool usesPointSize() const; + GLint getActiveAttributeCount() const; + GLint getActiveAttributeMaxLength() const; + const std::vector<sh::Attribute> &getAttributes() const { return mData.mAttributes; } GLint getFragDataLocation(const std::string &name) const; - void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GLint getActiveUniformCount(); - GLint getActiveUniformMaxLength(); + void getActiveUniform(GLuint index, + GLsizei bufsize, + GLsizei *length, + GLint *size, + GLenum *type, + GLchar *name) const; + GLint getActiveUniformCount() const; + GLint getActiveUniformMaxLength() const; GLint getActiveUniformi(GLuint index, GLenum pname) const; bool isValidUniformLocation(GLint location) const; - LinkedUniform *getUniformByLocation(GLint location) const; - LinkedUniform *getUniformByName(const std::string &name) const; + const LinkedUniform &getUniformByLocation(GLint location) const; - GLint getUniformLocation(const std::string &name); - GLuint getUniformIndex(const std::string &name); + GLint getUniformLocation(const std::string &name) const; + GLuint getUniformIndex(const std::string &name) const; void setUniform1fv(GLint location, GLsizei count, const GLfloat *v); void setUniform2fv(GLint location, GLsizei count, const GLfloat *v); void setUniform3fv(GLint location, GLsizei count, const GLfloat *v); @@ -179,24 +300,21 @@ class Program : angle::NonCopyable void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - void getUniformfv(GLint location, GLfloat *params); - void getUniformiv(GLint location, GLint *params); - void getUniformuiv(GLint location, GLuint *params); - - Error applyUniforms(); - Error applyUniformBuffers(const gl::Data &data); + void getUniformfv(GLint location, GLfloat *params) const; + void getUniformiv(GLint location, GLint *params) const; + void getUniformuiv(GLint location, GLuint *params) const; void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const; void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const; - GLuint getActiveUniformBlockCount(); - GLint getActiveUniformBlockMaxLength(); + GLuint getActiveUniformBlockCount() const; + GLint getActiveUniformBlockMaxLength() const; - GLuint getUniformBlockIndex(const std::string &name); + GLuint getUniformBlockIndex(const std::string &name) const; void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding); GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const; - const UniformBlock *getUniformBlockByIndex(GLuint index) const; + const UniformBlock &getUniformBlockByIndex(GLuint index) const; void setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode); void getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const; @@ -204,7 +322,6 @@ class Program : angle::NonCopyable GLsizei getTransformFeedbackVaryingMaxLength() const; GLenum getTransformFeedbackBufferMode() const; - static bool linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader); static bool linkValidateUniforms(InfoLog &infoLog, const std::string &uniformName, const sh::Uniform &vertexUniform, const sh::Uniform &fragmentUniform); static bool linkValidateInterfaceBlockFields(InfoLog &infoLog, const std::string &uniformName, const sh::InterfaceBlockField &vertexUniform, const sh::InterfaceBlockField &fragmentUniform); @@ -217,14 +334,26 @@ class Program : angle::NonCopyable void validate(const Caps &caps); bool validateSamplers(InfoLog *infoLog, const Caps &caps); bool isValidated() const; - void updateSamplerMapping(); + + const AttributesMask &getActiveAttribLocationsMask() const + { + return mData.mActiveAttribLocationsMask; + } private: void unlink(bool destroy = false); void resetUniformBlockBindings(); - bool linkAttributes(InfoLog &infoLog, const AttributeBindings &attributeBindings, const Shader *vertexShader); - bool linkUniformBlocks(InfoLog &infoLog, const Shader &vertexShader, const Shader &fragmentShader, const Caps &caps); + bool linkAttributes(const gl::Data &data, + InfoLog &infoLog, + const AttributeBindings &attributeBindings, + const Shader *vertexShader); + bool linkUniformBlocks(InfoLog &infoLog, const Caps &caps); + static bool linkVaryings(InfoLog &infoLog, + const Shader *vertexShader, + const Shader *fragmentShader); + bool linkUniforms(gl::InfoLog &infoLog, const gl::Caps &caps); + void indexUniforms(); bool areMatchingInterfaceBlocks(gl::InfoLog &infoLog, const sh::InterfaceBlock &vertexInterfaceBlock, const sh::InterfaceBlock &fragmentInterfaceBlock); @@ -235,31 +364,63 @@ class Program : angle::NonCopyable bool validatePrecision); static bool linkValidateVaryings(InfoLog &infoLog, const std::string &varyingName, const sh::Varying &vertexVarying, const sh::Varying &fragmentVarying); - bool gatherTransformFeedbackLinkedVaryings(InfoLog &infoLog, const std::vector<LinkedVarying> &linkedVaryings, - const std::vector<std::string> &transformFeedbackVaryingNames, - GLenum transformFeedbackBufferMode, - std::vector<LinkedVarying> *outTransformFeedbackLinkedVaryings, - const Caps &caps) const; + bool linkValidateTransformFeedback(InfoLog &infoLog, + const std::vector<const sh::Varying *> &linkedVaryings, + const Caps &caps) const; + + void gatherTransformFeedbackVaryings(const std::vector<const sh::Varying *> &varyings); bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps); void defineOutputVariables(Shader *fragmentShader); - rx::ProgramImpl *mProgram; + std::vector<const sh::Varying *> getMergedVaryings() const; + void linkOutputVariables(); - sh::Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS]; + bool flattenUniformsAndCheckCaps(const Caps &caps, InfoLog &infoLog); - std::map<int, VariableLocation> mOutputVariables; + struct VectorAndSamplerCount + { + VectorAndSamplerCount() : vectorCount(0), samplerCount(0) {} + VectorAndSamplerCount(const VectorAndSamplerCount &other) = default; + VectorAndSamplerCount &operator=(const VectorAndSamplerCount &other) = default; - bool mValidated; + VectorAndSamplerCount &operator+=(const VectorAndSamplerCount &other) + { + vectorCount += other.vectorCount; + samplerCount += other.samplerCount; + return *this; + } - Shader *mFragmentShader; - Shader *mVertexShader; + unsigned int vectorCount; + unsigned int samplerCount; + }; - AttributeBindings mAttributeBindings; + VectorAndSamplerCount flattenUniform(const sh::ShaderVariable &uniform, + const std::string &fullName, + std::vector<LinkedUniform> *samplerUniforms); + + void gatherInterfaceBlockInfo(); + template <typename VarT> + void defineUniformBlockMembers(const std::vector<VarT> &fields, + const std::string &prefix, + int blockIndex); + + void defineUniformBlock(const sh::InterfaceBlock &interfaceBlock, GLenum shaderType); - GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS]; + template <typename T> + void setUniformInternal(GLint location, GLsizei count, const T *v); - std::vector<std::string> mTransformFeedbackVaryings; - GLenum mTransformFeedbackBufferMode; + template <size_t cols, size_t rows, typename T> + void setMatrixUniformInternal(GLint location, GLsizei count, GLboolean transpose, const T *v); + + template <typename DestT> + void getUniformInternal(GLint location, DestT *dataOut) const; + + Data mData; + rx::ProgramImpl *mProgram; + + bool mValidated; + + AttributeBindings mAttributeBindings; bool mLinked; bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use @@ -270,6 +431,11 @@ class Program : angle::NonCopyable const GLuint mHandle; InfoLog mInfoLog; + + // Cache for sampler validation + Optional<bool> mCachedValidateSamplersResult; + std::vector<GLenum> mTextureUnitTypesCache; + RangeUI mSamplerUniformRange; }; } |