[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