Commit 9bf55527 by Qin Jiajia Committed by Commit Bot

Fix the incorrect calculation for MAX_NAME_LENGTH

The old implementation forgot to consider the instance array situation. This change will use unified method to calculate the interface block's MAX_NAME_LENGTH. It also removes some cases which have already passed from expectation files. BUG=angleproject:1920 TEST=angle_end2end_tests *program_interface_query.uniform_block.resource_list.block_array* *program_interface_query.shader_storage_block.resource_list.block_array* Change-Id: I6ef53951487e6366d69ecaa43e4df6824baad042 Reviewed-on: https://chromium-review.googlesource.com/890386 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 79de62c6
...@@ -1910,19 +1910,18 @@ void Program::getActiveShaderStorageBlockName(const GLuint blockIndex, ...@@ -1910,19 +1910,18 @@ void Program::getActiveShaderStorageBlockName(const GLuint blockIndex,
GetInterfaceBlockName(blockIndex, mState.mShaderStorageBlocks, bufSize, length, blockName); GetInterfaceBlockName(blockIndex, mState.mShaderStorageBlocks, bufSize, length, blockName);
} }
GLint Program::getActiveUniformBlockMaxLength() const template <typename T>
GLint Program::getActiveInterfaceBlockMaxNameLength(const std::vector<T> &resources) const
{ {
int maxLength = 0; int maxLength = 0;
if (mLinked) if (mLinked)
{ {
unsigned int numUniformBlocks = static_cast<unsigned int>(mState.mUniformBlocks.size()); for (const T &resource : resources)
for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < numUniformBlocks; uniformBlockIndex++)
{ {
const InterfaceBlock &uniformBlock = mState.mUniformBlocks[uniformBlockIndex]; if (!resource.name.empty())
if (!uniformBlock.name.empty())
{ {
int length = static_cast<int>(uniformBlock.nameWithArrayIndex().length()); int length = static_cast<int>(resource.nameWithArrayIndex().length());
maxLength = std::max(length + 1, maxLength); maxLength = std::max(length + 1, maxLength);
} }
} }
...@@ -1931,6 +1930,16 @@ GLint Program::getActiveUniformBlockMaxLength() const ...@@ -1931,6 +1930,16 @@ GLint Program::getActiveUniformBlockMaxLength() const
return maxLength; return maxLength;
} }
GLint Program::getActiveUniformBlockMaxNameLength() const
{
return getActiveInterfaceBlockMaxNameLength(mState.mUniformBlocks);
}
GLint Program::getActiveShaderStorageBlockMaxNameLength() const
{
return getActiveInterfaceBlockMaxNameLength(mState.mShaderStorageBlocks);
}
GLuint Program::getUniformBlockIndex(const std::string &name) const GLuint Program::getUniformBlockIndex(const std::string &name) const
{ {
return GetInterfaceBlockIndex(mState.mUniformBlocks, name); return GetInterfaceBlockIndex(mState.mUniformBlocks, name);
......
...@@ -599,7 +599,8 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -599,7 +599,8 @@ class Program final : angle::NonCopyable, public LabeledObject
GLuint getActiveUniformBlockCount() const; GLuint getActiveUniformBlockCount() const;
GLuint getActiveAtomicCounterBufferCount() const; GLuint getActiveAtomicCounterBufferCount() const;
GLuint getActiveShaderStorageBlockCount() const; GLuint getActiveShaderStorageBlockCount() const;
GLint getActiveUniformBlockMaxLength() const; GLint getActiveUniformBlockMaxNameLength() const;
GLint getActiveShaderStorageBlockMaxNameLength() const;
GLuint getUniformBlockIndex(const std::string &name) const; GLuint getUniformBlockIndex(const std::string &name) const;
GLuint getShaderStorageBlockIndex(const std::string &name) const; GLuint getShaderStorageBlockIndex(const std::string &name) const;
...@@ -759,6 +760,9 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -759,6 +760,9 @@ class Program final : angle::NonCopyable, public LabeledObject
GLsizei *length, GLsizei *length,
GLchar *name) const; GLchar *name) const;
template <typename T>
GLint getActiveInterfaceBlockMaxNameLength(const std::vector<T> &resources) const;
ProgramState mState; ProgramState mState;
rx::ProgramImpl *mProgram; rx::ProgramImpl *mProgram;
......
...@@ -598,9 +598,7 @@ GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programI ...@@ -598,9 +598,7 @@ GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programI
break; break;
case GL_UNIFORM_BLOCK: case GL_UNIFORM_BLOCK:
maxNameLength = return program->getActiveUniformBlockMaxNameLength();
FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
break;
case GL_BUFFER_VARIABLE: case GL_BUFFER_VARIABLE:
maxNameLength = maxNameLength =
...@@ -608,13 +606,10 @@ GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programI ...@@ -608,13 +606,10 @@ GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programI
break; break;
case GL_SHADER_STORAGE_BLOCK: case GL_SHADER_STORAGE_BLOCK:
maxNameLength = return program->getActiveShaderStorageBlockMaxNameLength();
FindMaxSize(program->getState().getShaderStorageBlocks(), &InterfaceBlock::name);
break;
case GL_TRANSFORM_FEEDBACK_VARYING: case GL_TRANSFORM_FEEDBACK_VARYING:
maxNameLength = clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength() - 1); return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
break;
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -981,7 +976,7 @@ void QueryProgramiv(const Context *context, const Program *program, GLenum pname ...@@ -981,7 +976,7 @@ void QueryProgramiv(const Context *context, const Program *program, GLenum pname
*params = program->getActiveUniformBlockCount(); *params = program->getActiveUniformBlockCount();
return; return;
case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
*params = program->getActiveUniformBlockMaxLength(); *params = program->getActiveUniformBlockMaxNameLength();
break; break;
case GL_TRANSFORM_FEEDBACK_BUFFER_MODE: case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
*params = program->getTransformFeedbackBufferMode(); *params = program->getTransformFeedbackBufferMode();
......
...@@ -1113,18 +1113,15 @@ ...@@ -1113,18 +1113,15 @@
// OPENGL Failing Tests // OPENGL Failing Tests
1665 WIN NVIDIA OPENGL : dEQP-GLES31.functional.draw_indirect.negative.command_offset_not_in_buffer_unsigned32_wrap = FAIL 1665 WIN NVIDIA OPENGL : dEQP-GLES31.functional.draw_indirect.negative.command_offset_not_in_buffer_unsigned32_wrap = FAIL
1442 NVIDIA OPENGL : dEQP-GLES31.functional.fbo.no_attachments.maximums.all = FAIL 1442 NVIDIA OPENGL : dEQP-GLES31.functional.fbo.no_attachments.maximums.all = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.buffer_data_size = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_variable.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_variable.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.program_input.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.program_input.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.program_output.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.program_output.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.shader_storage_block.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.shader_storage_block.referenced_by.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform.referenced_by_shader.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform.random.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform.random.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform_block.resource_list.block_array = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform_block.resource_list.block_array_single_element = FAIL
1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.* = FAIL 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.uniform_block.referenced_by.* = FAIL
1442 OPENGL : dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_large = FAIL 1442 OPENGL : dEQP-GLES31.functional.compute.basic.copy_image_to_ssbo_large = FAIL
1442 OPENGL : dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_large = FAIL 1442 OPENGL : dEQP-GLES31.functional.compute.basic.copy_ssbo_to_image_large = FAIL
......
...@@ -286,9 +286,17 @@ TEST_P(ProgramInterfaceTestES31, GetProgramInterface) ...@@ -286,9 +286,17 @@ TEST_P(ProgramInterfaceTestES31, GetProgramInterface)
" vec4 mem0;\n" " vec4 mem0;\n"
" vec4 mem1;\n" " vec4 mem1;\n"
"} instance;\n" "} instance;\n"
"layout(std430) buffer shaderStorageBlock1 {\n"
" vec3 target;\n"
"};\n"
"layout(std430) buffer shaderStorageBlock2 {\n"
" vec3 target;\n"
"} blockInstance2[1];\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" oColor = color;\n" " oColor = color;\n"
" target = vec3(0, 0, 0);\n"
" blockInstance2[0].target = vec3(1, 1, 1);\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, vertexShaderSource, fragmentShaderSource); ANGLE_GL_PROGRAM(program, vertexShaderSource, fragmentShaderSource);
...@@ -338,6 +346,18 @@ TEST_P(ProgramInterfaceTestES31, GetProgramInterface) ...@@ -338,6 +346,18 @@ TEST_P(ProgramInterfaceTestES31, GetProgramInterface)
glGetProgramInterfaceiv(program, GL_UNIFORM, GL_MAX_NUM_ACTIVE_VARIABLES, &num); glGetProgramInterfaceiv(program, GL_UNIFORM, GL_MAX_NUM_ACTIVE_VARIABLES, &num);
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
glGetProgramInterfaceiv(program, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &num);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(2, num);
glGetProgramInterfaceiv(program, GL_SHADER_STORAGE_BLOCK, GL_MAX_NAME_LENGTH, &num);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(23, num); // "shaderStorageBlock2[0]"
glGetProgramInterfaceiv(program, GL_SHADER_STORAGE_BLOCK, GL_MAX_NUM_ACTIVE_VARIABLES, &num);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(1, num);
} }
// Tests the resource property query for uniform can be done correctly. // Tests the resource property query for uniform can be done correctly.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment