2 * Copyright © 2015 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
24 /** @file program-interface-query.c
26 * Test that checks the proper implementation of GL_ARB_program_interface_query
27 * implementation for shader storage buffers
30 #include "piglit-util-gl.h"
32 PIGLIT_GL_TEST_CONFIG_BEGIN
33 config
.window_width
= 100;
34 config
.window_height
= 100;
35 config
.supports_gl_compat_version
= 32;
36 config
.supports_gl_core_version
= 32;
37 config
.window_visual
= PIGLIT_GL_VISUAL_DOUBLE
| PIGLIT_GL_VISUAL_RGBA
;
38 config
.khr_no_error_support
= PIGLIT_NO_ERRORS
;
40 PIGLIT_GL_TEST_CONFIG_END
43 #define NUM_QUERIES 11
45 static const char vs_pass_thru_text
[] =
47 "#extension GL_ARB_shader_storage_buffer_object : require\n"
49 "struct B {mat2 b[3]; float c;};\n"
50 "layout(row_major, std140, binding=2) buffer ssbo_std140 {\n"
55 "in vec4 piglit_vertex;\n"
58 " gl_Position = piglit_vertex;\n"
59 " a_std140[0].s[0].b[0] = mat2(1.0, 2.0, 3.0, 4.0);\n"
62 static const char vs_no_ssbo_text
[] =
65 "in vec4 piglit_vertex;\n"
68 " gl_Position = piglit_vertex;\n"
71 static const char fs_source
[] =
73 "#extension GL_ARB_shader_storage_buffer_object : require\n"
77 "struct B {mat2 b[3]; float c;};\n"
79 "layout(std430, column_major, binding=2) buffer ssbo_std430 {\n"
85 " a_std430[0].s[0].b[0] = mat2(1.0, 2.0, 3.0, 4.0);\n"
86 " color = a_std430[0].v;\n"
92 piglit_init(int argc
, char **argv
)
96 const GLenum prop
[NUM_QUERIES
] = {GL_TOP_LEVEL_ARRAY_SIZE
,
97 GL_TOP_LEVEL_ARRAY_STRIDE
,
105 GL_REFERENCED_BY_VERTEX_SHADER
,
106 GL_REFERENCED_BY_FRAGMENT_SHADER
};
107 int query_std140
[NUM_QUERIES
] = {0};
108 int query_std430
[NUM_QUERIES
] = {0};
110 const int expected_std140
[NUM_QUERIES
] =
111 { 0, 112, GL_FLOAT_MAT2
, 3, 0, 16, 32, 16, 1, 1, 0 };
112 int expected_std430
[NUM_QUERIES
] =
113 { 2, 56, GL_FLOAT_MAT2
, 3, 2, 16, 16, 8, 0, 0, 1 };
115 bool has_vertex_ssbo
= true;
117 piglit_require_extension("GL_ARB_shader_storage_buffer_object");
118 piglit_require_extension("GL_ARB_program_interface_query");
120 glGetIntegerv(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS
, &num_vertex_ssbo
);
121 if (num_vertex_ssbo
== 0) {
122 has_vertex_ssbo
= false;
123 /* modify GL_BLOCK_INDEX return */
124 expected_std430
[4] = 0;
126 prog
= piglit_build_simple_program(has_vertex_ssbo
? vs_pass_thru_text
: vs_no_ssbo_text
, fs_source
);
130 if (has_vertex_ssbo
) {
131 /* First ssbo_std140 */
132 index
= glGetProgramResourceIndex(prog
,
134 "ssbo_std140.s[0].b[0]");
135 glGetProgramResourceiv(prog
, GL_BUFFER_VARIABLE
, index
,
136 NUM_QUERIES
, prop
, NUM_QUERIES
, NULL
,
138 if (!piglit_check_gl_error(GL_NO_ERROR
))
141 /* Now ssbo_std430 */
142 index
= glGetProgramResourceIndex(prog
,
144 "ssbo_std430.s[0].b[0]");
145 glGetProgramResourceiv(prog
, GL_BUFFER_VARIABLE
, index
,
146 NUM_QUERIES
, prop
, NUM_QUERIES
, NULL
,
149 if (!piglit_check_gl_error(GL_NO_ERROR
))
152 for (i
= 0 ; i
< NUM_QUERIES
; i
++) {
153 const char *prop_name
= piglit_get_gl_enum_name(prop
[i
]);
154 if (has_vertex_ssbo
) {
155 if (query_std140
[i
] != expected_std140
[i
]) {
156 printf("std140 %s expected = %d. Value = %d.\n",
157 prop_name
, expected_std140
[i
],
162 if (query_std430
[i
] != expected_std430
[i
]) {
163 printf("std430 %s expected = %d. Value = %d.\n",
164 prop_name
, expected_std430
[i
],
170 piglit_report_result(pass
? PIGLIT_PASS
: PIGLIT_FAIL
);
173 enum piglit_result
piglit_display(void)