ES31: Add BUFFER_VARIABLE and SHADER_STORAGE_BLOCK program interfaces
This patch collects the shader storage block members information.
It implements getShaderStorageBlockMemberInfo and getShaderStorageBlockSize
for OpenGL backend. Meanwhile, it implements BUFFER_VARIABLE and SHADER_STORAGE_BLOCK
interfaces for program query.
BUG=angleproject:1920
TEST=angle_end2end_tests:ProgramInterfaceTest*
dEQP-GLES31.functional.layout_binding.ssbo*
dEQP-GLES31.functional.compute.basic.empty
dEQP-GLES31.functional.compute.basic.ssbo_rw*
dEQP-GLES31.functional.compute.basic.ssbo_local_barrier*
dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_small
dEQP-GLES31.functional.compute.basic.copy_ssbo_multiple_groups
dEQP-GLES31.functional.compute.basic.copy_ssbo_multiple_invocations
dEQP-GLES31.functional.compute.basic.copy_ssbo_single_invocation
dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_small
dEQP-GLES31.functional.compute.basic.shared_var*
dEQP-GLES31.functional.compute.basic.ubo_to_ssbo*
dEQP-GLES31.functional.compute.basic.write_multiple_arr*
dEQP-GLES31.functional.compute.shared_var.basic_type.*
dEQP-GLES31.functional.compute.shared_var.work_group_size.*
dEQP-GLES31.functional.atomic_counter.*
Change-Id: Ie8b81fde5a2e919aab77adb3d137c9ff2f193409
Reviewed-on: https://chromium-review.googlesource.com/712235
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 887a001..22d0a3a 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -258,6 +258,53 @@
return true;
}
+GLuint GetInterfaceBlockIndex(const std::vector<InterfaceBlock> &list, const std::string &name)
+{
+ std::vector<unsigned int> subscripts;
+ std::string baseName = ParseResourceName(name, &subscripts);
+
+ unsigned int numBlocks = static_cast<unsigned int>(list.size());
+ for (unsigned int blockIndex = 0; blockIndex < numBlocks; blockIndex++)
+ {
+ const auto &block = list[blockIndex];
+ if (block.name == baseName)
+ {
+ const bool arrayElementZero =
+ (subscripts.empty() && (!block.isArray || block.arrayElement == 0));
+ const bool arrayElementMatches =
+ (subscripts.size() == 1 && subscripts[0] == block.arrayElement);
+ if (arrayElementMatches || arrayElementZero)
+ {
+ return blockIndex;
+ }
+ }
+ }
+
+ return GL_INVALID_INDEX;
+}
+
+void GetInterfaceBlockName(const GLuint index,
+ const std::vector<InterfaceBlock> &list,
+ GLsizei bufSize,
+ GLsizei *length,
+ GLchar *name)
+{
+ ASSERT(index < list.size());
+
+ const auto &block = list[index];
+
+ if (bufSize > 0)
+ {
+ std::string blockName = block.name;
+
+ if (block.isArray)
+ {
+ blockName += ArrayString(block.arrayElement);
+ }
+ CopyStringToBuffer(name, blockName, bufSize, length);
+ }
+}
+
void InitUniformBlockLinker(const gl::Context *context,
const ProgramState &state,
UniformBlockLinker *blockLinker)
@@ -440,6 +487,11 @@
return GetResourceIndexFromName(mUniforms, name);
}
+GLuint ProgramState::getBufferVariableIndexFromName(const std::string &name) const
+{
+ return GetResourceIndexFromName(mBufferVariables, name);
+}
+
GLuint ProgramState::getUniformIndexFromLocation(GLint location) const
{
ASSERT(location >= 0 && static_cast<size_t>(location) < mUniformLocations.size());
@@ -771,9 +823,10 @@
return NoError();
}
- ProgramLinkedResources resources = {{0, PackMode::ANGLE_RELAXED},
- {&mState.mUniformBlocks, &mState.mUniforms},
- {&mState.mShaderStorageBlocks}};
+ ProgramLinkedResources resources = {
+ {0, PackMode::ANGLE_RELAXED},
+ {&mState.mUniformBlocks, &mState.mUniforms},
+ {&mState.mShaderStorageBlocks, &mState.mBufferVariables}};
InitUniformBlockLinker(context, mState, &resources.uniformBlockLinker);
InitShaderStorageBlockLinker(context, mState, &resources.shaderStorageBlockLinker);
@@ -843,9 +896,10 @@
auto packMode = data.getExtensions().webglCompatibility ? PackMode::WEBGL_STRICT
: PackMode::ANGLE_RELAXED;
- ProgramLinkedResources resources = {{data.getCaps().maxVaryingVectors, packMode},
- {&mState.mUniformBlocks, &mState.mUniforms},
- {&mState.mShaderStorageBlocks}};
+ ProgramLinkedResources resources = {
+ {data.getCaps().maxVaryingVectors, packMode},
+ {&mState.mUniformBlocks, &mState.mUniforms},
+ {&mState.mShaderStorageBlocks, &mState.mBufferVariables}};
InitUniformBlockLinker(context, mState, &resources.uniformBlockLinker);
InitShaderStorageBlockLinker(context, mState, &resources.shaderStorageBlockLinker);
@@ -1248,6 +1302,14 @@
getResourceName(index, mState.mUniforms, bufSize, length, name);
}
+void Program::getBufferVariableResourceName(GLuint index,
+ GLsizei bufSize,
+ GLsizei *length,
+ GLchar *name) const
+{
+ getResourceName(index, mState.mBufferVariables, bufSize, length, name);
+}
+
const sh::Attribute &Program::getInputResource(GLuint index) const
{
ASSERT(index < mState.mAttributes.size());
@@ -1316,6 +1378,11 @@
}
}
+size_t Program::getActiveBufferVariableCount() const
+{
+ return mLinked ? mState.mBufferVariables.size() : 0;
+}
+
GLint Program::getActiveUniformMaxLength() const
{
size_t maxLength = 0;
@@ -1369,6 +1436,12 @@
return mState.mUniforms[index];
}
+const BufferVariable &Program::getBufferVariableByIndex(GLuint index) const
+{
+ ASSERT(index < static_cast<size_t>(mState.mBufferVariables.size()));
+ return mState.mBufferVariables[index];
+}
+
GLint Program::getUniformLocation(const std::string &name) const
{
return GetVariableLocation(mState.mUniforms, mState.mUniformLocations, name);
@@ -1690,24 +1763,21 @@
return static_cast<GLuint>(mState.mShaderStorageBlocks.size());
}
-void Program::getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const
+void Program::getActiveUniformBlockName(const GLuint blockIndex,
+ GLsizei bufSize,
+ GLsizei *length,
+ GLchar *blockName) const
{
- ASSERT(
- uniformBlockIndex <
- mState.mUniformBlocks.size()); // index must be smaller than getActiveUniformBlockCount()
+ GetInterfaceBlockName(blockIndex, mState.mUniformBlocks, bufSize, length, blockName);
+}
- const InterfaceBlock &uniformBlock = mState.mUniformBlocks[uniformBlockIndex];
+void Program::getActiveShaderStorageBlockName(const GLuint blockIndex,
+ GLsizei bufSize,
+ GLsizei *length,
+ GLchar *blockName) const
+{
- if (bufSize > 0)
- {
- std::string string = uniformBlock.name;
-
- if (uniformBlock.isArray)
- {
- string += ArrayString(uniformBlock.arrayElement);
- }
- CopyStringToBuffer(uniformBlockName, string, bufSize, length);
- }
+ GetInterfaceBlockName(blockIndex, mState.mShaderStorageBlocks, bufSize, length, blockName);
}
GLint Program::getActiveUniformBlockMaxLength() const
@@ -1733,27 +1803,12 @@
GLuint Program::getUniformBlockIndex(const std::string &name) const
{
- std::vector<unsigned int> subscripts;
- std::string baseName = ParseResourceName(name, &subscripts);
+ return GetInterfaceBlockIndex(mState.mUniformBlocks, name);
+}
- unsigned int numUniformBlocks = static_cast<unsigned int>(mState.mUniformBlocks.size());
- for (unsigned int blockIndex = 0; blockIndex < numUniformBlocks; blockIndex++)
- {
- const InterfaceBlock &uniformBlock = mState.mUniformBlocks[blockIndex];
- if (uniformBlock.name == baseName)
- {
- const bool arrayElementZero =
- (subscripts.empty() && (!uniformBlock.isArray || uniformBlock.arrayElement == 0));
- const bool arrayElementMatches =
- (subscripts.size() == 1 && subscripts[0] == uniformBlock.arrayElement);
- if (arrayElementMatches || arrayElementZero)
- {
- return blockIndex;
- }
- }
- }
-
- return GL_INVALID_INDEX;
+GLuint Program::getShaderStorageBlockIndex(const std::string &name) const
+{
+ return GetInterfaceBlockIndex(mState.mShaderStorageBlocks, name);
}
const InterfaceBlock &Program::getUniformBlockByIndex(GLuint index) const
@@ -1762,6 +1817,12 @@
return mState.mUniformBlocks[index];
}
+const InterfaceBlock &Program::getShaderStorageBlockByIndex(GLuint index) const
+{
+ ASSERT(index < static_cast<GLuint>(mState.mShaderStorageBlocks.size()));
+ return mState.mShaderStorageBlocks[index];
+}
+
void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
{
mState.mUniformBlocks[uniformBlockIndex].binding = uniformBlockBinding;