From 1f66016c1bb47a67bc73e043fd109cb95b2f3d84 Mon Sep 17 00:00:00 2001 From: Anthony Pesch Date: Thu, 11 Apr 2019 12:37:07 -0400 Subject: 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 --- tests/spec/arb_texture_buffer_range/ranges-2.c | 30 ++++++++++++++++++++------ 1 file 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); -- cgit v1.2.3