while writing softpipe support I realised we didn't have tests for any of this, this just adds a new parameter to texwrap to test texture offsets,
Signed-off-by: Dave Airlie <airl...@redhat.com> --- tests/texturing/texwrap.c | 66 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/tests/texturing/texwrap.c b/tests/texturing/texwrap.c index 7be19a5..ef9a63c 100644 --- a/tests/texturing/texwrap.c +++ b/tests/texturing/texwrap.c @@ -568,6 +568,7 @@ static GLuint texture_id; static GLenum texture_target; static GLboolean texture_npot; static GLboolean texture_proj; +static GLboolean texture_offset; static GLboolean test_border_color; static GLboolean texture_swizzle; static GLboolean has_texture_swizzle; @@ -575,8 +576,8 @@ static GLboolean has_npot; static const struct test_desc *test; static const struct format_desc *init_format; static int size_x = 1, size_y = 1, size_z = 1; -static GLuint prog_int, prog_uint; -static GLint int_scale_loc, uint_scale_loc; +static GLuint prog_int, prog_uint, prog_offset; +static GLint int_scale_loc, uint_scale_loc, use_offset_loc, int_use_offset_loc, uint_use_offset_loc; /* Image data. */ static const int swizzle[4] = {2, 0, 1, 3}; @@ -636,6 +637,11 @@ static void sample_nearest(int x, int y, int z, coords[2] = 0; } + if (texture_offset) { + coords[0] -= 3; + if (texture_target != GL_TEXTURE_1D) + coords[1] += 3; + } /* Handle clamp mirroring. */ switch (wrap_mode) { case GL_MIRROR_CLAMP_EXT: @@ -862,6 +868,10 @@ static void draw(const struct format_desc *format, scale[0] = scale[1] = scale[2] = scale[3] = 1.0/((1ull << (bits-1))-1); glUseProgram(prog_int); glUniform4fv(int_scale_loc, 1, scale); + if (texture_offset) + glUniform1f(int_use_offset_loc, 1.0); + else + glUniform1f(int_use_offset_loc, 0.0); break; case UINT_TYPE: scale[0] = scale[1] = scale[2] = scale[3] = 1.0/((1ull << bits)-1); @@ -870,8 +880,16 @@ static void draw(const struct format_desc *format, } glUseProgram(prog_uint); glUniform4fv(uint_scale_loc, 1, scale); + if (texture_offset) + glUniform1f(uint_use_offset_loc, 1.0); + else + glUniform1f(uint_use_offset_loc, 0.0); break; default:; + if (texture_offset) { + glUseProgram(prog_offset); + glUniform1f(use_offset_loc, 1.0); + } } /* Loop over min/mag filters. */ @@ -965,6 +983,8 @@ static void draw(const struct format_desc *format, glUseProgram(0); break; default:; + if (texture_offset) + glUseProgram(0); } glDisable(texture_target); @@ -1660,18 +1680,41 @@ static const char *fp_int = "#version 130 \n" "uniform isampler2D tex; \n" "uniform vec4 scale; \n" + "uniform bool use_offset; \n" "void main() \n" "{ \n" + " if (use_offset) { \n" + " gl_FragColor = vec4(textureOffset(tex, gl_TexCoord[0].xy, ivec2(-3, 3))) * scale; \n" + " } else { \n" " gl_FragColor = vec4(texture(tex, gl_TexCoord[0].xy)) * scale; \n" + " } \n" "} \n"; static const char *fp_uint = "#version 130 \n" "uniform usampler2D tex; \n" "uniform vec4 scale; \n" + "uniform bool use_offset; \n" "void main() \n" "{ \n" + " if (use_offset) { \n" + " gl_FragColor = vec4(textureOffset(tex, gl_TexCoord[0].xy, ivec2(-3, 3)) * scale; \n" + " } else { \n" " gl_FragColor = vec4(texture(tex, gl_TexCoord[0].xy)) * scale; \n" + " } \n" + "} \n"; + +static const char *fp_offset = + "#version 130 \n" + "uniform sampler2D tex; \n" + "uniform bool use_offset; \n" + "void main() \n" + "{ \n" + " if (use_offset) { \n" + " gl_FragColor = textureOffset(tex, gl_TexCoord[0].xy, ivec2(-3, 3)); \n" + " } else { \n" + " gl_FragColor = texture(tex, gl_TexCoord[0].xy); \n" + " } \n" "} \n"; void piglit_init(int argc, char **argv) @@ -1721,6 +1764,11 @@ void piglit_init(int argc, char **argv) printf("Using projective mapping.\n"); continue; } + if (strcmp(argv[p], "offset") == 0) { + texture_offset = 1; + printf("Using texture offsets.\n"); + continue; + } if (strcmp(argv[p], "bordercolor") == 0) { test_border_color = 1; printf("Testing the border color only.\n"); @@ -1796,6 +1844,16 @@ outer_continue:; glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); + if (texture_offset) { + piglit_require_GLSL_version(130); + fp = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fp_offset); + assert(fp); + prog_offset = piglit_link_simple_program(0, fp); + assert(prog_offset); + use_offset_loc = glGetUniformLocation(prog_offset, "use_offset"); + assert(use_offset_loc != -1); + } + switch (test->format[0].type) { case INT_TYPE: case UINT_TYPE: @@ -1806,6 +1864,8 @@ outer_continue:; assert(prog_int); int_scale_loc = glGetUniformLocation(prog_int, "scale"); assert(int_scale_loc != -1); + int_use_offset_loc = glGetUniformLocation(prog_int, "use_offset"); + assert(int_use_offset_loc != -1); fp = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fp_uint); assert(fp); @@ -1813,6 +1873,8 @@ outer_continue:; assert(prog_uint); uint_scale_loc = glGetUniformLocation(prog_uint, "scale"); assert(uint_scale_loc != -1); + uint_use_offset_loc = glGetUniformLocation(prog_uint, "use_offset"); + assert(uint_use_offset_loc != -1); break; default:; } -- 2.1.0 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit