---
 tests/all.py                      |  3 +++
 tests/texturing/teximage-colors.c | 54 ++++++++++++++++++++++++++++-----------
 2 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/tests/all.py b/tests/all.py
index 87ff8e9..50d4b39 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -853,6 +853,9 @@ color_formats = [
 for format in color_formats:
     add_concurrent_test(gl11, ['teximage-colors', format])
 
+for format in color_formats:
+    add_concurrent_test(gl11, ['teximage-colors', '--pbo', format])
+
 gl10 = {}
 spec['!OpenGL 1.0'] = gl10
 add_concurrent_test(gl10, ['gl-1.0-beginend-coverage'])
diff --git a/tests/texturing/teximage-colors.c 
b/tests/texturing/teximage-colors.c
index 31136a9..5944137 100644
--- a/tests/texturing/teximage-colors.c
+++ b/tests/texturing/teximage-colors.c
@@ -459,8 +459,11 @@ int texture_size = 31;
 struct texture_format *format = NULL;
 GLuint unsigned_prog, signed_prog;
 void *rand_data;
+float *rand_float;
+GLuint pbo, float_pbo;
 float tolerance[4];
 bool benchmark = false;
+bool use_pbo = false;
 
 void
 piglit_init(int argc, char **argv)
@@ -473,6 +476,8 @@ piglit_init(int argc, char **argv)
                } else if (strcmp(argv[i], "--benchmark") == 0) {
                        benchmark = true;
                        texture_size = 128;
+               } else if (strcmp(argv[i], "--pbo") == 0) {
+                       use_pbo = true;
                } else if (i == argc - 1) {
                        format = find_format(argv[i]);
                        break;
@@ -492,10 +497,31 @@ piglit_init(int argc, char **argv)
        unsigned_prog = piglit_build_simple_program(NULL, 
frag_shader_unsigned_src);
 
        srand(seed);
+
        rand_data = malloc(texture_size * texture_size * 128);
        for (i = 0; i < texture_size * texture_size * 128; ++i)
                ((GLubyte *)rand_data)[i] = rand();
 
+       rand_float = malloc(texture_size * texture_size * 128);
+       for (i = 0; i < texture_size * texture_size * 32; ++i)
+               rand_float[i] = sn_to_float(32, ((GLint *)rand_data)[i]);
+
+       if (use_pbo) {
+               glGenBuffers(1, &pbo);
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+               glBufferData(GL_PIXEL_UNPACK_BUFFER,
+                            texture_size * texture_size * 128, rand_data,
+                            GL_STATIC_DRAW);
+
+               glGenBuffers(1, &float_pbo);
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, float_pbo);
+               glBufferData(GL_PIXEL_UNPACK_BUFFER,
+                            texture_size * texture_size * 128, rand_float,
+                            GL_STATIC_DRAW);
+
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+       }
+
        if (is_format_srgb(format->internal_format)) {
                /* We loose a little precision in the high numbers */
                tolerance[0] = 0.02;
@@ -701,9 +727,9 @@ run_test(GLenum test_format, GLenum test_type, float 
*time_out)
        bool pass = true;
        int64_t time;
        GLuint tex;
-       int i, Bpp, channels;
-       float *tmp, *expected, *observed;
-       void *data;
+       int i, Bpp;
+       float *expected, *observed;
+       void *data, *teximage_ptr;
 
        glGenTextures(1, &tex);
        glBindTexture(GL_TEXTURE_2D, tex);
@@ -712,18 +738,15 @@ run_test(GLenum test_format, GLenum test_type, float 
*time_out)
 
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 
-       channels = num_channels(test_format);
        Bpp = bytes_per_pixel(test_format, test_type);
 
-       if (test_type == GL_FLOAT) {
-               /* Sanatize so we don't get invalid floating point values */
-               tmp = malloc(texture_size * texture_size * channels * 
sizeof(float));
-               for (i = 0; i < texture_size * texture_size * channels; ++i)
-                       tmp[i] = sn_to_float(32, ((GLint *)rand_data)[i]);
-               data = tmp;
+       data = (test_type == GL_FLOAT) ? rand_float : rand_data;
+       if (use_pbo) {
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER,
+                            (test_type == GL_FLOAT) ? float_pbo : pbo);
+               teximage_ptr = NULL;
        } else {
-               tmp = NULL;
-               data = rand_data;
+               teximage_ptr = data;
        }
 
        expected = malloc(texture_size * texture_size * 4 * sizeof(float));
@@ -736,16 +759,18 @@ run_test(GLenum test_format, GLenum test_type, float 
*time_out)
                for (i = 0; i < BENCHMARK_ITERATIONS; ++i)
                        glTexImage2D(GL_TEXTURE_2D, 0, format->internal_format,
                                     texture_size, texture_size, 0,
-                                    test_format, test_type, data);
+                                    test_format, test_type, teximage_ptr);
                time = piglit_time_get_nano() - time;
                *time_out = (double)time / (double)(BENCHMARK_ITERATIONS*1000);
        } else {
                glTexImage2D(GL_TEXTURE_2D, 0, format->internal_format,
                             texture_size, texture_size, 0,
-                            test_format, test_type, data);
+                            test_format, test_type, teximage_ptr);
        }
        pass &= piglit_check_gl_error(GL_NO_ERROR);
 
+       glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+
        if (is_format_signed(format->internal_format)) {
                glUseProgram(signed_prog);
 
@@ -767,7 +792,6 @@ run_test(GLenum test_format, GLenum test_type, float 
*time_out)
 
        free(observed);
        free(expected);
-       free(tmp);
 
        piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL,
                                     "%s texture with %s and %s",
-- 
2.2.0

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to