This tests that we get the correct stage reference information when a shader has both a shader storage and uniform block.
This exposes a bug in Mesa where we were expecting the index to be an index of a combined SSBO and UBO resources list. When they should instead each have their own resource list and indices. Cc: Kenneth Graunke <[email protected]> --- tests/spec/arb_program_interface_query/common.h | 25 ++++++++ .../getprogramresourceiv.c | 68 +++++++++++++++++++++- 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/tests/spec/arb_program_interface_query/common.h b/tests/spec/arb_program_interface_query/common.h index d46ff26..371b033 100755 --- a/tests/spec/arb_program_interface_query/common.h +++ b/tests/spec/arb_program_interface_query/common.h @@ -117,6 +117,31 @@ static const char fs_std[] = " faub[1].fs_array[3] * faub[3].fs_array[3];\n" "}"; +static const char vs_buff_blks[] = + "#version 150\n" + "#extension GL_ARB_shader_storage_buffer_object : require\n" + "buffer vs_buffer_block { vec4 vs_buf_var; };" + "uniform vs_uni_block {\n" + " vec4 vs_test;\n" + "};\n" + "void main() {\n" + " gl_Position = vs_buf_var + vs_test;\n" + "}"; + +static const char fs_buff_blks[] = + "#version 150\n" + "#extension GL_ARB_shader_storage_buffer_object : require\n" + "uniform fs_uni_block {" + " vec4 fs_color;\n" + " float fs_array[4];\n" + "};\n" + "buffer fs_buffer_block { vec4 fs_buf_var; };\n" + "out vec4 fs_output0;\n" + "void main() {\n" + " fs_output0 = fs_buf_var + fs_color +\n" + " vec4(fs_array[0], fs_array[1], fs_array[2], fs_array[3]);\n" + "}"; + static const char vs_stor[] = "#version 150\n" "#extension GL_ARB_shader_storage_buffer_object : require\n" diff --git a/tests/spec/arb_program_interface_query/getprogramresourceiv.c b/tests/spec/arb_program_interface_query/getprogramresourceiv.c index 28cfc27..42a425c 100755 --- a/tests/spec/arb_program_interface_query/getprogramresourceiv.c +++ b/tests/spec/arb_program_interface_query/getprogramresourceiv.c @@ -283,6 +283,7 @@ PIGLIT_GL_TEST_CONFIG_END GLuint prog_std = -1; /* (vs,gs,fs)_std */ GLuint prog_stor = -1; /* (vs,gs,fs)_stor */ +GLuint prog_buff_blks = -1; /* (vs,fs)_buff_blks */ GLuint prog_sub = -1; /* (vs,gs,fs)_sub */ GLuint prog_sub_tess = -1; /* tcs_sub */ GLuint prog_cs = -1; /* cs_sub */ @@ -303,8 +304,11 @@ struct subtest_t { } props[25]; }; +const char *vs_std_vs_uniform_blk[] = {"vs_test", NULL }; const char *fs_std_fs_uniform_blk[] = {"fs_color", "fs_array[0]", NULL }; +const char *vs_stor_vs_buf_blk[] = {"vs_buf_var", NULL }; const char *fs_stor_gs_buf_blk[] = {"gs_buf_var", NULL }; +const char *fs_stor_fs_buf_blk[] = {"fs_buf_var", NULL }; const char *vs_sub_uniforms[] = {"vss", "vss2", NULL }; const char *tess_sub_uniforms[] = {"tcss", NULL }; const char *cs_sub_uniforms[] = {"css", NULL }; @@ -506,6 +510,62 @@ static const struct subtest_t subtests[] = { { GL_REFERENCED_BY_COMPUTE_SHADER, 1, { 0 } }, { 0, 0, { 0 } }} }, + { &prog_buff_blks, GL_UNIFORM_BLOCK, "vs_uni_block", vs_std_vs_uniform_blk, { + { GL_NAME_LENGTH, 1, { 13 } }, + { GL_BUFFER_BINDING, 1, { 0 } }, + { GL_BUFFER_DATA_SIZE, 1, { 16 } }, /* only checks for GL errors */ + { GL_NUM_ACTIVE_VARIABLES, 1, { 1 } }, + { GL_ACTIVE_VARIABLES, 1, { 0 } }, + { GL_REFERENCED_BY_VERTEX_SHADER, 1, { 1 } }, + { GL_REFERENCED_BY_TESS_CONTROL_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_TESS_EVALUATION_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_GEOMETRY_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_FRAGMENT_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_COMPUTE_SHADER, 1, { 0 } }, + { 0, 0, { 0 } }} + }, + { &prog_buff_blks, GL_UNIFORM_BLOCK, "fs_uni_block", fs_std_fs_uniform_blk, { + { GL_NAME_LENGTH, 1, { 13 } }, + { GL_BUFFER_BINDING, 1, { 0 } }, + { GL_BUFFER_DATA_SIZE, 1, { 32 } }, /* only checks for GL errors */ + { GL_NUM_ACTIVE_VARIABLES, 1, { 2 } }, + { GL_ACTIVE_VARIABLES, 2, { 0, 0 } }, + { GL_REFERENCED_BY_VERTEX_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_TESS_CONTROL_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_TESS_EVALUATION_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_GEOMETRY_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_FRAGMENT_SHADER, 1, { 1 } }, + { GL_REFERENCED_BY_COMPUTE_SHADER, 1, { 0 } }, + { 0, 0, { 0 } }} + }, + { &prog_buff_blks, GL_SHADER_STORAGE_BLOCK, "vs_buffer_block", vs_stor_vs_buf_blk, { + { GL_NAME_LENGTH, 1, { 16 } }, + { GL_BUFFER_BINDING, 1, { 0 } }, + { GL_BUFFER_DATA_SIZE, 1, { 16 } }, /* only checks for GL errors */ + { GL_NUM_ACTIVE_VARIABLES, 1, { 1 } }, + { GL_ACTIVE_VARIABLES, 1, { 1 } }, + { GL_REFERENCED_BY_VERTEX_SHADER, 1, { 1 } }, + { GL_REFERENCED_BY_TESS_CONTROL_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_TESS_EVALUATION_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_GEOMETRY_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_FRAGMENT_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_COMPUTE_SHADER, 1, { 0 } }, + { 0, 0, { 0 } }} + }, + { &prog_buff_blks, GL_SHADER_STORAGE_BLOCK, "fs_buffer_block", fs_stor_fs_buf_blk, { + { GL_NAME_LENGTH, 1, { 16 } }, + { GL_BUFFER_BINDING, 1, { 0 } }, + { GL_BUFFER_DATA_SIZE, 1, { 16 } }, /* only checks for GL errors */ + { GL_NUM_ACTIVE_VARIABLES, 1, { 1 } }, + { GL_ACTIVE_VARIABLES, 1, { 1 } }, + { GL_REFERENCED_BY_VERTEX_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_TESS_CONTROL_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_TESS_EVALUATION_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_GEOMETRY_SHADER, 1, { 0 } }, + { GL_REFERENCED_BY_FRAGMENT_SHADER, 1, { 1 } }, + { GL_REFERENCED_BY_COMPUTE_SHADER, 1, { 0 } }, + { 0, 0, { 0 } }} + }, { &prog_std, GL_TRANSFORM_FEEDBACK_VARYING, "gs_output0", NULL, { { GL_NAME_LENGTH, 1, { 11 } }, { GL_ARRAY_SIZE, 1, { 1 } }, @@ -860,7 +920,7 @@ check_extensions(GLuint prog, GLenum programInterface) /* First check the availability of the extensions */ if ((programInterface == GL_BUFFER_VARIABLE || programInterface == GL_SHADER_STORAGE_BLOCK || - prog == prog_stor) && + prog == prog_stor || prog == prog_buff_blks) && !piglit_is_extension_supported("GL_ARB_shader_storage_buffer_object")) { return false; } @@ -982,6 +1042,11 @@ piglit_init(int argc, char **argv) GL_GEOMETRY_SHADER, gs_stor, GL_FRAGMENT_SHADER, fs_stor, 0); + + prog_buff_blks = piglit_build_simple_program_multiple_shaders( + GL_VERTEX_SHADER, vs_buff_blks, + GL_FRAGMENT_SHADER, fs_buff_blks, + 0); } if (piglit_is_extension_supported("GL_ARB_explicit_attrib_location") && @@ -1137,6 +1202,7 @@ piglit_display(void) glDeleteProgramSafe(prog_sub_tess); glDeleteProgramSafe(prog_sub); glDeleteProgramSafe(prog_stor); + glDeleteProgramSafe(prog_buff_blks); glDeleteProgramSafe(prog_std); return pass ? PIGLIT_PASS : PIGLIT_FAIL; -- 2.5.5 _______________________________________________ Piglit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/piglit
