diff options
Diffstat (limited to 'src/3rdparty/angle/src/libGLESv2/Uniform.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libGLESv2/Uniform.cpp | 91 |
1 files changed, 77 insertions, 14 deletions
diff --git a/src/3rdparty/angle/src/libGLESv2/Uniform.cpp b/src/3rdparty/angle/src/libGLESv2/Uniform.cpp index 5424e271b5..cddc7ec7d0 100644 --- a/src/3rdparty/angle/src/libGLESv2/Uniform.cpp +++ b/src/3rdparty/angle/src/libGLESv2/Uniform.cpp @@ -7,37 +7,100 @@ #include "libGLESv2/Uniform.h" -#include "libGLESv2/utilities.h" +#include "common/utilities.h" namespace gl { -Uniform::Uniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize) - : type(type), precision(precision), name(name), arraySize(arraySize) +LinkedUniform::LinkedUniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, + const int blockIndex, const sh::BlockMemberInfo &blockInfo) + : type(type), + precision(precision), + name(name), + arraySize(arraySize), + blockIndex(blockIndex), + blockInfo(blockInfo), + data(NULL), + dirty(true), + psRegisterIndex(GL_INVALID_INDEX), + vsRegisterIndex(GL_INVALID_INDEX), + registerCount(0), + registerElement(0) { - int bytes = gl::UniformInternalSize(type) * elementCount(); - data = new unsigned char[bytes]; - memset(data, 0, bytes); - dirty = true; - - psRegisterIndex = -1; - vsRegisterIndex = -1; - registerCount = VariableRowCount(type) * elementCount(); + // We use data storage for default block uniforms to cache values that are sent to D3D during rendering + // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only) + if (isInDefaultBlock()) + { + size_t bytes = dataSize(); + data = new unsigned char[bytes]; + memset(data, 0, bytes); + registerCount = VariableRowCount(type) * elementCount(); + } } -Uniform::~Uniform() +LinkedUniform::~LinkedUniform() { delete[] data; } -bool Uniform::isArray() const +bool LinkedUniform::isArray() const { return arraySize > 0; } -unsigned int Uniform::elementCount() const +unsigned int LinkedUniform::elementCount() const { return arraySize > 0 ? arraySize : 1; } +bool LinkedUniform::isReferencedByVertexShader() const +{ + return vsRegisterIndex != GL_INVALID_INDEX; +} + +bool LinkedUniform::isReferencedByFragmentShader() const +{ + return psRegisterIndex != GL_INVALID_INDEX; +} + +bool LinkedUniform::isInDefaultBlock() const +{ + return blockIndex == -1; +} + +size_t LinkedUniform::dataSize() const +{ + ASSERT(type != GL_STRUCT_ANGLEX); + return VariableInternalSize(type) * elementCount(); +} + +bool LinkedUniform::isSampler() const +{ + return IsSampler(type); +} + +UniformBlock::UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize) + : name(name), + elementIndex(elementIndex), + dataSize(dataSize), + psRegisterIndex(GL_INVALID_INDEX), + vsRegisterIndex(GL_INVALID_INDEX) +{ +} + +bool UniformBlock::isArrayElement() const +{ + return elementIndex != GL_INVALID_INDEX; +} + +bool UniformBlock::isReferencedByVertexShader() const +{ + return vsRegisterIndex != GL_INVALID_INDEX; +} + +bool UniformBlock::isReferencedByFragmentShader() const +{ + return psRegisterIndex != GL_INVALID_INDEX; +} + } |