diff options
author | Anthony Pesch <apesch@nvidia.com> | 2019-04-11 12:37:07 -0400 |
---|---|---|
committer | Anthony Pesch <apesch@nvidia.com> | 2019-06-04 11:45:36 -0400 |
commit | 1f66016c1bb47a67bc73e043fd109cb95b2f3d84 (patch) | |
tree | 2e63efa2f4cd8fd9d201ade32a7c15ea9a903b94 /tests/spec/arb_texture_buffer_range/ranges-2.c | |
parent | 8645a1905084c5f920feae165ad34ba4faea6fca (diff) |
arb_texture_buffer_range: Fix buffer alignment in ranges-2 test
The ranges-2 test was failing due to glTexBufferRange returning GL_INVALID_VALUE
when the offset parameter wasn't GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT byte aligned.
From the OpenGL 4.6 Core spec:
An INVALID_VALUE error is generated if offset is not an integer multiple of the
value of TEXTURE_BUFFER_OFFSET_ALIGNMENT.
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Diffstat (limited to 'tests/spec/arb_texture_buffer_range/ranges-2.c')
-rw-r--r-- | tests/spec/arb_texture_buffer_range/ranges-2.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/tests/spec/arb_texture_buffer_range/ranges-2.c b/tests/spec/arb_texture_buffer_range/ranges-2.c index 3477e4b52..83a009875 100644 --- a/tests/spec/arb_texture_buffer_range/ranges-2.c +++ b/tests/spec/arb_texture_buffer_range/ranges-2.c @@ -91,22 +91,29 @@ float data[] = { 0, 0, 0.5, 0, }; +int aligned_size = 0; +int chunk_size = 24 * sizeof(float); +int num_chunks = 4; + enum piglit_result piglit_display(void) { int i; - int chunk_size = 24 * sizeof(float); bool pass = true; glClearColor(0.2, 0.2, 0.2, 0.2); glClear(GL_COLOR_BUFFER_BIT); - for (i = 0; i < sizeof(data) / chunk_size; i++) { + /* verify unaligned offsets produce an error */ + glTexBufferRange(GL_TEXTURE_BUFFER, GL_RGBA32F, tbo, aligned_size - 1, 1); + pass &= glGetError() == GL_INVALID_VALUE; + + for (i = 0; i < num_chunks; i++) { glTexBufferRange(GL_TEXTURE_BUFFER, GL_RGBA32F, - tbo, i * chunk_size, chunk_size); + tbo, i * aligned_size, chunk_size); glDrawArrays(GL_TRIANGLES, 0, 6); } - for (i = 0; i < sizeof(data) / chunk_size; i++) { + for (i = 0; i < num_chunks; i++) { float c[4] = { data[i * 24 + 2], data[i * 24 + 3], @@ -114,7 +121,7 @@ piglit_display(void) { 1 }; - pass = piglit_probe_rect_rgba( + pass &= piglit_probe_rect_rgba( piglit_width * 0.5 * (1 + data[i * 24 + 0]), piglit_height * 0.5 * (1 + data[i * 24 + 1]), piglit_width/2, @@ -128,8 +135,14 @@ piglit_display(void) { void piglit_init(int argc, char **argv) { + GLint align, i; + uint8_t *chunk; + piglit_require_extension("GL_ARB_texture_buffer_range"); + glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &align); + aligned_size = chunk_size % align == 0 ? chunk_size : align; + prog = piglit_build_simple_program(vs_source, fs_source); glUseProgram(prog); @@ -138,7 +151,12 @@ piglit_init(int argc, char **argv) { glGenBuffers(1, &tbo); glBindBuffer(GL_ARRAY_BUFFER, tbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, aligned_size * num_chunks, NULL, GL_STATIC_DRAW); + + for (i = 0, chunk = (uint8_t *)data; i < num_chunks; i++) { + glBufferSubData(GL_ARRAY_BUFFER, aligned_size * i, chunk_size, chunk); + chunk += chunk_size; + } glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_BUFFER, tex); |