[Piglit] [PATCH 1/3] ARB_texture_view: Test for API coverage of subset of input params

Ian Romanick idr at freedesktop.org
Fri Oct 18 20:25:19 CEST 2013


On 10/17/2013 01:29 PM, Jon Ashburn wrote:
> RE:
> "This test doesn't appear to use integer textures or floating-point
> textures."
> +    piglit_require_extension("GL_EXT_texture_integer");
> +    piglit_require_extension("GL_ARB_texture_float");
> 
> 
> I think it does but maybe wrong in my understanding of texture formats 
> and which extension (if any) they map to:
> glTexStorage2D(GL_TEXTURE_2D,2, GL_RGBA32F, 16, 16);
> 
> 
> glTextureView(tex[2], GL_TEXTURE_2D, 0, GL_RGBA32UI, 0, 1, 0, 1);

No, you're correct.  I missed those because I searched for FLOAT and
INTEGER (as you would see with glTexImage2D).

> On 10/17/2013 12:38 PM, Ian Romanick wrote:
>> On 10/16/2013 04:37 PM, Jon Ashburn wrote:
>>> Tests GL_ARB_texture_view  and validity of input parameters.
>>> Use both valid and invalid parameters, although mostly invalid
>>> parameters are tested  since other tests will use valid parameters.
>>> Only the parameters  "texture", "origtexture", "minlevel", "numlevels",
>>> "minlayer", "numlayers"  are tested for validity  as per section 8.18 of
>>> OpenGL 4.3 Core spec.
>>>
>>> Tested on Nvidia Quadro 600 and it passes.
>>> ---
>>>   tests/all.tests                               |   5 +
>>>   tests/spec/arb_texture_view/CMakeLists.gl.txt |   1 +
>>>   tests/spec/arb_texture_view/params.c          | 241
>>> ++++++++++++++++++++++++++
>>>   3 files changed, 247 insertions(+)
>>>   create mode 100644 tests/spec/arb_texture_view/params.c
>>>
>>> diff --git a/tests/all.tests b/tests/all.tests
>>> index c919f19..2bb6aed 100644
>>> --- a/tests/all.tests
>>> +++ b/tests/all.tests
>>> @@ -1469,6 +1469,11 @@ spec['ARB_texture_storage_multisample'] =
>>> arb_texture_storage_multisample
>>>   arb_texture_storage_multisample['tex-storage'] =
>>> concurrent_test('arb_texture_storage_multisample-tex-storage')
>>>   arb_texture_storage_multisample['tex-param'] =
>>> concurrent_test('arb_texture_storage_multisample-tex-param')
>>>   +arb_texture_view = Group()
>>> +spec['ARB_texture_view'] = arb_texture_view
>>> +arb_texture_view['immutable_levels'] =
>>> concurrent_test('arb_texture_view-texture-immutable-levels')
>>> +arb_texture_view['params'] = concurrent_test('arb_texture_view-params')
>>> +
>>>   tdfx_texture_compression_fxt1 = Group()
>>>   spec['3DFX_texture_compression_FXT1'] = tdfx_texture_compression_fxt1
>>>   add_concurrent_test(tdfx_texture_compression_fxt1,
>>> 'compressedteximage GL_COMPRESSED_RGB_FXT1_3DFX')
>>> diff --git a/tests/spec/arb_texture_view/CMakeLists.gl.txt
>>> b/tests/spec/arb_texture_view/CMakeLists.gl.txt
>>> index c400759..4f2b1ef 100644
>>> --- a/tests/spec/arb_texture_view/CMakeLists.gl.txt
>>> +++ b/tests/spec/arb_texture_view/CMakeLists.gl.txt
>>> @@ -10,5 +10,6 @@ link_libraries(
>>>       )
>>>     piglit_add_executable(arb_texture_view-texture-immutable-levels
>>> texture-immutable-levels.c)
>>> +piglit_add_executable(arb_texture_view-params params.c)
>>>     # vim: ft=cmake:
>>> diff --git a/tests/spec/arb_texture_view/params.c
>>> b/tests/spec/arb_texture_view/params.c
>>> new file mode 100644
>>> index 0000000..b458a03This test doesn't appear to use integer
>>> textures or floating-point textures.
>>>
>>> --- /dev/null
>>> +++ b/tests/spec/arb_texture_view/params.c
>>> @@ -0,0 +1,241 @@
>>> +/*
>>> + * Copyright © 2013 LunarG, 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.
>>> + *
>>> + * Author: Jon Ashburn <jon at lunarg.com>
>>> + */
>>> +
>>> +/**
>>> + * Tests GL_ARB_texture_view  and validity of input parameters.
>>> + * Use both valid and invalid parameters, although mostly invalid
>>> + * parameters are tested  since other tests use valid parameters.
>>> + * Only the parameters  "texture", "origtexture", "minlevel",
>>> "numlevels",
>>> + * "minlayer", "numlayers"  are tested for validity  as per section
>>> 8.18 of
>>> + * OpenGL 4.3 Core spec.
>>> + * Tests formats.c and targets.c test the valid and invalid
>>> "format"  and
>>> + * "target" input parameters respectively.
>>> + *
>>> + */
>>> +
>>> +#include "piglit-util-gl-common.h"
>>> +
>>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>>> +
>>> +    config.supports_gl_compat_version = 10;
>>> +    config.supports_gl_core_version = 31;
>>> +
>>> +    config.window_visual = PIGLIT_GL_VISUAL_RGBA |
>>> PIGLIT_GL_VISUAL_DOUBLE;
>>> +
>>> +PIGLIT_GL_TEST_CONFIG_END
>>> +
>>> +static const char *TestName = "arb_texture_view-params";
>>> +
>>> +
>>> +/**
>>> + * Do error-check tests for misc glTextureView parameters
>>> + */
>>> +enum piglit_result
>>> +piglit_display(void)
>>> +{
>> There's no rendering here, right?  This should all go in piglit_init.
>> See tests/spec/arb_get_program_binary/retrievable_hint.c for an example.
>>
>>> +    enum piglit_result pass = PIGLIT_PASS;
>>> +    GLuint tex[2];
>>> +    GLint level, layer, i;
>>> +    unsigned char * ptr;
>>> +
>>> +    /* invalid original texture param (origtexture) */
>>> +    glGenTextures(2, tex);
>>> +    glBindTexture(GL_TEXTURE_2D, tex[0]);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR)) {
>>> +        printf("%s:%s Found gl errors prior to testing
>>> glTextureView\n",
>>> +                   TestName, __func__);
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glTextureView(tex[1], GL_TEXTURE_2D, tex[0], GL_R8, 0, 1, 0, 1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>> If this fails, it seems like the other tests could still run.  Why exit?
>>   I made a similar comment on one of Brian's patches:
>>
>>      "Other piglit tests do not work like this.  If part of a test fails
>>      in a way that won't affect later tests, the later tests are still
>>      run.  This has advantages when you're trying to fix a failure:  you
>>      see all the things that are broken up front.
>>
>>      This is also why almost all piglit tests use bool to hold the
>>      partial test result.  Then you can easily do things like:
>>
>>     pass = piglit_check_gl_error(GL_NO_ERROR) && pass;"
>>
>> I think I already said this yesterday, but this block of code is much
>> better as:
>>
>>     GLuint tex[4];
>>
>>     piglit_reset_gl_error();
>>
>>     glGenTextures(ARRAY_SIZE(tex), tex);
>>     glBindTexture(GL_TEXTURE_2D, tex[0]);
>>
>>     glTextureView(tex[1], GL_TEXTURE_2D, tex[0], GL_R8, 0, 1, 0, 1);
>>     pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
>>
>>     glTexStorage2D(GL_TEXTURE_2D,2, GL_RGBA32F, 16, 16);
>>     pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
>>
>>     glTextureView(tex[2], GL_TEXTURE_2D, 0, GL_RGBA32UI, 0, 1, 0, 1);
>>     pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
>>
>>     /* invalid  texture param */
>>     glTextureView(0, GL_TEXTURE_2D, tex[0], GL_RGBA32I, 0, 1, 0 ,1);
>>     pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
>>
>>     glBindTexture(GL_TEXTURE_2D, tex[3]);
>>     glTextureView(tex[3], GL_TEXTURE_2D, tex[0],GL_RGBA32F, 0, 1, 0, 1);
>>     pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
>>
>> Also, like I said yesterday, each of these should have a spec quotation.
>>
>>> +    glDeleteTextures(1, &tex[1]);
>>> +    glTexStorage2D(GL_TEXTURE_2D,2, GL_RGBA32F, 16, 16);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out1;
>>> +    }
>>> +    glGenTextures(1, &tex[1]);
>>> +    glTextureView(tex[1], GL_TEXTURE_2D, 0, GL_RGBA32UI, 0, 1, 0, 1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_VALUE)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glDeleteTextures(1, &tex[1]);
>>> +
>>> +    /* invalid  texture param */
>>> +    glTextureView(0, GL_TEXTURE_2D, tex[0], GL_RGBA32I, 0, 1, 0 ,1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_VALUE)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out1;
>>> +    }
>>> +    glGenTextures(1, &tex[1]);
>>> +    glBindTexture(GL_TEXTURE_2D, tex[1]);
>>> +    glTextureView(tex[1], GL_TEXTURE_2D, tex[0],GL_RGBA32F, 0, 1, 0,
>>> 1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glDeleteTextures(2, tex);
>>> +
>>> +    glGenTextures(1, tex);
>>> +    glBindTexture(GL_TEXTURE_2D, tex[0]);
>>> +    glTexStorage2D(GL_TEXTURE_2D, 3, GL_RG16F, 16, 16);
>>> +    glTextureView(~tex[0],GL_TEXTURE_2D, tex[0], GL_RGBA8, 0,1,0,1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out1;
>>> +    }
>>> +    glDeleteTextures(1, tex);
>>> +
>>> +    /* orig texture not immutable */
>>> +    ptr = (unsigned char *) malloc(32 * 32 * 2 * 6);
>>> +    if (ptr == NULL)
>>> +        return PIGLIT_SKIP;
>>> +    glGenTextures(2, tex);
>>> +    glBindTexture(GL_TEXTURE_2D, tex[0]);
>>> +    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16, 32, 32, 0, GL_RGB,
>>> +             GL_SHORT, ptr);
>>> +    glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB16, 16, 16, 0, GL_RGB,
>>> +             GL_SHORT, ptr);
>>> +    free(ptr);
>>> +    glTextureView(tex[1], GL_TEXTURE_2D, tex[0], GL_RGBA32F, 0,1,0,1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glDeleteTextures(2, tex);
>>> +
>>> +    /* invalid layer param */
>>> +    glGenTextures(2, tex);
>>> +    glBindTexture(GL_TEXTURE_1D_ARRAY, tex[0]);
>>> +    glTexStorage2D(GL_TEXTURE_1D_ARRAY, 7, GL_RGB16I, 64, 4);
>>> +    glTextureView(tex[1],GL_TEXTURE_1D_ARRAY, tex[0], GL_RGB16UI, 0,
>>> 7, 4,
>>> +              2);
>>> +    if (!piglit_check_gl_error(GL_INVALID_VALUE)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glDeleteTextures(1, &tex[1]);
>>> +    glGenTextures(1, &tex[1]);
>>> +    glTextureView(tex[1],GL_TEXTURE_1D, tex[0], GL_RGB16I, 1, 5, 0, 4);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glDeleteTextures(1, &tex[1]);
>>> +
>>> +    /* invalid level param */
>>> +    glGenTextures(1, &tex[1]);
>>> +    glTextureView(tex[1],GL_TEXTURE_1D, tex[0], GL_RGB16UI, 7, 5, 1,
>>> 1);
>>> +    if (!piglit_check_gl_error(GL_INVALID_VALUE)) {
>>> +        pass = PIGLIT_FAIL;
>>> +        goto err_out;
>>> +    }
>>> +    glDeleteTextures(1, &tex[1]);
>>> +
>>> +    /* numlevels clamping, minlevel range over legal values */
>>> +    for (i = 0; i < 7; i++) {
>>> +        glGenTextures(1, &tex[1]);
>>> +        glTextureView(tex[1],GL_TEXTURE_1D_ARRAY, tex[0], GL_RGB16F,
>>> +                  i, 8-i, 0, 5);
>>> +        if (!piglit_check_gl_error(GL_NO_ERROR)) {
>>> +            pass = PIGLIT_FAIL;
>>> +            goto err_out;
>>> +        }
>>> +        glBindTexture(GL_TEXTURE_1D_ARRAY, tex[1]);
>>> +        glGetTexParameteriv(GL_TEXTURE_1D_ARRAY,
>>> GL_TEXTURE_VIEW_MIN_LEVEL,
>>> +                            &level);
>>> +        if (level != i) {
>>> +            printf("failed at min_level=%d, queried
>>> view_min_level=%d\n",
>>> +                       i, level);
>>> +            pass = PIGLIT_FAIL;
>>> +            goto err_out;
>>> +        }
>>> +        glGetTexParameteriv(GL_TEXTURE_1D_ARRAY,
>>> GL_TEXTURE_VIEW_NUM_LEVELS,
>>> +                            &level);
>>> +        if (level != (7-i)) {
>>> +            printf("failed at min_level=%d, queried
>>> view_num_level=%d\n",
>>> +                       i, level);
>>> +            pass = PIGLIT_FAIL;
>>> +            goto err_out;
>>> +        }
>>> +        glDeleteTextures(1, &tex[1]);
>>> +        glBindTexture(GL_TEXTURE_1D_ARRAY, tex[0]);
>>> +    }
>>> +
>>> +    /* numlayers clamping, minlayers range over legal values */
>>> +    for (i = 0; i < 4; i++) {
>>> +        glGenTextures(1, &tex[1]);
>>> +        glTextureView(tex[1],GL_TEXTURE_1D_ARRAY, tex[0], GL_RGB16I,
>>> +                  0, 7, i, 5-i);
>>> +        if (!piglit_check_gl_error(GL_NO_ERROR)) {
>>> +            pass = PIGLIT_FAIL;
>>> +            goto err_out;
>>> +        }
>>> +        glBindTexture(GL_TEXTURE_1D_ARRAY, tex[1]);
>>> +        glGetTexParameteriv(GL_TEXTURE_1D_ARRAY,
>>> GL_TEXTURE_VIEW_MIN_LAYER,
>>> +                            &layer);
>>> +        if (layer != i) {
>>> +            printf("failed at min_layer=%d, queried
>>> view_min_layer=%d\n",
>>> +                       i, layer);
>>> +            pass = PIGLIT_FAIL;
>>> +            goto err_out;
>>> +        }
>>> +        glGetTexParameteriv(GL_TEXTURE_1D_ARRAY,
>>> GL_TEXTURE_VIEW_NUM_LAYERS,
>>> +                            &layer);
>>> +        if (layer != (4-i)) {
>>> +            printf("failed at min_layer=%d, queried
>>> view_num_layer=%d\n",
>>> +                       i, layer);
>>> +            pass = PIGLIT_FAIL;
>>> +            goto err_out;
>>> +        }
>>> +        glDeleteTextures(1, &tex[1]);
>>> +        glBindTexture(GL_TEXTURE_1D_ARRAY, tex[0]);
>>> +    }
>>> +
>>> +err_out1:
>>> +    glDeleteTextures(1, tex);
>>> +    piglit_report_result(pass);
>>> +    return pass;
>>> +err_out:
>>> +    glDeleteTextures(2, tex);
>>> +    piglit_report_result(pass);
>>> +    return pass;
>> piglit_display should not call piglit_report_result: that function does
>> not return.
>>
>> And this should be crafted to not need two almost identical error paths.
>>
>>> +
>>> +}
>>> +
>>> +void
>>> +piglit_init(int argc, char **argv)
>>> +{
>>> +    piglit_require_extension("GL_ARB_texture_storage");
>>> +    piglit_require_extension("GL_ARB_texture_view");
>>> +    piglit_require_extension("GL_EXT_texture_integer");
>>> +    piglit_require_extension("GL_ARB_texture_float");
>> This test doesn't appear to use integer textures or floating-point
>> textures.
>>
>>> +    piglit_require_extension("GL_EXT_texture_array");
>>> +}
> 



More information about the Piglit mailing list