[Piglit] [PATCH] glsl-1.30: add basic test for testing textureOffset functionality.
Roland Scheidegger
rscheidegger_lists at hispeed.ch
Tue Mar 5 10:03:57 PST 2013
Am 05.03.2013 17:05, schrieb Brian Paul:
> On 03/05/2013 08:37 AM, sroland at vmware.com wrote:
>> From: Roland Scheidegger<sroland at vmware.com>
>>
>> This is pretty rough and doesn't really test all that much (just
>> textureOffsetLod, but there's other texturing functions with offsets),
>> doesn't test different wrap modes, NPOT sizes etc., but there's no
>> other test using "ordinary" texture opcodes and texel offsets, so
>> it's a start (and in fact it exposed a bug in the mesa state tracker).
>> Tested with llvmpipe (pass) and softpipe (fail) which is as expected -
>> hopefully the math is ok...
>> Inspired from fs-texelFetchOffset.
>> ---
>> tests/spec/glsl-1.30/execution/CMakeLists.gl.txt | 1 +
>> .../spec/glsl-1.30/execution/fs-textureOffset-2D.c | 158
>> ++++++++++++++++++++
>> 2 files changed, 159 insertions(+)
>> create mode 100644 tests/spec/glsl-1.30/execution/fs-textureOffset-2D.c
>>
>> diff --git a/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
>> b/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
>> index 6737bb1..3c0b2d5 100644
>> --- a/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
>> +++ b/tests/spec/glsl-1.30/execution/CMakeLists.gl.txt
>> @@ -13,6 +13,7 @@ link_libraries (
>> piglit_add_executable (fs-discard-exit-2 fs-discard-exit-2.c)
>> piglit_add_executable (fs-texelFetch-2D fs-texelFetch-2D.c)
>> piglit_add_executable (fs-texelFetchOffset-2D fs-texelFetchOffset-2D.c)
>> +piglit_add_executable (fs-textureOffset-2D fs-textureOffset-2D.c)
>> IF (NOT MSVC)
>> piglit_add_executable (isinf-and-isnan isinf-and-isnan.c)
>> ENDIF (NOT MSVC)
>> diff --git a/tests/spec/glsl-1.30/execution/fs-textureOffset-2D.c
>> b/tests/spec/glsl-1.30/execution/fs-textureOffset-2D.c
>> new file mode 100644
>> index 0000000..4c050fb
>> --- /dev/null
>> +++ b/tests/spec/glsl-1.30/execution/fs-textureOffset-2D.c
>> @@ -0,0 +1,158 @@
>> +/*
>> + * Copyright 2013 VMware, Inc.
>> + *
>> + * 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.
>> + */
>> +
>> +/**
>> + * \file fs-textureOffset-2D.c
>> + *
>> + * Tests the built-in function textureLodOffset() in the fragment
>> shader.
>> + *
>> + * Creates a mipmapped 64x32 2D texture and draws a series of squares
>> whose
>> + * color contains a texel fetched from each quadrant of the rgbw
>> texture.
>> + *
>> + * Author: Roland Scheidegger
>> + */
>> +#include "piglit-util-gl-common.h"
>> +
>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>> +
>> + config.supports_gl_compat_version = 10;
>> +
>> + config.window_width = 90;
>> + config.window_height = 150;
>
> width=90 might cause trouble on Windows. Windows will bump up the size
> to 120 pixels (IIRC). This has caused other tests to fail in the past.
Ok, I'll bump it up to 120.
>
>
>> + config.window_visual = PIGLIT_GL_VISUAL_RGBA |
>> PIGLIT_GL_VISUAL_DOUBLE;
>> +
>> +PIGLIT_GL_TEST_CONFIG_END
>> +
>> +const int tex_size = 64;
>> +
>> +static int pos_location, lod_location;
>> +
>> +static const char vert[] =
>> +"#version 130\n"
>> +"void main()\n"
>> +"{\n"
>> +" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
>> +"}\n";
>> +
>> +static const char fragtexlodoffset[] =
>> +"#version 130\n"
>> +"uniform vec2 pos;\n"
>> +"uniform float lod;\n"
>> +"uniform sampler2D tex;\n"
>> +"void main()\n"
>> +"{\n"
>> +" const ivec2 offset = ivec2(-2, 2);\n"
>> +" vec4 texel = textureLodOffset(tex, pos, lod, offset);\n"
>> +" gl_FragColor = texel;\n"
>> +"}\n";
>> +
>> +#ifdef _MSC_VER
>> +#undef max
>> +#endif
>> +static float max(float x, float y) { return (x> y) ? x : y; }
>> +
>> +enum piglit_result
>> +piglit_display(void)
>> +{
>> + int l, q;
>> + bool pass = true;
>> + float red[4] = {1.0, 0.0, 0.0, 1.0};
>> + float green[4] = {0.0, 1.0, 0.0, 1.0};
>> + float blue[4] = {0.0, 0.0, 1.0, 1.0};
>> + float white[4] = {1.0, 1.0, 1.0, 1.0};
>> + float undefined[4] = {0.0, 0.0, 0.0, 0.0};
>> +
>> + glClearColor(0.5, 0.5, 0.5, 1.0);
>> + glClear(GL_COLOR_BUFFER_BIT);
>> +
>> + /* XXX: test other wrap modes */
>> + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
>> + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
>> +
>> + for (l = 0; (tex_size>> l)> 0; l++) {
>> + const int width = tex_size>> l;
>> + const int height = max(width / 2, 1);
>> + const int y = 10 + 20 * l;
>> +
>> + glUniform1f(lod_location, (float)l);
>> +
>> + /* Draw 4 squares with a color sample for each quad */
>> + for (q = 0; q< 4; q++) {
>> + const float tex_x = (q / 2) * 0.5f + 0.25f;
>> + const float tex_y = (q % 2) * 0.5f + 0.25f;
>> + float *c = undefined;
>> + const int x = 10+20*q;
>> +
>> + if (((q / 2) * 0.5f + 0.25f) * width + (-2.0f)< 0.5f *
>> width) {
>> + if (((q % 2) * 0.5f + 0.25f) * height + (+2.0f)<
>> 0.5f * height)
>> + c = red;
>> + else
>> + c = blue;
>> + }
>> + else {
>> + if (((q % 2) * 0.5f + 0.25f) * height + (+2.0f)<
>> 0.5f * height)
>> + c = green;
>> + else
>> + c = white;
>> + }
>> +
>> + glUniform2f(pos_location, tex_x, tex_y);
>> + piglit_draw_rect(x, y, 10, 10);
>> +
>> + if (width> 2&& c != undefined) /* below 1 wide no test */
>> + pass&= piglit_probe_rect_rgba(x, y, 10, 10, c);
>> + }
>> + }
>> +
>> + piglit_present_results();
>> +
>> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>> +}
>> +
>> +void
>> +piglit_init(int argc, char **argv)
>> +{
>> + int vs, fs, prog;
>> +
>> + piglit_require_GLSL_version(130);
>> +
>> + glActiveTexture(GL_TEXTURE0);
>> + /* XXX test npot sizes, other samplers, ... */
>> + piglit_rgbw_texture(GL_RGBA, tex_size, tex_size / 2, true, false,
>> + GL_UNSIGNED_NORMALIZED);
>> +
>> + piglit_ortho_projection(piglit_width, piglit_height, false);
>
> I'd move this projection call into the display function so if the window
> is resized the test might still work.
Sounds like a good idea. I guess noone cared for the test I copied this
stuff from :-).
>
>
>> +
>> + /* XXX test other texture instructions */
>> + vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
>> + fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
>> fragtexlodoffset);
>> + prog = piglit_link_simple_program(vs, fs);
>> +
>> + lod_location = glGetUniformLocation(prog, "lod");
>> + pos_location = glGetUniformLocation(prog, "pos");
>> +
>> + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
>> + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
>> GL_NEAREST_MIPMAP_NEAREST);
>> +
>> + glUseProgram(prog);
>> +}
>
> Looks OK otherwise.
I'll push this with your (and Jose's) suggestions then.
Thanks for the review.
>
> Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the Piglit
mailing list