[Piglit] [PATCH] Test that cubemaps with non-matching faces are incomplete
Ian Romanick
idr at freedesktop.org
Thu Jan 21 11:09:18 PST 2016
On 01/21/2016 10:44 AM, Neil Roberts wrote:
> This creates a cubemap where one of the faces either has a different
> size or a different format from the other faces and then checks that
> it is incomplete by rendering with it and veryifying that the sampler
verifying
A couple of minor nits below. With or without them changed, this patch is
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> returns solid black.
>
> The format test currently fails on Mesa.
> ---
> tests/all.py | 2 +
> tests/texturing/CMakeLists.gl.txt | 1 +
> tests/texturing/incomplete-cubemap.c | 191 +++++++++++++++++++++++++++++++++++
> 3 files changed, 194 insertions(+)
> create mode 100644 tests/texturing/incomplete-cubemap.c
>
> diff --git a/tests/all.py b/tests/all.py
> index f57d205..29c58ac 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -1132,6 +1132,8 @@ with profile.group_manager(
> g(['max-samplers'])
> g(['max-samplers', 'border'])
> g(['gl-2.0-active-sampler-conflict'])
> + g(['incomplete-cubemap', 'size'], 'incomplete-cubemap-size')
> + g(['incomplete-cubemap', 'format'], 'incomplete-cubemap-format')
>
> with profile.group_manager(
> PiglitGLTest,
> diff --git a/tests/texturing/CMakeLists.gl.txt b/tests/texturing/CMakeLists.gl.txt
> index 704ea6d..c344cdf 100644
> --- a/tests/texturing/CMakeLists.gl.txt
> +++ b/tests/texturing/CMakeLists.gl.txt
> @@ -36,6 +36,7 @@ piglit_add_executable (getteximage-luminance getteximage-luminance.c)
> piglit_add_executable (getteximage-targets getteximage-targets.c)
> piglit_add_executable (getteximage-depth getteximage-depth.c)
> piglit_add_executable (incomplete-texture incomplete-texture.c)
> +piglit_add_executable (incomplete-cubemap incomplete-cubemap.c)
> piglit_add_executable (generatemipmap-cubemap generatemipmap-cubemap.c)
> piglit_add_executable (fragment-and-vertex-texturing fragment-and-vertex-texturing.c)
> piglit_add_executable (levelclamp levelclamp.c)
> diff --git a/tests/texturing/incomplete-cubemap.c b/tests/texturing/incomplete-cubemap.c
> new file mode 100644
> index 0000000..99f6e9a
> --- /dev/null
> +++ b/tests/texturing/incomplete-cubemap.c
> @@ -0,0 +1,191 @@
> +/*
> + * Copyright © 2016 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.
> + */
> +
> +/**
> + * Tests that a cube map texture which doesn't have the same size or
> + * format for all of the faces isn't considered complete.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> + config.supports_gl_compat_version = 20;
> + config.supports_gl_core_version = 31;
> +
> + config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static const GLenum
> +faces[6] = {
> + GL_TEXTURE_CUBE_MAP_POSITIVE_X,
> + GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
> + GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
> + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
> + GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
> + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
> +};
> +
> +enum test_attribute {
> + TEST_ATTRIBUTE_SIZE,
> + TEST_ATTRIBUTE_FORMAT
> +};
> +
> +static enum test_attribute
> +test_attribute;
> +
> +/* Incomplete textures return 0,0,0,1 when sampled in GLSL */
> +static const float
> +expected_color[] = {
> + 0.0f, 0.0f, 0.0f, 1.0f
> +};
> +
> +static const char
> +vertex_source[] =
> + "attribute vec2 piglit_vertex;\n"
> + "\n"
> + "void\n"
> + "main()\n"
> + "{\n"
> + " gl_Position = vec4(piglit_vertex, 0.0, 1.0);\n"
> + "}\n";
> +
> +static const char
> +fragment_source[] =
> + "uniform samplerCube tex;\n"
> + "\n"
> + "void\n"
> + "main()\n"
> + "{\n"
> + " gl_FragColor = textureCube(tex, vec3(0.0));\n"
> + "}\n";
> +
> +static void
> +make_image(GLenum target,
> + int size,
> + GLenum internal_format)
> +{
> + GLubyte *data = malloc(size * size * 4), *p = data;
> + int i;
> +
> + for (i = 0; i < size * size; i++) {
> + /* Red texture because it should be incomplete so if
> + * it is displayed then it is a failure.
> + */
> + *(p++) = 0xff;
> + *(p++) = 0x00;
> + *(p++) = 0x00;
> + *(p++) = 0xff;
> + }
> +
> + glTexImage2D(target,
> + 0, /* level */
> + internal_format,
> + size, size,
> + 0, /* border */
> + GL_RGBA,
> + GL_UNSIGNED_BYTE,
> + data);
> +
> + free(data);
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> + GLuint tex;
> + int face;
> + GLenum internal_format;
> + int size;
> + bool pass;
> +
> + glGenTextures(1, &tex);
> + glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
> +
> + for (face = 0; face < ARRAY_SIZE (faces); face++) {
^ Spurious space
Also... Since it works with Visual Studio, at least some people have
started using the form
for (unsigned face = 0; face < ARRAY_SIZE(faces); face++) {
> + internal_format = GL_RGBA;
> + size = 4;
> +
> + if (face == 3) {
> + switch (test_attribute) {
> + case TEST_ATTRIBUTE_SIZE:
> + size = 8;
> + break;
> + case TEST_ATTRIBUTE_FORMAT:
> + internal_format = GL_RGB;
> + break;
> + }
> + }
> +
> + make_image(faces[face], size, internal_format);
> + }
> +
> + glTexParameteri(GL_TEXTURE_CUBE_MAP,
> + GL_TEXTURE_MIN_FILTER,
> + GL_NEAREST);
> + glTexParameteri(GL_TEXTURE_CUBE_MAP,
> + GL_TEXTURE_MAG_FILTER,
> + GL_NEAREST);
> +
> + piglit_draw_rect(-1, -1, 2, 2);
> +
> + glDeleteTextures(1, &tex);
> +
> + pass = piglit_probe_rect_rgba(0, 0,
> + piglit_width, piglit_height,
> + expected_color);
> +
> + piglit_present_results();
> +
> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +static void
> +show_usage(void)
> +{
> + fprintf(stderr, "usage: incomplete-cubemap <size|format>\n");
> + piglit_report_result(PIGLIT_FAIL);
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> + GLuint program;
> + GLuint tex_location;
> +
> + if (argc != 2)
> + show_usage();
> +
> + if (!strcmp(argv[1], "size"))
> + test_attribute = TEST_ATTRIBUTE_SIZE;
> + else if (!strcmp(argv[1], "format"))
> + test_attribute = TEST_ATTRIBUTE_FORMAT;
> + else
> + show_usage();
> +
> + program = piglit_build_simple_program(vertex_source, fragment_source);
> + glUseProgram(program);
> + tex_location = glGetUniformLocation(program, "tex");
> + glUniform1i(tex_location, 0);
Since the default value of all uniforms is 0, you can omit this.
> +}
>
More information about the Piglit
mailing list