[Piglit] [PATCH] Add test case for existing test getteximage-targets of reading into a PBO.
Jon Ashburn
jon at lunarg.com
Mon Mar 3 14:35:53 PST 2014
Initial test always used glGetTexImage into client memory for the various
texture targets. Add case of reading into PBO in addition to client memory.
---
tests/texturing/getteximage-targets.c | 334 ++++++++++++++++++++++++----------
1 file changed, 242 insertions(+), 92 deletions(-)
diff --git a/tests/texturing/getteximage-targets.c b/tests/texturing/getteximage-targets.c
index 383ee03..0e964ac 100644
--- a/tests/texturing/getteximage-targets.c
+++ b/tests/texturing/getteximage-targets.c
@@ -48,22 +48,26 @@ static void init_layer_data(GLubyte *layer_data, int num_layers)
int x, y, z, i, j;
for (z = 0; z < num_layers; z++) {
- GLubyte *data = layer_data + IMAGE_SIZE*z;
+ GLubyte *data = layer_data + IMAGE_SIZE * z;
for (x = 0; x < IMAGE_WIDTH; x += 4) {
for (y = 0; y < IMAGE_HEIGHT; y += 4) {
- int r = (x+1) * 255 / (IMAGE_WIDTH - 1);
- int g = (y+1) * 255 / (IMAGE_HEIGHT - 1);
- int b = (z+1) * 255 / (num_layers-1);
+ int r = (x + 1) * 255 / (IMAGE_WIDTH - 1);
+ int g = (y + 1) * 255 / (IMAGE_HEIGHT - 1);
+ int b = (z + 1) * 255 / (num_layers - 1);
int a = x ^ y ^ z;
/* each 4x4 block constains only one color (for S3TC) */
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
- data[((y+j)*IMAGE_WIDTH + x+i)*4 + 0] = r;
- data[((y+j)*IMAGE_WIDTH + x+i)*4 + 1] = g;
- data[((y+j)*IMAGE_WIDTH + x+i)*4 + 2] = b;
- data[((y+j)*IMAGE_WIDTH + x+i)*4 + 3] = a;
+ data[((y + j) * IMAGE_WIDTH + x
+ + i) * 4 + 0] = r;
+ data[((y + j) * IMAGE_WIDTH + x
+ + i) * 4 + 1] = g;
+ data[((y + j) * IMAGE_WIDTH + x
+ + i) * 4 + 2] = b;
+ data[((y + j) * IMAGE_WIDTH + x
+ + i) * 4 + 3] = a;
}
}
}
@@ -71,7 +75,8 @@ static void init_layer_data(GLubyte *layer_data, int num_layers)
}
}
-static void compare_layer(int layer, int num_elements, int tolerance,
+static bool
+compare_layer(int layer, int num_elements, int tolerance,
GLubyte *data, GLubyte *expected)
{
int i;
@@ -84,17 +89,232 @@ static void compare_layer(int layer, int num_elements, int tolerance,
(i / 4) / IMAGE_WIDTH, (i / 4) % IMAGE_HEIGHT, i % 4);
printf(" expected: %i\n", expected[i]);
printf(" got: %i\n", data[i]);
- piglit_report_result(PIGLIT_FAIL);
+ return false;
}
}
+ return true;
}
+bool
+getTexImage(bool doPBO, GLenum target, GLubyte data[][IMAGE_SIZE],
+ GLenum internalformat, int tolerance)
+{
+ int i, num_layers;
+ GLubyte data2[18][IMAGE_SIZE];
+ GLubyte *dataPBO=NULL;
+ GLuint packPBO;
+ bool pass = true;
+
+ /* Setup the PBO */
+ if (doPBO) {
+ glGenBuffers(1, &packPBO);
+ glBindBuffer(GL_PIXEL_PACK_BUFFER, packPBO);
+ } else {
+ glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+ memset(data2, 123, sizeof(data2));
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ switch (target) {
+ case GL_TEXTURE_1D:
+ glTexImage1D(GL_TEXTURE_1D, 0, internalformat, IMAGE_WIDTH, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data);
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER, IMAGE_WIDTH * 4,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER, 0,
+ IMAGE_WIDTH * 4,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, data2);
+ dataPBO = data2[0];
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ pass = compare_layer(0, IMAGE_WIDTH * 4, tolerance,
+ dataPBO, data[0]) && pass;
+ return pass;
+
+ case GL_TEXTURE_2D:
+ case GL_TEXTURE_RECTANGLE:
+ glTexImage2D(target, 0, internalformat, IMAGE_WIDTH,
+ IMAGE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data);
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER, IMAGE_SIZE,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER, 0,
+ IMAGE_SIZE,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ data2);
+ dataPBO = data2[0];
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ pass = compare_layer(0, IMAGE_SIZE, tolerance, dataPBO, data[0])
+ && pass;
+ return pass;
+
+ case GL_TEXTURE_3D:
+ num_layers = 16;
+ glTexImage3D(GL_TEXTURE_3D, 0, internalformat,
+ IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, data);
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER,
+ IMAGE_SIZE * num_layers,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(GL_TEXTURE_3D, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER,
+ 0, IMAGE_SIZE * num_layers,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(GL_TEXTURE_3D, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data2);
+ dataPBO = data2[0];
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ for (i = 0; i < num_layers; i++) {
+ pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
+ data[i]) && pass;
+ dataPBO += IMAGE_SIZE;
+ }
+ return pass;
+
+ case GL_TEXTURE_CUBE_MAP:
+ for (i = 0; i < 6; i++) {
+ glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
+ internalformat, IMAGE_WIDTH, IMAGE_HEIGHT,
+ 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, data[i]);
+ }
+ for (i = 0; i < 6; i++) {
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER, IMAGE_SIZE,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i
+ , 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER, 0,
+ IMAGE_SIZE,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i
+ , 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, data2[i]);
+ dataPBO = data2[i];
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
+ data[i]) && pass;
+ }
+ return pass;
+
+ case GL_TEXTURE_1D_ARRAY:
+ num_layers = 7;
+ glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat,
+ IMAGE_WIDTH, num_layers, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data);
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER,
+ IMAGE_WIDTH * 4 * num_layers,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER, 0,
+ IMAGE_WIDTH * 4 * num_layers,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, data2);
+ dataPBO = data2[0];
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ pass = compare_layer(0, IMAGE_WIDTH * 4 * num_layers,
+ tolerance, dataPBO, data[0]) && pass;
+ return pass;
+
+ case GL_TEXTURE_2D_ARRAY:
+ num_layers = 7;
+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat,
+ IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data);
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER,
+ IMAGE_SIZE * num_layers,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER, 0,
+ IMAGE_SIZE * num_layers,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(GL_TEXTURE_2D_ARRAY, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data2);
+ dataPBO = data2[0];
+
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ for (i = 0; i < num_layers; i++) {
+ pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
+ data[i]) && pass;
+ dataPBO += IMAGE_SIZE;
+ }
+ return pass;
+
+ case GL_TEXTURE_CUBE_MAP_ARRAY:
+ num_layers = 6 * 3;
+ glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat,
+ IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, data);
+ if (doPBO) {
+ glBufferData(GL_PIXEL_PACK_BUFFER,
+ IMAGE_SIZE * num_layers,
+ NULL, GL_STREAM_READ);
+ glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ dataPBO = (GLubyte *) glMapBufferRange(
+ GL_PIXEL_PACK_BUFFER, 0,
+ IMAGE_SIZE * num_layers,
+ GL_MAP_READ_BIT);
+ } else {
+ glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, data2);
+ dataPBO = data2[0];
+ }
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ for (i = 0; i < num_layers; i++) {
+ pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
+ data[i]) && pass;
+ dataPBO += IMAGE_SIZE;
+ }
+ return pass;
+ }
+
+ puts("Invalid texture target.");
+ return false;
+
+}
void piglit_init(int argc, char **argv)
{
- int i, tolerance = 0, num_layers;
+ int i;
GLenum target = GL_TEXTURE_2D;
+ bool pass = true;
GLenum internalformat = GL_RGBA8;
- GLubyte data[18][IMAGE_SIZE], data2[18][IMAGE_SIZE];
+ int tolerance = 0;
+ GLubyte data[18][IMAGE_SIZE];
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "1D") == 0) {
@@ -133,89 +353,19 @@ void piglit_init(int argc, char **argv)
}
init_layer_data(data[0], 18);
- memset(data2, 123, sizeof(data2));
- printf("Testing %s\n", piglit_get_gl_enum_name(target));
+ printf("Testing %s into PBO\n", piglit_get_gl_enum_name(target));
- switch (target) {
- case GL_TEXTURE_1D:
- glTexImage1D(GL_TEXTURE_1D, 0, internalformat, IMAGE_WIDTH, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data);
- glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
- piglit_check_gl_error(GL_NO_ERROR);
- compare_layer(0, 128, tolerance, data2[0], data[0]);
- piglit_report_result(PIGLIT_PASS);
+ pass = getTexImage(true, target, data, internalformat, tolerance) &&
+ pass;
+ printf("Testing %s into client array\n", piglit_get_gl_enum_name(target));
+ pass = getTexImage(false, target, data, internalformat, tolerance) &&
+ pass;
- case GL_TEXTURE_2D:
- case GL_TEXTURE_RECTANGLE:
- glTexImage2D(target, 0, internalformat, IMAGE_WIDTH, IMAGE_HEIGHT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data);
- glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
- piglit_check_gl_error(GL_NO_ERROR);
- compare_layer(0, IMAGE_SIZE, tolerance, data2[0], data[0]);
- piglit_report_result(PIGLIT_PASS);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
- case GL_TEXTURE_3D:
- num_layers = 16;
- glTexImage3D(GL_TEXTURE_3D, 0, internalformat,
- IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,
- GL_UNSIGNED_BYTE, data);
- glGetTexImage(GL_TEXTURE_3D, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data2);
- piglit_check_gl_error(GL_NO_ERROR);
- for (i = 0; i < num_layers; i++) {
- compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
- }
+ if (pass)
piglit_report_result(PIGLIT_PASS);
-
- case GL_TEXTURE_CUBE_MAP:
- for (i = 0; i < 6; i++) {
- glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
- internalformat, IMAGE_WIDTH, IMAGE_HEIGHT, 0, GL_RGBA,
- GL_UNSIGNED_BYTE, data[i]);
- }
- for (i = 0; i < 6; i++) {
- glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data2[i]);
- piglit_check_gl_error(GL_NO_ERROR);
- compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
- }
- piglit_report_result(PIGLIT_PASS);
-
- case GL_TEXTURE_1D_ARRAY:
- num_layers = 7;
- glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat, IMAGE_WIDTH, num_layers, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data);
- glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
- piglit_check_gl_error(GL_NO_ERROR);
- compare_layer(0, IMAGE_WIDTH*4*num_layers, tolerance, data2[0], data[0]);
- piglit_report_result(PIGLIT_PASS);
-
- case GL_TEXTURE_2D_ARRAY:
- num_layers = 7;
- glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat,
- IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
- glGetTexImage(GL_TEXTURE_2D_ARRAY, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data2);
- piglit_check_gl_error(GL_NO_ERROR);
- for (i = 0; i < num_layers; i++) {
- compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
- }
- piglit_report_result(PIGLIT_PASS);
-
- case GL_TEXTURE_CUBE_MAP_ARRAY:
- num_layers = 6*3;
- glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat,
- IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
- glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data2);
- piglit_check_gl_error(GL_NO_ERROR);
- for (i = 0; i < num_layers; i++) {
- compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
- }
- piglit_report_result(PIGLIT_PASS);
- }
-
- puts("Invalid texture target.");
- piglit_report_result(PIGLIT_FAIL);
+ else
+ piglit_report_result(PIGLIT_FAIL);
}
--
1.8.1.2
More information about the Piglit
mailing list