[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