[Piglit] [PATCH] arb_texture_float-get-tex3d: test glGetTexImage with 3D float texture

Alejandro Piñeiro apinheiro at igalia.com
Wed Aug 31 06:53:27 UTC 2016


On 30/08/16 15:30, Brian Paul wrote:
> On 08/30/2016 03:09 AM, Alejandro Piñeiro wrote:
>> On 29/08/16 20:43, Brian Paul wrote:
>>> This hits a format conversion path in Mesa's glGetTexImage code which
>>> hits a bug.
>>> ---
>>>   tests/all.py                                   |   1 +
>>>   tests/spec/arb_texture_float/CMakeLists.gl.txt |   1 +
>>>   tests/spec/arb_texture_float/get-tex3d.c       | 110
>>> +++++++++++++++++++++++++
>>>   3 files changed, 112 insertions(+)
>>>   create mode 100644 tests/spec/arb_texture_float/get-tex3d.c
>>>
>>> diff --git a/tests/all.py b/tests/all.py
>>> index 1c77b47..4f6117a 100644
>>> --- a/tests/all.py
>>> +++ b/tests/all.py
>>> @@ -3236,6 +3236,7 @@ with profile.group_manager(
>>>           PiglitGLTest,
>>>           grouptools.join('spec', 'arb_texture_float')) as g:
>>>       g(['arb_texture_float-texture-float-formats'],
>>> run_concurrent=False)
>>> +    g(['arb_texture_float-get-tex3d'], run_concurrent=False)
>>>       add_msaa_formats_tests(g, 'GL_ARB_texture_float')
>>>       add_texwrap_format_tests(g, 'GL_ARB_texture_float')
>>>       add_fbo_formats_tests(g, 'GL_ARB_texture_float')
>>> diff --git a/tests/spec/arb_texture_float/CMakeLists.gl.txt
>>> b/tests/spec/arb_texture_float/CMakeLists.gl.txt
>>> index 80090b0..c1a6fca 100644
>>> --- a/tests/spec/arb_texture_float/CMakeLists.gl.txt
>>> +++ b/tests/spec/arb_texture_float/CMakeLists.gl.txt
>>> @@ -9,5 +9,6 @@ link_libraries (
>>>   )
>>>
>>>   piglit_add_executable (arb_texture_float-texture-float-formats
>>> texture-float-formats.c)
>>> +piglit_add_executable (arb_texture_float-get-tex3d get-tex3d.c)
>>>
>>>   # vim: ft=cmake:
>>> diff --git a/tests/spec/arb_texture_float/get-tex3d.c
>>> b/tests/spec/arb_texture_float/get-tex3d.c
>>> new file mode 100644
>>> index 0000000..68c9504
>>> --- /dev/null
>>> +++ b/tests/spec/arb_texture_float/get-tex3d.c
>>> @@ -0,0 +1,110 @@
>>> +/*
>>> + * Copyright (c) 2016 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
>>> + * on the rights to use, copy, modify, merge, publish, distribute, sub
>>> + * license, 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
>>> + * NON-INFRINGEMENT.  IN NO EVENT SHALL VMWARE AND/OR THEIR SUPPLIERS
>>> + * 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.
>>> + */
>>> +
>>> +
>>> +/**
>>> + * Tests glGetTexImage() with float format.
>>> + * This hits a rare pixel transfer patch in Mesa.
>>> + */
>>> +
>>> +#include "piglit-util-gl.h"
>>> +
>>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>>> +    config.supports_gl_compat_version = 10;
>>> +    config.window_visual = PIGLIT_GL_VISUAL_RGBA |
>>> PIGLIT_GL_VISUAL_DOUBLE;
>>> +PIGLIT_GL_TEST_CONFIG_END
>>> +
>>> +
>>> +enum piglit_result
>>> +piglit_display(void)
>>> +{
>>> +    /* should not called */
>>> +    return PIGLIT_FAIL;
>>> +}
>>> +
>>> +
>>> +void
>>> +piglit_init(int argc, char **argv)
>>> +{
>>> +   GLuint texture;
>>> +   const unsigned w = 16, h = 8, d = 4;
>>> +   unsigned i;
>>> +   float *texData;
>>> +   bool pass = true;
>>> +
>>> +   piglit_require_extension("GL_ARB_texture_float");
>>> +
>>> +   glGenTextures(1, &texture);
>>> +   glBindTexture(GL_TEXTURE_3D, texture);
>>> +   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
>>> +   glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
>>> +
>>> +   /* Define 3D texture with float values */
>>> +   texData = malloc(4 * w * h * d * sizeof(float));
>>> +   for (i = 0; i < w * h * d * 4; i++) {
>>> +       texData[i] = (rand() & 0xff) / 255.0f;
>>> +   }
>>> +   glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, w, h, d, 0,
>>> +        GL_RGBA, GL_FLOAT, texData);
>>> +
>>> +   /* Get 3D texture as GLfloat (no transfer ops) */
>>> +   {
>>> +      GLfloat *getData = malloc(4 * w * h * d * sizeof(GLfloat));
>>> +      glGetTexImage(GL_TEXTURE_3D, 0, GL_RGBA, GL_FLOAT, getData);
>>> +      for (i = 0; i < w * h * d * 4; i++) {
>>> +          GLfloat expected = texData[i];
>>> +          if (getData[i] != expected) {
>>> +              printf("Expected float value %f, found %f at %u\n",
>>> +                 expected, getData[i], i);
>>
>> Probably it would be better "fprintf(stderr". In any case there are tons
>> of tests that just use printf for errors, so feel free to just ignore
>> this suggestion.
> 
> I honestly don't know which is preferred.  Like you said, some tests use
> stdout and others stderr.  Even the util code uses a mix.  That would be
> a good project for someone to sort out.

Makes sense.

FWIW, just in case you missed at the end of the email (as you didn't
push it), I granted the Rb.

>>
>>
>>> +              pass = false;
>>> +              break;
>>> +          }
>>> +      }
>>> +
>>> +      free(getData);
>>> +   }
>>> +
>>> +   /* Get 3D texture as GLubyte */
>>> +   {
>>> +      GLubyte *getData = malloc(4 * w * h * d * sizeof(GLubyte));
>>> +      glGetTexImage(GL_TEXTURE_3D, 0, GL_RGBA, GL_UNSIGNED_BYTE,
>>> getData);
>>> +      for (i = 0; i < w * h * d * 4; i++) {
>>> +          GLubyte expected = (GLubyte) (texData[i] * 255);
>>> +          if (getData[i] != expected) {
>>> +              printf("Expected ubyte value %u, found %u at %u\n",
>>> +                 expected, getData[i], i);
>>> +              pass = false;
>>> +              break;
>>> +          }
>>> +      }
>>> +
>>> +      free(getData);
>>> +   }
>>> +
>>> +   free(texData);
>>> +
>>> +   glDeleteTextures(1, &texture);
>>> +
>>> +   piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
>>> +}
>>>
>>
>> Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
>>
> 
> 

-- 
Alejandro Piñeiro <apinheiro at igalia.com>


More information about the Piglit mailing list