[Piglit] [PATCH 04/14] arb_direct_state_access: Make dsa-utils more general
Ian Romanick
idr at freedesktop.org
Wed Sep 9 13:20:57 PDT 2015
From: Ian Romanick <ian.d.romanick at 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.romanick at 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
More information about the Piglit
mailing list