[Piglit] [PATCH 1/2] shader_runner: support multiple atomic counter buffers
Nicolai Hähnle
nhaehnle at gmail.com
Thu Oct 13 10:43:23 UTC 2016
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
---
tests/shaders/shader_runner.c | 41 +++++++++++++++++++++++++++++++----------
1 file changed, 31 insertions(+), 10 deletions(-)
diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index dfa6991..6faa7f5 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -118,21 +118,21 @@ static GLuint fragment_shaders[256];
static unsigned num_fragment_shaders = 0;
static GLuint compute_shaders[256];
static unsigned num_compute_shaders = 0;
static GLuint textures[256];
static unsigned num_textures = 0;
static int num_uniform_blocks;
static GLuint *uniform_block_bos;
static GLenum geometry_layout_input_type = GL_TRIANGLES;
static GLenum geometry_layout_output_type = GL_TRIANGLE_STRIP;
static GLint geometry_layout_vertices_out = 0;
-static GLuint atomics_bo = 0;
+static GLuint atomics_bos[8];
static GLuint ssbo[32];
#define SHADER_TYPES 6
static GLuint *subuniform_locations[SHADER_TYPES];
static int num_subuniform_locations[SHADER_TYPES];
static char *shader_string;
static GLint shader_string_size;
static const char *vertex_data_start = NULL;
static const char *vertex_data_end = NULL;
static GLuint prog;
@@ -2802,20 +2802,29 @@ teardown_ubos(void)
if (num_uniform_blocks == 0) {
return;
}
glDeleteBuffers(num_uniform_blocks, uniform_block_bos);
free(uniform_block_bos);
uniform_block_bos = NULL;
num_uniform_blocks = 0;
}
+static void
+teardown_atomics(void)
+{
+ for (unsigned i = 0; i < ARRAY_SIZE(atomics_bos); ++i) {
+ if (atomics_bos[i])
+ glDeleteBuffers(1, &atomics_bos[i]);
+ }
+}
+
static enum piglit_result
program_must_be_in_use(void)
{
if (!link_ok) {
fprintf(stderr, "Failed to link:\n%s\n", prog_err_info);
return PIGLIT_FAIL;
} else if (!prog_in_use) {
fprintf(stderr, "Failed to use program: %s\n", prog_err_info);
return PIGLIT_FAIL;
}
@@ -2825,51 +2834,50 @@ program_must_be_in_use(void)
static void
bind_vao_if_supported()
{
if (vao == 0 && gl_version.num >= 31) {
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
}
}
static bool
-probe_atomic_counter(GLint counter_num, const char *op, uint32_t value)
+probe_atomic_counter(unsigned buffer_num, GLint counter_num, const char *op, uint32_t value)
{
uint32_t *p;
uint32_t observed;
enum comparison cmp;
bool result;
process_comparison(op, &cmp);
- glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomics_bo);
- p = glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, counter_num * sizeof(uint32_t),
+ p = glMapNamedBufferRange(atomics_bos[buffer_num], counter_num * sizeof(uint32_t),
sizeof(uint32_t), GL_MAP_READ_BIT);
if (!p) {
printf("Couldn't map atomic counter to verify expected value.\n");
return false;
}
observed = *p;
result = compare_uint(value, observed, cmp);
if (!result) {
printf("Atomic counter %d test failed: Reference %s Observed\n",
counter_num, comparison_string(cmp));
printf(" Reference: %u\n", value);
printf(" Observed: %u\n", observed);
- glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
+ glUnmapNamedBuffer(atomics_bos[buffer_num]);
return false;
}
- glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
+ glUnmapNamedBuffer(atomics_bos[buffer_num]);
return true;
}
static bool
probe_ssbo_uint(GLint ssbo_index, GLint ssbo_offset, const char *op, uint32_t value)
{
uint32_t *p;
uint32_t observed;
enum comparison cmp;
bool result;
@@ -2950,28 +2958,40 @@ piglit_display(void)
case GL_GEOMETRY_SHADER:
glActiveShaderProgram(pipeline, sso_geometry_prog);
break;
case GL_FRAGMENT_SHADER:
glActiveShaderProgram(pipeline, sso_fragment_prog);
break;
case GL_COMPUTE_SHADER:
glActiveShaderProgram(pipeline, sso_compute_prog);
break;
}
+ } else if (sscanf(line, "atomic counter buffer %u %u", &x, &y) == 2) {
+ GLuint *atomics_buf = calloc(y, sizeof(GLuint));
+ glGenBuffers(1, &atomics_bos[x]);
+ glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, x, atomics_bos[x]);
+ glBufferData(GL_ATOMIC_COUNTER_BUFFER,
+ sizeof(GLuint) * y, atomics_buf,
+ GL_STATIC_DRAW);
+ free(atomics_buf);
} else if (sscanf(line, "atomic counters %d", &x) == 1) {
GLuint *atomics_buf = calloc(x, sizeof(GLuint));
- glGenBuffers(1, &atomics_bo);
- glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomics_bo);
+ glGenBuffers(1, &atomics_bos[0]);
+ glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomics_bos[0]);
glBufferData(GL_ATOMIC_COUNTER_BUFFER,
sizeof(GLuint) * x,
atomics_buf, GL_STATIC_DRAW);
free(atomics_buf);
+ } else if (sscanf(line, "atomic counter %u %u %u", &x, &y, &z) == 3) {
+ glNamedBufferSubData(atomics_bos[x],
+ sizeof(GLuint) * y, sizeof(GLuint),
+ &z);
} else if (string_match("clear color", line)) {
get_floats(line + 11, c, 4);
glClearColor(c[0], c[1], c[2], c[3]);
clear_bits |= GL_COLOR_BUFFER_BIT;
} else if (string_match("clear depth", line)) {
get_floats(line + 11, c, 1);
glClearDepth(c[0]);
clear_bits |= GL_DEPTH_BUFFER_BIT;
} else if (string_match("clear", line)) {
glClear(clear_bits);
@@ -3158,21 +3178,21 @@ piglit_display(void)
}
} else if (string_match("probe depth", line)) {
get_floats(line + 11, c, 3);
if (!piglit_probe_pixel_depth((int) c[0], (int) c[1],
c[2])) {
result = PIGLIT_FAIL;
}
} else if (sscanf(line,
"probe atomic counter %u %s %u",
&ux, s, &uy) == 3) {
- if (!probe_atomic_counter(ux, s, uy)) {
+ if (!probe_atomic_counter(0, ux, s, uy)) {
piglit_report_result(PIGLIT_FAIL);
}
} else if (sscanf(line, "probe ssbo uint %d %d %s 0x%x",
&x, &y, s, &z) == 4) {
if (!probe_ssbo_uint(x, y, s, z))
result = PIGLIT_FAIL;
} else if (sscanf(line, "probe ssbo uint %d %d %s %d",
&x, &y, s, &z) == 4) {
if (!probe_ssbo_uint(x, y, s, z))
result = PIGLIT_FAIL;
@@ -3687,21 +3707,21 @@ piglit_init(int argc, char **argv)
assert(num_tess_eval_shaders == 0);
assert(num_geometry_shaders == 0);
assert(num_fragment_shaders == 0);
assert(num_compute_shaders == 0);
assert(num_textures == 0);
assert(num_uniform_blocks == 0);
assert(uniform_block_bos == NULL);
geometry_layout_input_type = GL_TRIANGLES;
geometry_layout_output_type = GL_TRIANGLE_STRIP;
geometry_layout_vertices_out = 0;
- atomics_bo = 0;
+ memset(atomics_bos, 0, sizeof(atomics_bos));
memset(ssbo, 0, sizeof(ssbo));
for (j = 0; j < ARRAY_SIZE(subuniform_locations); j++)
assert(subuniform_locations[j] == NULL);
memset(num_subuniform_locations, 0, sizeof(num_subuniform_locations));
shader_string = NULL;
shader_string_size = 0;
vertex_data_start = NULL;
vertex_data_end = NULL;
prog = 0;
sso_vertex_prog = 0;
@@ -3831,18 +3851,19 @@ piglit_init(int argc, char **argv)
*/
if (report_subtests) {
piglit_report_subtest_result(
result, "%s", testname);
} else {
piglit_report_result(result);
}
/* destroy GL objects? */
teardown_ubos();
+ teardown_atomics();
}
exit(0);
}
result = init_test(argv[1]);
if (result != PIGLIT_PASS)
piglit_report_result(result);
}
--
2.7.4
More information about the Piglit
mailing list