[Piglit] [RFC PATCH 2/5] add API-related tests for ARB_bindless_texture

Timothy Arceri tarceri at itsqueeze.com
Wed Mar 29 00:14:23 UTC 2017


<snip/>

>>> +
>>> +    return PIGLIT_PASS;
>>> +}
>>> +
>>> +static enum piglit_result
>>> +check_MakeImageHandleNonResident_invalid_operations(void *data)
>>> +{
>>> +    GLuint64 handle;
>>> +    GLuint tex;
>>> +
>>> +    if
>>> (!piglit_is_extension_supported("GL_ARB_shader_image_load_store"))
>>> +        return PIGLIT_SKIP;
>>> +
>>> +    /* The ARB_bindless_texture spec says:
>>> +     *
>>> +     * "The error INVALID_OPERATION is generated by
>>> +     *  MakeImageHandleNonResidentARB if <handle> is not a valid image
>>> +     *  handle, or if <handle> is not resident in the current GL
>>> context."
>>> +     */
>>> +
>>> +    /* Invalid handle */
>>> +    glMakeImageHandleNonResidentARB(42);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    tex = piglit_rgbw_texture(GL_RGBA32F, 16, 16, GL_FALSE, GL_FALSE,
>>> +                  GL_UNSIGNED_NORMALIZED);
>>> +    glBindTexture(GL_TEXTURE_2D, 0);
>>> +
>>> +    handle = glGetImageHandleARB(tex, 0, GL_FALSE, 0, GL_RGBA32F);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    /* Handle not resident. */
>>> +    glMakeImageHandleNonResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION))
>>> +        return PIGLIT_FAIL;
>>
>>
>> Again like the texture test maybe add the handle then remove it twice?
>
> What do you mean?


I mean you test that an error is generated when the handle was never 
made resident, you should probably test that it still errors when we 
make it resident then non-resident again:

     glMakeImageHandleResidentARB(handle, GL_READ_WRITE);
     glMakeImageHandleNonResidentARB(handle);
     if (!piglit_check_gl_error(GL_NO_ERROR))
         return PIGLIT_FAIL;

     glMakeImageHandleNonResidentARB(handle);
     if (!piglit_check_gl_error(GL_INVALID_OPERATION))
         return PIGLIT_FAIL;



>>
>>> +
>>> +    pass &= !ret;
>>> +
>>> +    return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>>> +}
>>> +
>>> +static enum piglit_result
>>> +delete_texture_sampler_while_handle_is_allocated(void *data)
>>> +{
>>> +    GLuint texture, sampler;
>>> +    GLuint64 handle;
>>> +
>>> +    /* The ARB_bindless_texture spec says:
>>> +     *
>>> +     * "(5) Is there a way to release a texture or image handle
>>> after it
>>> +     *  is created?"
>>> +     *
>>> +     * "RESOLVED:  No API is provided to release or delete handles once
>>> +     *  they are created.  Texture and image handles are automatically
>>> +     *  reclaimed when the underlying texture or sampler objects are
>>> finally
>>> +     *  deleted.  This deletion will happen only when no handle using
>>> the
>>> +     *  texture or sampler object is resident on any context."
>>> +     */
>>> +
>>> +    /* Test #1: Create a texture handle and remove it. */
>>> +    texture = piglit_rgbw_texture(GL_RGBA32F, 16, 16, GL_FALSE,
>>> GL_FALSE,
>>> +                      GL_UNSIGNED_NORMALIZED);
>>> +    glBindTexture(GL_TEXTURE_2D, 0);
>>> +
>>> +    handle = glGetTextureHandleARB(texture);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    glDeleteTextures(1, &texture);
>>> +
>>> +    /* Texture handle should have been removed. */
>>> +    glMakeTextureHandleResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    /* Test #2: Create a texture/sampler handle and remove the
>>> sampler. */
>>> +    texture = piglit_rgbw_texture(GL_RGBA32F, 16, 16, GL_FALSE,
>>> GL_FALSE,
>>> +                      GL_UNSIGNED_NORMALIZED);
>>> +    glBindTexture(GL_TEXTURE_2D, 0);
>>> +
>>> +    /* Texture and sampler have to be consistent. */
>>> +    glGenSamplers(1, &sampler);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
>>> +
>>> +    handle = glGetTextureSamplerHandleARB(texture, sampler);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    glDeleteSamplers(1, &sampler);
>>> +
>>> +    /* Texture handle should have been removed. */
>>> +    glMakeTextureHandleResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    return PIGLIT_PASS;
>>> +}
>>> +
>>> +static enum piglit_result
>>> +delete_texture_sampler_while_handle_is_resident(void *data)
>>> +{
>>> +    GLuint texture, sampler;
>>> +    GLuint64 handle;
>>> +    GLboolean ret;
>>> +
>>> +    /* The ARB_bindless_texture_spec says:
>>> +     *
>>> +     * "(7) What happens if you try to delete a texture or sampler
>>> object
>>> +     *  with a handle that is resident in another context?"
>>> +     *
>>> +     * "RESOLVED:  Deleting the texture will remove the texture from
>>> the
>>> +     *  name space and make all handles using the texture
>>> non-resident in
>>> +     *  the current context.  However, texture or image handles for a
>>> +     *  deleted texture are not deleted until the underlying texture or
>>> +     *  sampler object itself is deleted.  That deletion won't happen
>>> +     *  until the object is not bound anywhere and there are no handles
>>> +     *  using the object that are resident in any context."
>>> +     */
>>> +
>>> +    /* Test #1: Create a texture handle, make it resident and remove
>>> the
>>> +     * texture. */
>>> +    texture = piglit_rgbw_texture(GL_RGBA, 16, 16, GL_FALSE, GL_FALSE,
>>> +                      GL_UNSIGNED_NORMALIZED);
>>> +    glBindTexture(GL_TEXTURE_2D, 0);
>>> +
>>> +    handle = glGetTextureHandleARB(texture);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    glMakeTextureHandleResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    glDeleteTextures(1, &texture);
>>> +
>>> +    /* Texture handle should have been removed. */
>>> +    glIsTextureHandleResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_INVALID_OPERATION))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    /* Test #2: Create a texture/sampler handle, make it resident and
>>> +     * remove the sampler. */
>>> +    texture = piglit_rgbw_texture(GL_RGBA32F, 16, 16, GL_FALSE,
>>> GL_FALSE,
>>> +                      GL_UNSIGNED_NORMALIZED);
>>> +    glBindTexture(GL_TEXTURE_2D, 0);
>>> +
>>> +    /* Texture and sampler have to be consistent. */
>>> +    glGenSamplers(1, &sampler);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
>>> +    glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
>>> +
>>> +    handle = glGetTextureSamplerHandleARB(texture, sampler);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    glMakeTextureHandleResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    glDeleteSamplers(1, &sampler);
>>> +
>>> +    /* Texture handle should still be resident. */
>>> +    ret = glIsTextureHandleResidentARB(handle);
>>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>>> +        return PIGLIT_FAIL;
>>> +
>>> +    if (!ret)
>>> +        return PIGLIT_FAIL;
>>
>> Should you now do:
>>
>>
>>     glDeleteTextures(1, &texture);
>>
>>     /* Texture handle should have been removed. */
>>     glIsTextureHandleResidentARB(handle);
>>     if (!piglit_check_gl_error(GL_INVALID_OPERATION))
>>         return PIGLIT_FAIL;
>>
>> ?
>
> Not necessarily, it's similar to test #1.


I disagree. If you don't test that the handle is removed when deleting 
the texture you don't even know that the reference was removed by 
glDeleteSamplers(1, &sampler);

Also this is calling glGetTextureSamplerHandleARB(texture, sampler) not 
glGetTextureHandleARB() or glGetTextureSamplerHandleARB() which have 
been tested elsewhere including test #1.

The only way to make sure glGetTextureSamplerHandleARB() doesn't do 
something funny that results in the handle hanging around is to delete 
both the sampler and texture.


>
>>
>>> +
>>> +    return PIGLIT_PASS;
>>> +}
>>> +


<snip/>

>>> diff --git a/tests/spec/arb_bindless_texture/limit.c
>>> b/tests/spec/arb_bindless_texture/limit.c
>>> new file mode 100644
>>> index 000000000..960027597
>>> --- /dev/null
>>> +++ b/tests/spec/arb_bindless_texture/limit.c
>>> @@ -0,0 +1,302 @@
>>> +/*
>>
>> There should be a copyright here???
>
> No. The original file doesn't have one.

That looks like a mistake to me. It should have one, its referenced by 
the license itself:

"The above copyright notice and this permission notice (including
  the next paragraph) shall be included in all copies or substantial 
portions of the Software."

>
>>
>>> + * 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.
>>> + *
>>> + * Authors:
>>> + *  Marek Olšák <maraeo at gmail.com>
>>> + *  Samuel Pitoiset <samuel.pitoiset at gmail.com>
>>> + */
>>> +
>>> +/**
>>> + * Test that samplers accessed using texture handles are not counted
>>> against
>>> + * the texture limits.
>>> + * Derived from Marek's max-samplers test.
>>> + */

<snip/>


More information about the Piglit mailing list