From: Ian Romanick <ian.d.roman...@intel.com>

Future patches will make use of these utility functions.  The shaders
also need to be reduced to GLSL 1.10 because that's all that's required
by OpenGL 2.0.

Signed-off-by: Ian Romanick <ian.d.roman...@intel.com>
---
 tests/spec/arb_direct_state_access/dsa-textures.c |  10 +-
 tests/spec/arb_direct_state_access/dsa-utils.c    | 181 +++++++++++++++++++---
 tests/spec/arb_direct_state_access/dsa-utils.h    |   6 +-
 3 files changed, 171 insertions(+), 26 deletions(-)

diff --git a/tests/spec/arb_direct_state_access/dsa-textures.c 
b/tests/spec/arb_direct_state_access/dsa-textures.c
index cc519e4..29661c0 100644
--- a/tests/spec/arb_direct_state_access/dsa-textures.c
+++ b/tests/spec/arb_direct_state_access/dsa-textures.c
@@ -40,6 +40,8 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
 
 PIGLIT_GL_TEST_CONFIG_END
 
+static GLuint prog;
+
 GLfloat*
 random_image_data(void)
 {
@@ -61,7 +63,7 @@ piglit_init(int argc, char **argv)
 
        printf("Using driver %s.\n", (const char *) glGetString(GL_VERSION));
 
-       dsa_init_program();
+       prog = dsa_create_program(GL_TEXTURE_2D);
 }
 
 enum piglit_result
@@ -80,12 +82,12 @@ piglit_display(void)
        glTextureParameteri(name, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 
        /* Draw the image */
-       piglit_ortho_projection(piglit_width, piglit_height, false);
-       dsa_texture_with_unit(texunit);
+       dsa_texture_with_unit(prog, texunit);
        glEnable(GL_TEXTURE_2D);
+       glUseProgram(prog);
        glBindTextureUnit(texunit, name);
        pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
-       piglit_draw_rect_tex(0, 0, piglit_width, piglit_height, 0, 0, 1, 1);
+       piglit_draw_rect_tex(-1.0, -1.0, 2.0, 2.0, 0.0, 0.0, 1.0, 1.0);
        pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
        /* Check to make sure the image was drawn correctly */
diff --git a/tests/spec/arb_direct_state_access/dsa-utils.c 
b/tests/spec/arb_direct_state_access/dsa-utils.c
index fefbae1..727751d 100644
--- a/tests/spec/arb_direct_state_access/dsa-utils.c
+++ b/tests/spec/arb_direct_state_access/dsa-utils.c
@@ -35,43 +35,184 @@
  * These duplicate fixed-function gl 1.0 pipeline shading.
  * Adapted from arb_clear_texture/3d.c.
  */
-static const char dsa_vs_source[] =
-       "#version 120\n"
+static const char vs_template[] =
+       "#version %s\n"
+       "#if __VERSION__ < 130\n"
        "attribute vec4 piglit_vertex;\n"
-       "attribute vec4 piglit_texcoord;\n"
+       "attribute vec2 piglit_texcoord;\n"
        "varying vec2 tex_coord;\n"
+       "#else\n"
+       "in vec4 piglit_vertex;\n"
+       "in vec2 piglit_texcoord;\n"
+       "out vec2 tex_coord;\n"
+       "#endif\n"
+       "uniform mat3 xform;\n"
        "\n"
        "void main()\n"
        "{\n"
-       "        gl_Position = gl_ModelViewProjectionMatrix\n"
-       "               * piglit_vertex;\n"
-       "        tex_coord = piglit_texcoord.st;\n"
-       "}\n";
+       "        gl_Position = vec4((xform * piglit_vertex.xyw).xy, 0, 1);\n"
+       "        tex_coord = piglit_texcoord;\n"
+       "}\n"
+       ;
 
-static const char dsa_fs_source[] =
-       "#version 120\n"
+static const char fs_1d_template[] =
+       "#version %s\n"
+       "#if __VERSION__ < 130\n"
+       "#define piglit_color gl_FragColor\n"
+       "#define texture(s,t) texture1D(s,t)\n"
+       "varying vec2 tex_coord;\n"
+       "#else\n"
+       "out vec4 piglit_color;\n"
+       "in vec2 tex_coord;\n"
+       "#endif\n"
+       "uniform sampler1D tex;\n"
+       "\n"
+       "void main()\n"
+       "{\n"
+       "        piglit_color = texture(tex, tex_coord.x);\n"
+       "}\n"
+       ;
+
+static const char fs_2d_template[] =
+       "#version %s\n"
+       "#if __VERSION__ < 130\n"
+       "#define piglit_color gl_FragColor\n"
+       "#define texture(s,t) texture2D(s,t)\n"
+       "varying vec2 tex_coord;\n"
+       "#else\n"
+       "out vec4 piglit_color;\n"
+       "in vec2 tex_coord;\n"
+       "#endif\n"
        "uniform sampler2D tex;\n"
+       "\n"
+       "void main()\n"
+       "{\n"
+       "        gl_FragColor = texture(tex, tex_coord);\n"
+       "}\n"
+       ;
+
+static const char fs_3d_template[] =
+       "#version %s\n"
+       "#if __VERSION__ < 130\n"
+       "#define piglit_color gl_FragColor\n"
+       "#define texture(s,t) texture3D(s,t)\n"
+       "varying vec2 tex_coord;\n"
+       "#else\n"
+       "out vec4 piglit_color;\n"
+       "in vec2 tex_coord;\n"
+       "#endif\n"
+       "uniform sampler3D tex;\n"
+       "\n"
+       "void main()\n"
+       "{\n"
+       "        piglit_color = texture(tex, vec3(tex_coord, 0));\n"
+       "}\n"
+       ;
+
+static const char fs_rect_template[] =
+       "#version %s\n"
+       "#if __VERSION__ < 130\n"
+       "#define piglit_color gl_FragColor\n"
+       "#define texture(s,t) texture2DRect(s,t)\n"
        "varying vec2 tex_coord;\n"
+       "#else\n"
+       "out vec4 piglit_color;\n"
+       "in vec2 tex_coord;\n"
+       "#endif\n"
+       "uniform sampler2DRect tex;\n"
        "\n"
        "void main()\n"
        "{\n"
-       "        gl_FragColor = texture2D(tex, tex_coord);\n"
-       "}\n";
+       "        piglit_color = texture(tex, tex_coord);\n"
+       "}\n"
+       ;
 
-static GLuint dsa_prog;
-static GLuint dsa_uniform;
+GLuint
+dsa_create_program(GLenum target)
+{
+       char *fs_source;
+       char *vs_source;
+       GLuint prog;
+       bool es;
+       int major;
+       int minor;
+       const char * ver;
+       GLint loc;
+       GLfloat xform[9];
+
+       piglit_get_glsl_version(&es, &major, &minor);
+       ver = ((major * 100 + minor) >= 140) ? "140" : "110";
+
+       asprintf(&vs_source, vs_template, ver);
+       switch (target) {
+       case GL_TEXTURE_1D:
+               asprintf(&fs_source, fs_1d_template, ver);
+               break;
+       case GL_TEXTURE_2D:
+               asprintf(&fs_source, fs_2d_template, ver);
+               break;
+       case GL_TEXTURE_3D:
+               asprintf(&fs_source, fs_3d_template, ver);
+               break;
+       case GL_TEXTURE_RECTANGLE_ARB:
+               asprintf(&fs_source, fs_rect_template, ver);
+               break;
+       default:
+               fprintf(stderr, "Invalid texture target in %s\n", __func__);
+               piglit_report_result(PIGLIT_FAIL);
+       }
+
+       prog = piglit_build_simple_program(vs_source, fs_source);
+       free(vs_source);
+       free(fs_source);
+
+       /* Note: the default value for all uniforms after linking is zero, so
+        * there is no need to explicitly set it here.  However, the xform
+        * matrix needs to be set to the identity matrix.
+        */
+       loc = glGetUniformLocation(prog, "xform");
+
+       xform[0] = 1.0;
+       xform[1] = 0.0;
+       xform[2] = 0.0;
+
+       xform[3] = 0.0;
+       xform[4] = 1.0;
+       xform[5] = 0.0;
+
+       xform[6] = 0.0;
+       xform[7] = 0.0;
+       xform[8] = 1.0;
+
+       glProgramUniformMatrix3fv(prog, loc, 1, GL_FALSE, xform);
+
+       return prog;
+}
 
 void
-dsa_init_program(void)
+dsa_texture_with_unit(GLuint prog, GLuint unit)
 {
-       dsa_prog = piglit_build_simple_program(dsa_vs_source, dsa_fs_source);
-       glUseProgram(dsa_prog);
-       dsa_uniform = glGetUniformLocation(dsa_prog, "tex");
-       glUniform1i(dsa_uniform, 0);
+       const GLuint loc = glGetUniformLocation(prog, "tex");
+       glProgramUniform1i(prog, loc, unit);
 }
 
 void
-dsa_texture_with_unit(GLuint unit)
+dsa_set_xform(GLuint prog, int width, int height)
 {
-       glUniform1i(dsa_uniform, unit);
+       const GLint loc = glGetUniformLocation(prog, "xform");
+       GLfloat xform[9];
+
+       xform[0] = 2.0 / width;
+       xform[1] = 0.0;
+       xform[2] = 0.0;
+
+       xform[3] = 0.0;
+       xform[4] = 2.0 / height;
+       xform[5] = 0.0;
+
+       xform[6] = -1.0;
+       xform[7] = -1.0;
+       xform[8] = 1.0;
+
+       glProgramUniformMatrix3fv(prog, loc, 1, GL_FALSE, xform);
 }
diff --git a/tests/spec/arb_direct_state_access/dsa-utils.h 
b/tests/spec/arb_direct_state_access/dsa-utils.h
index 7bcf004..1f84f95 100644
--- a/tests/spec/arb_direct_state_access/dsa-utils.h
+++ b/tests/spec/arb_direct_state_access/dsa-utils.h
@@ -55,9 +55,11 @@ do { \
                                     __VA_ARGS__); \
 } while (0)
 
-void dsa_init_program(void);
+GLuint dsa_create_program(GLenum target);
 
-void dsa_texture_with_unit(GLuint);
+void dsa_texture_with_unit(GLuint prog, GLuint unit);
+
+void dsa_set_xform(GLuint prog, int width, int height);
 
 #ifdef __cplusplus
 } /* end extern "C" */
-- 
2.1.0

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to