According to Timothy, block_index is an index into the BufferInterfaceBlocks array. We want to return an index into the UniformBlocks or ShaderStorageBlocks array, as that's what everything else expects.
Fixes several dEQP-GLES31.functional tests: - program_interface_query.uniform.block_index.block_array - program_interface_query.uniform.block_index.named_block - program_interface_query.uniform.block_index.unnamed_block - program_interface_query.uniform.random.10 - program_interface_query.uniform.random.15 - program_interface_query.uniform.random.22 - program_interface_query.uniform.random.24 - program_interface_query.uniform.random.26 - program_interface_query.uniform.random.28 - program_interface_query.uniform.random.3 - program_interface_query.uniform.random.31 - program_interface_query.uniform.random.38 - program_interface_query.uniform.random.5 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94116 Signed-off-by: Kenneth Graunke <[email protected]> --- src/mesa/main/shader_query.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp index 4650a5c..fb0f723 100644 --- a/src/mesa/main/shader_query.cpp +++ b/src/mesa/main/shader_query.cpp @@ -1153,10 +1153,36 @@ _mesa_program_resource_prop(struct gl_shader_program *shProg, default: goto invalid_operation; } - case GL_BLOCK_INDEX: + case GL_BLOCK_INDEX: { VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE); - *val = RESOURCE_UNI(res)->block_index; + + if (RESOURCE_UNI(res)->block_index == -1) { + *val = -1; + } else { + struct gl_uniform_block **list; + unsigned list_length; + + if (res->Type == GL_UNIFORM) { + list = shProg->UniformBlocks; + list_length = shProg->NumUniformBlocks; + } else { + assert(res->Type == GL_BUFFER_VARIABLE); + list = shProg->ShaderStorageBlocks; + list_length = shProg->NumShaderStorageBlocks; + } + + struct gl_uniform_block *block = + &shProg->BufferInterfaceBlocks[RESOURCE_UNI(res)->block_index]; + + for (unsigned i = 0; i < list_length; i++) { + if (list[i] == block) { + *val = i; + break; + } + } + } return 1; + } case GL_ARRAY_STRIDE: VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE); *val = RESOURCE_UNI(res)->array_stride; -- 2.7.4 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
