[Piglit] [PATCH 2/3] Add egl utility for OpenGL ES 2.0

Shuang He shuang.he at intel.com
Thu Oct 21 17:39:03 PDT 2010


On 2010-10-22 1:43, Kristian Høgsberg wrote:
> On Wed, Oct 20, 2010 at 10:28 PM, Shuang He<shuang.he at intel.com>  wrote:
>> ---
>>   tests/util/egl/CMakeLists.txt         |   17 +
>>   tests/util/egl/piglit-egl-framework.c |   99 +++++
>>   tests/util/egl/piglit-egl-framework.h |   31 ++
>>   tests/util/egl/piglit-egl-util.c      |  777 +++++++++++++++++++++++++++++++++
>>   tests/util/egl/piglit-egl-util.h      |  102 +++++
>>   5 files changed, 1026 insertions(+), 0 deletions(-)
>>   create mode 100644 tests/util/egl/CMakeLists.txt
>>   create mode 100644 tests/util/egl/piglit-egl-framework.c
>>   create mode 100644 tests/util/egl/piglit-egl-framework.h
>>   create mode 100644 tests/util/egl/piglit-egl-util.c
>>   create mode 100644 tests/util/egl/piglit-egl-util.h
> It's a good idea to split out the egl/gles2 version of the framework
> in a separate file, so we avoid a big #ifdef mess in
> piglit-framework.c.  However, I would try to reuse more of the code.
> There's a lot of functions and data that's just copied from
> piglit-util.c.  I think it's better to just keep the new framework in
> the same directory and split out the shared pieces from piglit-util.c
> into piglit-shared-util.c.  Finally, I'd call the new framework
> piglit-gles2-framework.h, since it's not generic EGL, it's
> specifically GLES2.
>
> Kristian
>

Yes, most of the utilities are common to both OpenGL and OpenGL ES 2.0.
It's very good idea to move them into piglit-shared-util.c

Thanks
     --Shuang
>> diff --git a/tests/util/egl/CMakeLists.txt b/tests/util/egl/CMakeLists.txt
>> new file mode 100644
>> index 0000000..d0ae4fb
>> --- /dev/null
>> +++ b/tests/util/egl/CMakeLists.txt
>> @@ -0,0 +1,17 @@
>> +add_definitions ( -DSOURCE_DIR="${piglit_SOURCE_DIR}/" )
>> +
>> +include_directories(
>> +       ${OPENGL_INCLUDE_PATH}
>> +       ${piglit_SOURCE_DIR}/tests/util/eglut
>> +)
>> +
>> +link_libraries (
>> +       ${OPENGL_gles2_LIBRARY}
>> +       ${OPENGL_egl_LIBRARY}
>> +       pigliteglut
>> +)
>> +
>> +add_library (pigliteglutil
>> +        piglit-egl-framework.c
>> +       piglit-egl-util.c
>> +)
>> diff --git a/tests/util/egl/piglit-egl-framework.c b/tests/util/egl/piglit-egl-framework.c
>> new file mode 100644
>> index 0000000..a142022
>> --- /dev/null
>> +++ b/tests/util/egl/piglit-egl-framework.c
>> @@ -0,0 +1,99 @@
>> +/*
>> + * Copyright © 2010 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +/**
>> + * Simple test case framework.
>> + *
>> + * \author Shuang He<shuang.he at intel.com>
>> + */
>> +#include<assert.h>
>> +#include<string.h>
>> +#include<stdio.h>
>> +#include<stdlib.h>
>> +#include<math.h>
>> +
>> +#include "piglit-egl-util.h"
>> +#include "piglit-egl-framework.h"
>> +#include "eglut.h"
>> +
>> +int piglit_automatic = 0;
>> +static int piglit_window;
>> +static enum piglit_result result;
>> +
>> +static void
>> +display(void)
>> +{
>> +       result = piglit_egl_display();
>> +
>> +       if (piglit_automatic) {
>> +               eglutDestroyWindow(piglit_window);
>> +               piglit_report_result(result);
>> +       }
>> +}
>> +
>> +static void
>> +reshape(int w, int h)
>> +{
>> +       piglit_width = w;
>> +       piglit_height = h;
>> +
>> +       glViewport(0, 0, w, h);
>> +}
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +       int j;
>> +
>> +       eglutInit(argc, argv);
>> +
>> +       /* Find/remove "-auto" from the argument vector.
>> +        */
>> +       for (j = 1; j<  argc; j++) {
>> +               if (!strcmp(argv[j], "-auto")) {
>> +                       int i;
>> +
>> +                       piglit_automatic = 1;
>> +
>> +                       for (i = j + 1; i<  argc; i++) {
>> +                               argv[i - 1] = argv[i];
>> +                       }
>> +                       argc--;
>> +                       j--;
>> +               }
>> +       }
>> +       eglutInitWindowSize(piglit_width, piglit_height);
>> +       eglutInitAPIMask(EGLUT_OPENGL_ES2_BIT);
>> +       eglutCreateWindow(argv[0]);
>> +
>> +       eglutDisplayFunc(display);
>> +       eglutReshapeFunc(reshape);
>> +       eglutKeyboardFunc((EGLUTkeyboardCB)piglit_escape_exit_key);
>> +
>> +       piglit_egl_init(argc, argv);
>> +
>> +       eglutMainLoop();
>> +
>> +       piglit_report_result(result);
>> +       /* UNREACHED */
>> +       return 0;
>> +}
>> diff --git a/tests/util/egl/piglit-egl-framework.h b/tests/util/egl/piglit-egl-framework.h
>> new file mode 100644
>> index 0000000..6eac52e
>> --- /dev/null
>> +++ b/tests/util/egl/piglit-egl-framework.h
>> @@ -0,0 +1,31 @@
>> +/*
>> + * Copyright © 2009 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +extern int piglit_automatic;
>> +
>> +extern int piglit_window_mode;
>> +extern int piglit_width;
>> +extern int piglit_height;
>> +
>> +extern enum piglit_result piglit_egl_display(void);
>> +extern void piglit_egl_init(int argc, char **argv);
>> diff --git a/tests/util/egl/piglit-egl-util.c b/tests/util/egl/piglit-egl-util.c
>> new file mode 100644
>> index 0000000..9e6af91
>> --- /dev/null
>> +++ b/tests/util/egl/piglit-egl-util.c
>> @@ -0,0 +1,777 @@
>> +/*
>> + * Copyright (c) The Piglit project 2007
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * on the rights to use, copy, modify, merge, publish, distribute, sub
>> + * license, and/or sell copies of the Software, and to permit persons to whom
>> + * the Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
>> + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
>> + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
>> + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
>> + * USE OR OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +#if defined(_MSC_VER)
>> +#include<windows.h>
>> +#endif
>> +
>> +#include<assert.h>
>> +#include<math.h>
>> +#include<stdio.h>
>> +#include<stdlib.h>
>> +#include<string.h>
>> +#include<errno.h>
>> +#include<sys/stat.h>
>> +
>> +#include "piglit-egl-util.h"
>> +
>> +/* These texture coordinates should have 1 or -1 in the major axis selecting
>> + * the face, and a nearly-1-or-negative-1 value in the other two coordinates
>> + * which will be used to produce the s,t values used to sample that face's
>> + * image.
>> + */
>> +GLfloat cube_face_texcoords[6][4][3] = {
>> +       { /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
>> +               {1.0,  0.99,  0.99},
>> +               {1.0,  0.99, -0.99},
>> +               {1.0, -0.99, -0.99},
>> +               {1.0, -0.99,  0.99},
>> +       },
>> +       { /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
>> +               {-0.99, 1.0, -0.99},
>> +               { 0.99, 1.0, -0.99},
>> +               { 0.99, 1.0,  0.99},
>> +               {-0.99, 1.0,  0.99},
>> +       },
>> +       { /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
>> +               {-0.99,  0.99, 1.0},
>> +               {-0.99, -0.99, 1.0},
>> +               { 0.99, -0.99, 1.0},
>> +               { 0.99,  0.99, 1.0},
>> +       },
>> +       { /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
>> +               {-1.0,  0.99, -0.99},
>> +               {-1.0,  0.99,  0.99},
>> +               {-1.0, -0.99,  0.99},
>> +               {-1.0, -0.99, -0.99},
>> +       },
>> +       { /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
>> +               {-0.99, -1.0,  0.99},
>> +               {-0.99, -1.0, -0.99},
>> +               { 0.99, -1.0, -0.99},
>> +               { 0.99, -1.0,  0.99},
>> +       },
>> +       { /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
>> +               { 0.99,  0.99, -1.0},
>> +               {-0.99,  0.99, -1.0},
>> +               {-0.99, -0.99, -1.0},
>> +               { 0.99, -0.99, -1.0},
>> +       },
>> +};
>> +
>> +const char *cube_face_names[6] = {
>> +       "POSITIVE_X",
>> +       "POSITIVE_Y",
>> +       "POSITIVE_Z",
>> +       "NEGATIVE_X",
>> +       "NEGATIVE_Y",
>> +       "NEGATIVE_Z",
>> +};
>> +
>> +const GLenum cube_face_targets[6] = {
>> +       GL_TEXTURE_CUBE_MAP_POSITIVE_X,
>> +       GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
>> +       GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
>> +       GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
>> +       GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
>> +       GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
>> +};
>> +
>> +static GLint attr_pos = 0;
>> +static GLint attr_tex = 1;
>> +static GLint attr_color = 2;
>> +
>> +/** Returns the line in the program string given the character position. */
>> +int FindLine(const char *program, int position)
>> +{
>> +       int i, line = 1;
>> +       for (i = 0; i<  position; i++) {
>> +               if (program[i] == '0')
>> +                       return -1; /* unknown line */
>> +               if (program[i] == '\n')
>> +                       line++;
>> +       }
>> +       return line;
>> +}
>> +
>> +void
>> +piglit_report_result(enum piglit_result result)
>> +{
>> +       fflush(stderr);
>> +
>> +       if (result == PIGLIT_SUCCESS) {
>> +               printf("PIGLIT: {'result': 'pass' }\n");
>> +               fflush(stdout);
>> +               exit(0);
>> +       } else if (result == PIGLIT_SKIP) {
>> +               printf("PIGLIT: {'result': 'skip' }\n");
>> +               fflush(stdout);
>> +               exit(0);
>> +       } else if (result == PIGLIT_WARN) {
>> +               printf("PIGLIT: {'result': 'warn' }\n");
>> +               fflush(stdout);
>> +               exit(0);
>> +       } else {
>> +               printf("PIGLIT: {'result': 'fail' }\n");
>> +               fflush(stdout);
>> +               exit(1);
>> +       }
>> +}
>> +
>> +int
>> +piglit_extension_supported(const char *name)
>> +{
>> +       static const GLubyte *extensions = NULL;
>> +       const GLubyte *start;
>> +       GLubyte *where, *terminator;
>> +
>> +       /* Extension names should not have spaces. */
>> +       where = (GLubyte *) strchr(name, ' ');
>> +       if (where || *name == '\0')
>> +               return 0;
>> +
>> +       if (!extensions) {
>> +               extensions = glGetString(GL_EXTENSIONS);
>> +       }
>> +       /* It takes a bit of care to be fool-proof about parsing the
>> +       OpenGL extensions string.  Don't be fooled by sub-strings,
>> +       etc. */
>> +       start = extensions;
>> +       for (;;) {
>> +               /* If your application crashes in the strstr routine below,
>> +               you are probably calling glutExtensionSupported without
>> +               having a current window.  Calling glGetString without
>> +               a current OpenGL context has unpredictable results.
>> +               Please fix your program. */
>> +               where = (GLubyte *) strstr((const char *) start, name);
>> +               if (!where)
>> +                       break;
>> +               terminator = where + strlen(name);
>> +               if (where == start || *(where - 1) == ' ') {
>> +                       if (*terminator == ' ' || *terminator == '\0') {
>> +                               return 1;
>> +                       }
>> +               }
>> +               start = terminator;
>> +       }
>> +       return 0;
>> +}
>> +
>> +void piglit_require_extension(const char *name)
>> +{
>> +       if (!piglit_extension_supported(name)) {
>> +               printf("Test requires %s\n", name);
>> +               piglit_report_result(PIGLIT_SKIP);
>> +               exit(1);
>> +       }
>> +}
>> +
>> +void piglit_require_not_extension(const char *name)
>> +{
>> +       if (piglit_extension_supported(name)) {
>> +               piglit_report_result(PIGLIT_SKIP);
>> +               exit(1);
>> +       }
>> +}
>> +
>> +static float tolerance[4] = { 0.01, 0.01, 0.01, 0.01 };
>> +
>> +void
>> +piglit_set_tolerance_for_bits(int rbits, int gbits, int bbits, int abits)
>> +{
>> +       int bits[4] = {rbits, gbits, bbits, abits};
>> +       int i;
>> +
>> +       for (i = 0; i<  4; i++) {
>> +               if (bits[i]<  2) {
>> +                       /* Don't try to validate channels when there's only 1
>> +                        * bit of precision (or none).
>> +                        */
>> +                       tolerance[i] = 1.0;
>> +               } else {
>> +                       tolerance[i] = 3.0 / (1<<  bits[i]);
>> +               }
>> +       }
>> +}
>> +
>> +/**
>> + * Read a pixel from the given location and compare its RGBA value to the
>> + * given expected values.
>> + *
>> + * Print a log message if the color value deviates from the expected value.
>> + * \return true if the color values match, false otherwise
>> + */
>> +int piglit_probe_pixel_rgba(int x, int y, const float* expected)
>> +{
>> +       GLubyte probe[4];
>> +       int i;
>> +       GLboolean pass = GL_TRUE;
>> +
>> +       glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, probe);
>> +
>> +       for(i = 0; i<  4; ++i) {
>> +               if (fabs(probe[i]/255.0 - expected[i])>= tolerance[i]) {
>> +                       pass = GL_FALSE;
>> +               }
>> +       }
>> +
>> +       if (pass)
>> +               return 1;
>> +
>> +       printf("Probe at (%i,%i)\n", x, y);
>> +       printf("  Expected: %f %f %f %f\n", expected[0], expected[1], expected[2], expected[3]);
>> +       printf("  Observed: %f %f %f %f\n", probe[0]/255.0, probe[1]/255.0, probe[2]/255.0, probe[3]/255.0);
>> +
>> +       return 0;
>> +}
>> +
>> +int
>> +piglit_probe_rect_rgba(int x, int y, int w, int h, const float *expected)
>> +{
>> +       int i, j, p;
>> +       GLubyte *probe;
>> +       GLubyte *pixels = malloc(w*h*4*sizeof(GLubyte));
>> +
>> +       glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
>> +
>> +       for (j = 0; j<  h; j++) {
>> +               for (i = 0; i<  w; i++) {
>> +                       probe =&pixels[(j*w+i)*4];
>> +
>> +                       for (p = 0; p<  4; ++p) {
>> +                               if (fabs(probe[p]/255.0 - expected[p])>= tolerance[p]) {
>> +                                       printf("Probe at (%i,%i)\n", x+i, y+j);
>> +                                       printf("  Expected: %f %f %f %f\n",
>> +                                              expected[0], expected[1], expected[2], expected[3]);
>> +                                       printf("  Observed: %f %f %f %f\n",
>> +                                              probe[0]/255.0, probe[1]/255.0, probe[2]/255.0, probe[3]/255.0);
>> +
>> +                                       free(pixels);
>> +                                       return 0;
>> +                               }
>> +                       }
>> +               }
>> +       }
>> +
>> +       free(pixels);
>> +       return 1;
>> +}
>> +
>> +/**
>> + * Read a pixel from the given location and compare its RGB value to the
>> + * given expected values.
>> + *
>> + * Print a log message if the color value deviates from the expected value.
>> + * \return true if the color values match, false otherwise
>> + */
>> +int piglit_probe_pixel_rgb(int x, int y, const float* expected)
>> +{
>> +       GLubyte probe[3];
>> +       int i;
>> +       GLboolean pass = GL_TRUE;
>> +
>> +       glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, probe);
>> +
>> +
>> +       for(i = 0; i<  3; ++i) {
>> +               if (fabs(probe[i]/255.0 - expected[i])>= tolerance[i]) {
>> +                       pass = GL_FALSE;
>> +               }
>> +       }
>> +
>> +       if (pass)
>> +               return 1;
>> +
>> +       printf("Probe at (%i,%i)\n", x, y);
>> +       printf("  Expected: %f %f %f\n", expected[0], expected[1], expected[2]);
>> +       printf("  Observed: %f %f %f\n", probe[0]/255.0, probe[1]/255.0, probe[2]/255.0);
>> +
>> +       return 0;
>> +}
>> +
>> +int
>> +piglit_probe_rect_rgb(int x, int y, int w, int h, const float *expected)
>> +{
>> +       int i, j, p;
>> +       GLubyte *probe;
>> +       GLubyte *pixels = malloc(w*h*3*sizeof(GLubyte));
>> +
>> +       glReadPixels(x, y, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels);
>> +
>> +       for (j = 0; j<  h; j++) {
>> +               for (i = 0; i<  w; i++) {
>> +                       probe =&pixels[(j*w+i)*3];
>> +
>> +                       for (p = 0; p<  3; ++p) {
>> +                               if (fabs(probe[p]/255.0 - expected[p])>= tolerance[p]) {
>> +                                       printf("Probe at (%i,%i)\n", x+i, y+j);
>> +                                       printf("  Expected: %f %f %f\n",
>> +                                              expected[0], expected[1], expected[2]);
>> +                                       printf("  Observed: %f %f %f\n",
>> +                                              probe[0]/255.0, probe[1]/255.0, probe[2]/255.0);
>> +
>> +                                       free(pixels);
>> +                                       return 0;
>> +                               }
>> +                       }
>> +               }
>> +       }
>> +
>> +       free(pixels);
>> +       return 1;
>> +}
>> +
>> +/**
>> + * Convenience function to compile a GLSL shader from a file.
>> + */
>> +GLuint
>> +piglit_compile_shader(GLenum target, char *filename)
>> +{
>> +       GLuint prog;
>> +       struct stat st;
>> +       int err;
>> +       GLchar *prog_string;
>> +       FILE *f;
>> +       const char *source_dir;
>> +       char filename_with_path[FILENAME_MAX];
>> +
>> +       source_dir = getenv("PIGLIT_SOURCE_DIR");
>> +       if (source_dir == NULL) {
>> +               source_dir = "SOURCE_DIR";
>> +       }
>> +
>> +       snprintf(filename_with_path, FILENAME_MAX - 1,
>> +                "%s/tests/%s", source_dir, filename);
>> +       filename_with_path[FILENAME_MAX - 1] = 0;
>> +
>> +       err = stat(filename_with_path,&st);
>> +       if (err == -1) {
>> +               fprintf(stderr, "Couldn't stat program %s: %s\n", filename, strerror(errno));
>> +               fprintf(stderr, "You can override the source dir by setting the PIGLIT_SOURCE_DIR environment variable.\n");
>> +               exit(1);
>> +       }
>> +
>> +       prog_string = malloc(st.st_size + 1);
>> +       if (prog_string == NULL) {
>> +               fprintf(stderr, "malloc\n");
>> +               exit(1);
>> +       }
>> +
>> +       f = fopen(filename_with_path, "r");
>> +       if (f == NULL) {
>> +               fprintf(stderr, "Couldn't open program: %s\n", strerror(errno));
>> +               exit(1);
>> +       }
>> +       fread(prog_string, 1, st.st_size, f);
>> +       prog_string[st.st_size] = '\0';
>> +       fclose(f);
>> +
>> +       prog = piglit_compile_shader_text(target, prog_string);
>> +
>> +       free(prog_string);
>> +
>> +       return prog;
>> +}
>> +
>> +/**
>> + * Convenience function to compile a GLSL shader.
>> + */
>> +GLuint
>> +piglit_compile_shader_text(GLenum target, const char *text)
>> +{
>> +       GLuint prog;
>> +       GLint ok;
>> +
>> +       prog = glCreateShader(target);
>> +       glShaderSource(prog, 1, (const GLchar **)&text, NULL);
>> +       glCompileShader(prog);
>> +
>> +       glGetShaderiv(prog, GL_COMPILE_STATUS,&ok);
>> +
>> +       {
>> +               GLchar *info;
>> +               GLint size;
>> +
>> +               glGetShaderiv(prog, GL_INFO_LOG_LENGTH,&size);
>> +               info = malloc(size);
>> +
>> +               glGetShaderInfoLog(prog, size, NULL, info);
>> +               if (!ok) {
>> +                       fprintf(stderr, "Failed to compile %s: %s\n",
>> +                               target == GL_FRAGMENT_SHADER ? "FS" : "VS",
>> +                               info);
>> +               }
>> +               else if (0) {
>> +                       /* Enable this to get extra compilation info.
>> +                        * Even if there's no compilation errors, the info
>> +                        * log may have some remarks.
>> +                        */
>> +                       fprintf(stderr, "Shader compiler warning: %s\n", info);
>> +               }
>> +               free(info);
>> +       }
>> +
>> +       return prog;
>> +}
>> +
>> +GLboolean
>> +piglit_link_check_status(GLint prog)
>> +{
>> +       GLchar *info;
>> +       GLint size;
>> +       GLint ok;
>> +
>> +       glGetProgramiv(prog, GL_LINK_STATUS,&ok);
>> +
>> +       glGetProgramiv(prog, GL_INFO_LOG_LENGTH,&size);
>> +       info = malloc(size);
>> +
>> +       glGetProgramInfoLog(prog, size, NULL, info);
>> +       if (!ok) {
>> +               fprintf(stderr, "Failed to link: %s\n", info);
>> +       }
>> +       else if (0) {
>> +               /* Enable this to get extra linking info.
>> +                * Even if there's no link errors, the info log may
>> +                * have some remarks.
>> +                */
>> +               fprintf(stderr, "Linker warning: %s\n", info);
>> +       }
>> +
>> +       free(info);
>> +
>> +       return ok;
>> +}
>> +
>> +GLint piglit_link_simple_program(GLint vs, GLint fs)
>> +{
>> +       GLint prog;
>> +
>> +       prog = glCreateProgram();
>> +       glBindAttribLocation(prog, attr_pos, "piglit_Position");
>> +       glBindAttribLocation(prog, attr_tex, "piglit_TexCoord");
>> +       glBindAttribLocation(prog, attr_color, "piglit_Color");
>> +
>> +       if (fs)
>> +               glAttachShader(prog, fs);
>> +       if (vs)
>> +               glAttachShader(prog, vs);
>> +       glLinkProgram(prog);
>> +
>> +       piglit_link_check_status(prog);
>> +
>> +
>> +       return prog;
>> +}
>> +
>> +void
>> +piglit_escape_exit_key(unsigned char key, int x, int y)
>> +{
>> +       (void) x;
>> +       (void) y;
>> +       switch (key) {
>> +               case 27:
>> +                       exit(0);
>> +                       break;
>> +       }
>> +}
>> +
>> +/**
>> + * Convenience function to draw an axis-aligned rectangle.
>> + */
>> +GLvoid
>> +piglit_draw_rect(float x, float y, float w, float h)
>> +{
>> +       float verts[4][4];
>> +
>> +       verts[0][0] = x;
>> +       verts[0][1] = y;
>> +       verts[0][2] = 0.0;
>> +       verts[0][3] = 1.0;
>> +       verts[1][0] = x + w;
>> +       verts[1][1] = y;
>> +       verts[1][2] = 0.0;
>> +       verts[1][3] = 1.0;
>> +       verts[2][0] = x;
>> +       verts[2][1] = y + h;
>> +       verts[2][2] = 0.0;
>> +       verts[2][3] = 1.0;
>> +       verts[3][0] = x + w;
>> +       verts[3][1] = y + h;
>> +       verts[3][2] = 0.0;
>> +       verts[3][3] = 1.0;
>> +
>> +       glVertexAttribPointer(attr_pos, 4, GL_FLOAT, GL_FALSE, 0, verts);
>> +       glEnableVertexAttribArray(attr_pos);
>> +
>> +       glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
>> +
>> +       glDisableVertexAttribArray(attr_pos);
>> +}
>> +
>> +/**
>> + * Convenience function to draw an axis-aligned rectangle.
>> + */
>> +GLvoid
>> +piglit_draw_rect_z(float z, float x, float y, float w, float h)
>> +{
>> +       float verts[4][4];
>> +
>> +       verts[0][0] = x;
>> +       verts[0][1] = y;
>> +       verts[0][2] = z;
>> +       verts[0][3] = 1.0;
>> +       verts[1][0] = x + w;
>> +       verts[1][1] = y;
>> +       verts[1][2] = z;
>> +       verts[1][3] = 1.0;
>> +       verts[2][0] = x;
>> +       verts[2][1] = y + h;
>> +       verts[2][2] = z;
>> +       verts[2][3] = 1.0;
>> +       verts[3][0] = x + w;
>> +       verts[3][1] = y + h;
>> +       verts[3][2] = z;
>> +       verts[3][3] = 1.0;
>> +
>> +       glVertexAttribPointer(attr_pos, 4, GL_FLOAT, GL_FALSE, 0, verts);
>> +       glEnableVertexAttribArray(attr_pos);
>> +
>> +       glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
>> +
>> +       glDisableVertexAttribArray(attr_pos);
>> +}
>> +
>> +/**
>> + * Convenience function to draw an axis-aligned rectangle
>> + * with texture coordinates.
>> + */
>> +GLvoid
>> +piglit_draw_rect_tex(float x, float y, float w, float h,
>> +                     float tx, float ty, float tw, float th)
>> +{
>> +       float verts[4][4];
>> +       float tex[4][2];
>> +
>> +       verts[0][0] = x;
>> +       verts[0][1] = y;
>> +       verts[0][2] = 0.0;
>> +       verts[0][3] = 1.0;
>> +       tex[0][0] = tx;
>> +       tex[0][1] = ty;
>> +       verts[1][0] = x + w;
>> +       verts[1][1] = y;
>> +       verts[1][2] = 0.0;
>> +       verts[1][3] = 1.0;
>> +       tex[1][0] = tx + tw;
>> +       tex[1][1] = ty;
>> +       verts[2][0] = x + w;
>> +       verts[2][1] = y + h;
>> +       verts[2][2] = 0.0;
>> +       verts[2][3] = 1.0;
>> +       tex[2][0] = tx + tw;
>> +       tex[2][1] = ty + th;
>> +       verts[3][0] = x;
>> +       verts[3][1] = y + h;
>> +       verts[3][2] = 0.0;
>> +       verts[3][3] = 1.0;
>> +       tex[3][0] = tx;
>> +       tex[3][1] = ty + th;
>> +
>> +       glVertexAttribPointer(attr_pos, 4, GL_FLOAT, GL_FALSE, 0, verts);
>> +       glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, tex);
>> +       glEnableVertexAttribArray(attr_pos);
>> +       glEnableVertexAttribArray(attr_tex);
>> +
>> +       glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
>> +
>> +       glDisableVertexAttribArray(attr_pos);
>> +       glDisableVertexAttribArray(attr_tex);
>> +}
>> +
>> +
>> +/**
>> + * Generate a checkerboard texture
>> + *
>> + * \param tex                Name of the texture to be used.  If \c tex is
>> + *                           zero, a new texture name will be generated.
>> + * \param level              Mipmap level the checkerboard should be written to
>> + * \param width              Width of the texture image
>> + * \param height             Height of the texture image
>> + * \param horiz_square_size  Size of each checkerboard tile along the X axis
>> + * \param vert_square_size   Size of each checkerboard tile along the Y axis
>> + * \param black              RGBA color to be used for "black" tiles
>> + * \param white              RGBA color to be used for "white" tiles
>> + *
>> + * A texture with alternating black and white squares in a checkerboard
>> + * pattern is generated.  The texture data is written to LOD \c level of
>> + * the texture \c tex.
>> + *
>> + * If \c tex is zero, a new texture created.  This texture will have several
>> + * texture parameters set to non-default values:
>> + *
>> + *  - S and T wrap modes will be set to \c GL_CLAMP_TO_BORDER.
>> + *  - Border color will be set to { 1.0, 0.0, 0.0, 1.0 }.
>> + *  - Min and mag filter will be set to \c GL_NEAREST.
>> + *
>> + * \return
>> + * Name of the texture.  In addition, this texture will be bound to the
>> + * \c GL_TEXTURE_2D target of the currently active texture unit.
>> + */
>> +GLuint
>> +piglit_checkerboard_texture(GLuint tex, unsigned level,
>> +                           unsigned width, unsigned height,
>> +                           unsigned horiz_square_size,
>> +                           unsigned vert_square_size,
>> +                           const float *black, const float *white)
>> +{
>> +       unsigned i;
>> +       unsigned j;
>> +
>> +       float *const tex_data = malloc(width * height * (4 * sizeof(float)));
>> +       float *texel = tex_data;
>> +
>> +       for (i = 0; i<  height; i++) {
>> +               const unsigned row = i / vert_square_size;
>> +
>> +               for (j = 0; j<  width; j++) {
>> +                       const unsigned col = j / horiz_square_size;
>> +
>> +                       if ((row ^ col)&  1) {
>> +                               memcpy(texel, white, 4 * sizeof(float));
>> +                       } else {
>> +                               memcpy(texel, black, 4 * sizeof(float));
>> +                       }
>> +
>> +                       texel += 4;
>> +               }
>> +       }
>> +
>> +
>> +       if (tex == 0) {
>> +               glGenTextures(1,&tex);
>> +
>> +               glBindTexture(GL_TEXTURE_2D, tex);
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
>> +                               GL_NEAREST);
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
>> +                               GL_NEAREST);
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
>> +                               GL_CLAMP_TO_EDGE);
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
>> +                               GL_CLAMP_TO_EDGE);
>> +       } else {
>> +               glBindTexture(GL_TEXTURE_2D, tex);
>> +       }
>> +
>> +       glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, width, height, 0, GL_RGBA,
>> +                    GL_FLOAT, tex_data);
>> +
>> +       return tex;
>> +}
>> +
>> +/**
>> + * Generates a texture with the given internalFormat, w, h with a
>> + * teximage of r, g, b w quadrants.
>> + *
>> + * Note that for compressed teximages, where the blocking would be
>> + * problematic, we assign the whole layers at w == 4 to red, w == 2 to
>> + * green, and w == 1 to blue.
>> + */
>> +GLuint
>> +piglit_rgbw_texture(GLenum format, int w, int h, GLboolean mip,
>> +                   GLboolean alpha)
>> +{
>> +       GLfloat *data;
>> +       int size, x, y, level;
>> +       GLuint tex;
>> +       float red[4]   = {1.0, 0.0, 0.0, 0.0};
>> +       float green[4] = {0.0, 1.0, 0.0, 0.25};
>> +       float blue[4]  = {0.0, 0.0, 1.0, 0.5};
>> +       float white[4] = {1.0, 1.0, 1.0, 1.0};
>> +
>> +       if (!alpha) {
>> +               red[3] = 1.0;
>> +               green[3] = 1.0;
>> +               blue[3] = 1.0;
>> +               white[3] = 1.0;
>> +       }
>> +
>> +       glGenTextures(1,&tex);
>> +       glBindTexture(GL_TEXTURE_2D, tex);
>> +       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
>> +       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
>> +       if (mip) {
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
>> +                               GL_LINEAR);
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
>> +                               GL_LINEAR_MIPMAP_NEAREST);
>> +       } else {
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
>> +                               GL_NEAREST);
>> +               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
>> +                               GL_NEAREST);
>> +       }
>> +       data = malloc(w * h * 4 * sizeof(GLfloat));
>> +
>> +       /* XXX: Do we want non-square textures?  Surely some day. */
>> +       assert(w == h);
>> +
>> +       for (level = 0, size = w; size>  0; level++, size>>= 1) {
>> +               for (y = 0; y<  size; y++) {
>> +                       for (x = 0; x<  size; x++) {
>> +                               const float *color;
>> +
>> +                               if (x<  size / 2&&  y<  size / 2)
>> +                                       color = red;
>> +                               else if (y<  size / 2)
>> +                                       color = green;
>> +                               else if (x<  size / 2)
>> +                                       color = blue;
>> +                               else
>> +                                       color = white;
>> +
>> +                               memcpy(data + (y * size + x) * 4, color,
>> +                                      4 * sizeof(float));
>> +                       }
>> +               }
>> +               glTexImage2D(GL_TEXTURE_2D, level,
>> +                            format,
>> +                            size, size, 0,
>> +                            GL_RGBA, GL_FLOAT, data);
>> +
>> +               if (!mip)
>> +                       break;
>> +       }
>> +       free(data);
>> +       return tex;
>> +}
>> +
>> +#ifndef HAVE_STRCHRNUL
>> +char *strchrnul(const char *s, int c)
>> +{
>> +       char *t = strchr(s, c);
>> +
>> +       return (t == NULL) ? ((char *) s + strlen(s)) : t;
>> +}
>> +#endif
>> diff --git a/tests/util/egl/piglit-egl-util.h b/tests/util/egl/piglit-egl-util.h
>> new file mode 100644
>> index 0000000..80f7d4d
>> --- /dev/null
>> +++ b/tests/util/egl/piglit-egl-util.h
>> @@ -0,0 +1,102 @@
>> +/*
>> + * Copyright (c) The Piglit project 2007
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * on the rights to use, copy, modify, merge, publish, distribute, sub
>> + * license, and/or sell copies of the Software, and to permit persons to whom
>> + * the Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including the next
>> + * paragraph) shall be included in all copies or substantial portions of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
>> + * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
>> + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
>> + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
>> + * USE OR OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +#if defined(_MSC_VER)
>> +#include<windows.h>
>> +
>> +typedef __int32 int32_t;
>> +typedef __int64 int64_t;
>> +typedef unsigned __int8 uint8_t;
>> +typedef unsigned __int32 uint32_t;
>> +typedef unsigned __int64 uint64_t;
>> +#else
>> +#include<stdint.h>
>> +#endif
>> +
>> +#include<assert.h>
>> +#include<string.h>
>> +#include<stdio.h>
>> +#include<stdlib.h>
>> +#include<math.h>
>> +#include<GLES2/gl2.h>
>> +
>> +#if defined(_MSC_VER)
>> +
>> +#define snprintf sprintf_s
>> +
>> +#define piglit_get_proc_address(x) wglGetProcAddress(x)
>> +#else
>> +#define piglit_get_proc_address(x) glutGetProcAddress(x)
>> +#endif
>> +
>> +enum piglit_result {
>> +       PIGLIT_SUCCESS,
>> +       PIGLIT_FAILURE,
>> +       PIGLIT_SKIP,
>> +       PIGLIT_WARN
>> +};
>> +
>> +#include "piglit-egl-framework.h"
>> +
>> +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
>> +
>> +extern const uint8_t fdo_bitmap[];
>> +extern const unsigned int fdo_bitmap_width;
>> +extern const unsigned int fdo_bitmap_height;
>> +
>> +int FindLine(const char *program, int position);
>> +void piglit_report_result(enum piglit_result result);
>> +void piglit_require_extension(const char *name);
>> +void piglit_require_not_extension(const char *name);
>> +int piglit_probe_pixel_rgb(int x, int y, const float* expected);
>> +int piglit_probe_pixel_rgba(int x, int y, const float* expected);
>> +int piglit_probe_rect_rgb(int x, int y, int w, int h, const float* expected);
>> +int piglit_probe_rect_rgba(int x, int y, int w, int h, const float* expected);
>> +
>> +GLuint piglit_compile_shader(GLenum target, char *filename);
>> +GLuint piglit_compile_shader_text(GLenum target, const char *text);
>> +GLboolean piglit_link_check_status(GLint prog);
>> +GLint piglit_link_simple_program(GLint vs, GLint fs);
>> +GLvoid piglit_draw_rect(float x, float y, float w, float h);
>> +GLvoid piglit_draw_rect_z(float z, float x, float y, float w, float h);
>> +GLvoid piglit_draw_rect_tex(float x, float y, float w, float h,
>> +                            float tx, float ty, float tw, float th);
>> +void piglit_escape_exit_key(unsigned char key, int x, int y);
>> +
>> +char *piglit_load_text_file(const char *file_name, unsigned *size);
>> +
>> +GLuint piglit_checkerboard_texture(GLuint tex, unsigned level,
>> +    unsigned width, unsigned height,
>> +    unsigned horiz_square_size, unsigned vert_square_size,
>> +    const float *black, const float *white);
>> +GLuint piglit_rgbw_texture(GLenum format, int w, int h, GLboolean mip,
>> +                   GLboolean alpha);
>> +void piglit_set_tolerance_for_bits(int rbits, int gbits, int bbits, int abits);
>> +
>> +extern GLfloat cube_face_texcoords[6][4][3];
>> +extern const char *cube_face_names[6];
>> +extern const GLenum cube_face_targets[6];
>> +
>> +#ifndef HAVE_STRCHRNUL
>> +char *strchrnul(const char *s, int c);
>> +#endif
>> --
>> 1.7.2.3
>>
>> _______________________________________________
>> Piglit mailing list
>> Piglit at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/piglit
>>



More information about the Piglit mailing list