[Piglit] [PATCH] arb_shader_image_size: test GLSL's builtin imageSize

Martin Peres martin.peres at linux.intel.com
Tue May 12 10:26:13 PDT 2015


On 08/05/15 18:52, Francisco Jerez wrote:
> Martin Peres <martin.peres at linux.intel.com> writes:
>
>> v2:
>> - make sure that GL_ARB_shader_image_size == 1 in the shaders
>>
>> Signed-off-by: Martin Peres <martin.peres at linux.intel.com>
>> ---
>>   tests/all.py                                       |   5 +
>>   tests/quick.py                                     |   7 +
>>   tests/spec/CMakeLists.txt                          |   1 +
>>   tests/spec/arb_shader_image_size/CMakeLists.gl.txt |  16 ++
>>   tests/spec/arb_shader_image_size/CMakeLists.txt    |   1 +
>>   tests/spec/arb_shader_image_size/builtin.c         | 238 +++++++++++++++++++++
>>   6 files changed, 268 insertions(+)
>>   create mode 100755 tests/spec/arb_shader_image_size/CMakeLists.gl.txt
>>   create mode 100644 tests/spec/arb_shader_image_size/CMakeLists.txt
>>   create mode 100755 tests/spec/arb_shader_image_size/builtin.c
>>
>> diff --git a/tests/all.py b/tests/all.py
>> index 18124b7..2fad427 100755
>> --- a/tests/all.py
>> +++ b/tests/all.py
>> @@ -4328,6 +4328,11 @@ with profile.group_manager(
>>       g(['arb_shader_image_load_store-unused'], 'unused')
>>   
>>   with profile.group_manager(
>> +    PiglitGLTest,
>> +    grouptools.join('spec', 'arb_shader_image_size')) as g:
>> +    g(['arb_shader_image_size-builtin'], 'builtin')
>> +
>> +with profile.group_manager(
>>           PiglitGLTest,
>>           grouptools.join('spec', 'arb_texture_stencil8')) as g:
>>       g(['arb_texture_stencil8-draw'], 'draw')
>> diff --git a/tests/quick.py b/tests/quick.py
>> index d0aca02..26335ba 100644
>> --- a/tests/quick.py
>> +++ b/tests/quick.py
>> @@ -24,5 +24,12 @@ with profile.group_manager(
>>           g(['arb_shader_image_load_store-shader-mem-barrier', '--quick'],
>>             'shader-mem-barrier')
>>   
>> +# Set the --quick flag on a few image_size_tests
> Copy-pasto?  You're only planning to do one test at this point right?

Yes, only one test. Fixed this!
>
>> +with profile.group_manager(
>> +        PiglitGLTest,
>> +        grouptools.join('spec', 'arb_shader_image_size')) as g:
>> +    with profile.allow_reassignment:
>> +        g(['arb_shader_image_size-builtin', '--quick'], 'builtin')
>> +
>>   # These take too long
>>   profile.filter_tests(lambda n, _: '-explosion' not in n)
>> diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
>> index 330b38c..d5a7a16 100644
>> --- a/tests/spec/CMakeLists.txt
>> +++ b/tests/spec/CMakeLists.txt
>> @@ -46,6 +46,7 @@ add_subdirectory (arb_shader_texture_lod/execution)
>>   add_subdirectory (arb_shader_atomic_counters)
>>   add_subdirectory (arb_shader_objects)
>>   add_subdirectory (arb_shader_image_load_store)
>> +add_subdirectory (arb_shader_image_size)
>>   add_subdirectory (arb_shading_language_420pack/execution)
>>   add_subdirectory (arb_stencil_texturing)
>>   add_subdirectory (arb_sync)
>> diff --git a/tests/spec/arb_shader_image_size/CMakeLists.gl.txt b/tests/spec/arb_shader_image_size/CMakeLists.gl.txt
>> new file mode 100755
>> index 0000000..03de9b0
>> --- /dev/null
>> +++ b/tests/spec/arb_shader_image_size/CMakeLists.gl.txt
>> @@ -0,0 +1,16 @@
>> +include_directories(
>> +	${GLEXT_INCLUDE_DIR}
>> +	${OPENGL_INCLUDE_PATH}
>> +)
>> +
>> +link_libraries (
>> +	piglitutil_${piglit_target_api}
>> +	${OPENGL_gl_LIBRARY}
>> +	${OPENGL_glu_LIBRARY}
>> +)
>> +
>> +piglit_add_executable (arb_shader_image_size-builtin builtin.c
>> +					../arb_shader_image_load_store/image.c
>> +					../arb_shader_image_load_store/grid.c
>> +					../arb_shader_image_load_store/common.c)
>> +# vim: ft=cmake:
>> diff --git a/tests/spec/arb_shader_image_size/CMakeLists.txt b/tests/spec/arb_shader_image_size/CMakeLists.txt
>> new file mode 100644
>> index 0000000..144a306
>> --- /dev/null
>> +++ b/tests/spec/arb_shader_image_size/CMakeLists.txt
>> @@ -0,0 +1 @@
>> +piglit_include_target_api()
>> diff --git a/tests/spec/arb_shader_image_size/builtin.c b/tests/spec/arb_shader_image_size/builtin.c
>> new file mode 100755
>> index 0000000..1b29253
>> --- /dev/null
>> +++ b/tests/spec/arb_shader_image_size/builtin.c
>> @@ -0,0 +1,238 @@
>> +/*
>> + * Copyright 2015 Intel Corporation
>> + *
>> + * 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 builtin.c
>> + *
>> + * Tests GLSL's imageSize builtin. The code is highly-based on
>> + * image_load_store's max-size test from Francisco Jerez. It also uses the
>> + * grid framework he introduced.
>> + *
>> + * From GL_ARB_shader_image_size's spec:
>> + *
>> + * "Including the following line in a shader can be used to control the
>> + * language features described in this extension:
>> + *
>> + *      #extension GL_ARB_shader_image_size
>> + *
>> + * A new preprocessor #define is added to the OpenGL Shading Language:
>> + *
>> + *      #define GL_ARB_shader_image_size 1
>> + *
>> + * Add to section 8.11 "Image Functions"
>> + *
>> + * Syntax:
>> + *      int imageSize(gimage1D image)
>> + *      ivec2 imageSize(gimage2D image)
>> + *      ivec3 imageSize(gimage3D image)
>> + *      ivec2 imageSize(gimageCube image)
>> + *      ivec3 imageSize(gimageCubeArray image)
>> + *      ivec2 imageSize(gimageRect image)
>> + *      ivec2 imageSize(gimage1DArray image)
>> + *      ivec3 imageSize(gimage2DArray image)
>> + *      int imageSize(gimageBuffer image)
>> + *      ivec2 imageSize(gimage2DMS image)
>> + *      ivec3 imageSize(gimage2DMSArray image)
>> + *
>> + * Description:
>> + *
>> + *      Returns the dimensions of the image or images bound to <image>.  For
>> + *      arrayed images, the last component of the return value will hold the
>> + *      size of the array.  Cube images return the dimensions of one face, and
>> + *      number of cubes in the cube map array, if arrayed."
>> + */
>> +
>> +#include "../arb_shader_image_load_store/common.h"
>> +#include "piglit-util-gl.h"
>> +
>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>> +
>> +	config.supports_gl_core_version = 32;
>> +
>> +	config.window_visual = PIGLIT_GL_VISUAL_RGBA |
>> +		PIGLIT_GL_VISUAL_DOUBLE;
>> +
>> +PIGLIT_GL_TEST_CONFIG_END
>> +
>> +static bool
>> +randomize_image(const struct image_info img, unsigned unit)
> Hah!

I was planing on changing the name ... but I don't init the image. So it 
is random, right?

>
>> +{
>> +	const unsigned n = image_num_components(img.format) * product(img.size);
>> +	uint32_t *pixels = malloc(sizeof(uint32_t) * n);
>> +	bool ret;
>> +
>> +	ret = upload_image(img, unit, pixels);
>> +
>> +	free(pixels);
>> +	return ret;
>> +}
>> +
>> +static bool
>> +check(const struct grid_info grid, struct image_info img_src)
>> +{
>> +	struct image_info img = image_info_for_grid(grid);
>> +	const unsigned n = image_num_components(img.format) * product(img.size);
>> +	uint32_t *pixels = malloc(sizeof(uint32_t) * n);
>> +	bool ret;
>> +
>> +	ret = download_result(grid, pixels);
>> +
>> +	if (img_src.target->target == GL_TEXTURE_CUBE_MAP_ARRAY) {
>> +		ret &= check_pixels(img, pixels, img_src.size.x, img_src.size.y,
>> +			     img_src.size.z / 6.0, img_src.size.w);
> I know that the "/ 6" is required because of the inconsistency between
> ARB_shader_image_load_store and ARB_shader_image_size in the way that
> they define the third coordinate of a cubemap array...
>
>> +	} else if (image_target_samples(img_src.target) > 1) {
>> +		ret &= check_pixels(img, pixels, img_src.size.y, img_src.size.z,
>> +					     img_src.size.w, 1.0);
> ...and that this is required because our image metadata keeps track of
> the sample count while imageSize() doesn't return it, but I guess that a
> short explanation would be useful for the casual reader?

Right! Done!
>
>> +	} else  {
>> +		ret &= check_pixels(img, pixels, img_src.size.x, img_src.size.y,
>> +			     img_src.size.z, img_src.size.w);
> Your indentation looks weird, at least while reading this in patch form.
> Most likely because of the mix of tabs and spaces? ;)

Yep, fixed it :)

>
>> +	}
>> +
>> +	free(pixels);
>> +	return ret;
>> +}
>> +
>> +static bool
>> +run_test(const struct image_target_info *target,
>> +	 const struct image_extent size)
>> +{
>> +	const struct grid_info grid = grid_info(GL_FRAGMENT_SHADER, GL_RGBA32I,
>> +						16, 16);
>> +	const struct image_info img = {
>> +		target, grid.format, size,
>> +		image_format_epsilon(grid.format)
>> +	};
>> +	GLuint prog = generate_program(
>> +		grid, GL_FRAGMENT_SHADER,
>> +		concat(hunk("#extension GL_ARB_shader_image_size : enable\n"),
>> +		       image_hunk(img, ""),
>> +		       hunk("readonly uniform IMAGE_T src_img;\n"
>> +			    "\n"
>> +			    "GRID_T op(ivec2 idx, GRID_T x) {\n"
>> +			    "    #if GL_ARB_shader_image_size == 1\n"
>> +			    "        return ivec4(imageSize(src_img), ivec3(1));\n"
>> +			    "    #else\n"
>> +			    "        return ivec4(-1, -1, -1, -1);\n"
>> +			    "    #endif\n"
>> +			    "}\n"), NULL));
>> +	bool ret = prog && init_fb(grid) &&
>> +		randomize_image(img, 0) &&
>> +		set_uniform_int(prog, "src_img", 0) &&
>> +		draw_grid(grid, prog) &&
>> +		check(grid, img);
>> +
>> +	glDeleteProgram(prog);
>> +	return ret;
>> +}
>> +
>> +static struct image_extent
>> +get_test_extent(const struct image_target_info *target, unsigned d)
>> +{
>> +	const struct image_extent ls = image_target_limits(target);
>> +	const unsigned high = ~0, low = 8;
>> +	struct image_extent ext;
>> +	int i;
>> +
>> +	for (i = 0; i < 4; ++i)
>> +		set_idx(ext, i, MIN2(get_idx(ls, i), (i == d ? high : low)));
>> +
>> +	if (target->target == GL_TEXTURE_CUBE_MAP ||
>> +	    target->target == GL_TEXTURE_CUBE_MAP_ARRAY) {
>> +		/* Cube maps have to be square and the number of faces
>> +		 * should be a multiple of six. */
>> +		ext.y = ext.x;
>> +		ext.z = 6 * MAX2(ext.z / 6, 1);
>> +
>> +	} else if (image_target_samples(target) > 1) {
>> +		/* Use the maximum number of samples to keep things
>> +		 * interesting. */
>> +		ext.x = image_target_samples(target);
>> +	}
>> +
>> +	return ext;
>> +}
>> +
>> +static bool
>> +should_test_dimension(const struct image_target_info *target, int d)
>> +{
>> +	const struct image_extent ls = image_target_limits(target);
>> +
>> +	return get_idx(ls, d) > 1 &&
>> +		/* Skip second cube map dimension as faces have to be
>> +		 * square. */
>> +		!(target->target == GL_TEXTURE_CUBE_MAP && d >= 1) &&
>> +		!(target->target == GL_TEXTURE_CUBE_MAP_ARRAY && d == 1) &&
>> +		/* Skip sample dimension. */
>> +		!(image_target_samples(target) > 1 && d == 0);
>> +}
>> +
>> +static bool
>> +is_test_reasonable(bool quick, const struct image_extent size)
>> +{
>> +	/* Set an arbitrary limit on the number of texels so the test
>> +	 * doesn't take forever. */
>> +	return product(size) < (quick ? 4 : 64) * 1024 * 1024;
>> +}
>> +
>> +void
>> +piglit_init(int argc, char **argv)
>> +{
>> +	const bool quick = (argc >= 2 && !strcmp(argv[1], "--quick"));
>> +	enum piglit_result status = PIGLIT_PASS;
>> +	const struct image_target_info *target;
>> +	const struct image_stage_info *stage;
>> +	int d;
>> +
>> +	/* The spec of the extension says we should require GL 4.2 but let's
>> +	 * just request GL_ARB_shader_image_size which will in turns require
> "in turn"
>
> With these minor issues fixed:
> Reviewed-by: Francisco Jerez <currojerez at riseup.net>
>
>> +	 * GL_ARB_shader_image_load_store which should be sufficient.
>> +	 */
>> +	piglit_require_extension("GL_ARB_shader_image_size");
>> +
>> +
>> +	for (stage = image_stages(); stage->stage; ++stage) {
>> +		for (target = image_targets(); target->name; ++target) {
>> +			for (d = 0; d < 4; ++d) {
>> +				if (should_test_dimension(target, d)) {
>> +					const struct image_extent size =
>> +						get_test_extent(target, d);
>> +
>> +					subtest(&status,
>> +						is_test_reasonable(quick, size),
>> +						run_test(target, size),
>> +						"%s/image%s max size test/"
>> +						"%dx%dx%dx%d", stage->name,
>> +						target->name,
>> +						size.x, size.y, size.z, size.w);
>> +				}
>> +			}
>> +		}
>> +	}
>> +
>> +	piglit_report_result(status);
>> +}
>> +
>> +enum piglit_result
>> +piglit_display(void)
>> +{
>> +	return PIGLIT_FAIL;
>> +}
>> -- 
>> 2.3.6
>>
>> _______________________________________________
>> Piglit mailing list
>> Piglit at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/piglit



More information about the Piglit mailing list