From: Marek Olšák <marek.ol...@amd.com>

needed to exercise radeonsi codepaths
---
 tests/spec/arb_texture_view/rendering-formats.c | 570 +++++++++++++++++++++++-
 1 file changed, 559 insertions(+), 11 deletions(-)

diff --git a/tests/spec/arb_texture_view/rendering-formats.c 
b/tests/spec/arb_texture_view/rendering-formats.c
index fe996b8..fbad845 100644
--- a/tests/spec/arb_texture_view/rendering-formats.c
+++ b/tests/spec/arb_texture_view/rendering-formats.c
@@ -1123,21 +1123,513 @@ test_by_sampling(const char *test_name,
                 enum piglit_result *all)
 {
        GLuint prog;
        bool pass;
        enum piglit_result one_result;
 
        prog = create_program(vformat);
 
        /* Draw only one pixel. We don't need more. */
        piglit_draw_rect(-1, -1, 2.0/TEX_SIZE, 2.0/TEX_SIZE);
-       pass = piglit_probe_pixel_rgba(0, 0, green);
+       pass = piglit_probe_pixel_rgba_silent(0, 0, green, NULL);
+
+       one_result = pass ? PIGLIT_PASS : PIGLIT_FAIL;
+       piglit_report_subtest_result(one_result, "%s", test_name);
+       piglit_merge_result(all, one_result);
+
+       glDeleteProgram(prog);
+}
+
+static bool
+is_any_integer(const struct format_info *vformat)
+{
+       return vformat->format == GL_RGBA_INTEGER ||
+               vformat->format == GL_RGB_INTEGER ||
+               vformat->format == GL_RG_INTEGER ||
+               vformat->format == GL_RED_INTEGER;
+}
+
+static bool
+is_signed(const struct format_info *vformat)
+{
+       return vformat->type == GL_BYTE ||
+               vformat->type == GL_SHORT ||
+               vformat->type == GL_INT;
+}
+
+static unsigned
+get_num_components(const struct format_info *vformat)
+{
+       switch (vformat->format) {
+       case GL_RGBA:
+       case GL_RGBA_INTEGER:
+               return 4;
+       case GL_RGB:
+       case GL_RGB_INTEGER:
+               return 3;
+       case GL_RG:
+       case GL_RG_INTEGER:
+               return 2;
+       case GL_RED:
+       case GL_RED_INTEGER:
+               return 1;
+       default:
+               assert(0);
+               return 0;
+       }
+}
+
+static GLuint
+create_test_clear_program(const struct format_info *base,
+                         const struct format_info *clear)
+{
+       char fs[4096];
+       GLuint prog;
+       const char *sampler = "";
+       const char *conv = "";
+       unsigned expected[4] = {};
+       unsigned i;
+       unsigned base_num_components = get_num_components(base);
+       bool test_nan = false;
+
+       /* Find out what the clear value is when fetched using the base format. 
*/
+       for (i = 0; i < base_num_components; i++) {
+               switch (clear->internalformat) {
+               case GL_RGBA32F:
+               case GL_RGB32F:
+               case GL_RG32F:
+               case GL_R32F:
+                       if (base->internalformat == GL_RGBA16UI ||
+                           base->internalformat == GL_RGBA16I ||
+                           base->internalformat == GL_RG16UI ||
+                           base->internalformat == GL_RG16I) {
+                               expected[i++] = 0x0000;
+                               expected[i] = 0x3f80;
+                       } else if (base->internalformat == GL_RGBA16 ||
+                                  base->internalformat == GL_RG16) {
+                               expected[i++] = 0;
+                               expected[i] = 0x3e7e00fe;
+                       } else if (base->internalformat == GL_RGBA16_SNORM ||
+                                  base->internalformat == GL_RG16_SNORM) {
+                               expected[i++] = 0;
+                               expected[i] = 0x3efe01fc;
+                       } else if (base->internalformat == GL_RGBA16F ||
+                                  base->internalformat == GL_RG16F) {
+                               expected[i++] = 0;
+                               expected[i] = 0x3ff00000;
+                       } else if (base->internalformat == GL_RGBA8UI) {
+                               expected[i++] = 0x00;
+                               expected[i++] = 0x00;
+                               expected[i++] = 0x80;
+                               expected[i] = 0x3f;
+                       } else if (base->internalformat == GL_RGBA8I) {
+                               expected[i++] = 0x00;
+                               expected[i++] = 0x00;
+                               expected[i++] = 0xffffff80;
+                               expected[i] = 0x3f;
+                       } else if (base->internalformat == GL_RGBA8) {
+                               expected[i++] = 0;
+                               expected[i++] = 0;
+                               expected[i++] = 0x3f008081;
+                               expected[i] = 0x3e7cfcfd;
+                       } else if (base->internalformat == GL_RGBA8_SNORM) {
+                               expected[i++] = 0;
+                               expected[i++] = 0;
+                               expected[i++] = 0xbf800000;
+                               expected[i] = 0x3efdfbf8;
+                       } else if (base->internalformat == GL_RGB10_A2UI) {
+                               expected[i++] = 0;
+                               expected[i++] = 0;
+                               expected[i++] = 0x3f8;
+                               expected[i] = 0;
+                       } else if (base->internalformat == GL_RGB10_A2) {
+                               expected[i++] = 0;
+                               expected[i++] = 0;
+                               expected[i++] = 0x3f7e3f90;
+                               expected[i] = 0;
+                       } else {
+                               expected[i] = 0x3f800000;
+                       }
+                       break;
+               case GL_RGBA32I:
+               case GL_RGB32I:
+               case GL_RG32I:
+               case GL_R32I:
+                       if (base->internalformat == GL_RGBA16UI ||
+                           base->internalformat == GL_RG16UI) {
+                               expected[i++] = 0xffff;
+                               expected[i] = 0x7fff;
+                       } else if (base->internalformat == GL_RGBA16I ||
+                                  base->internalformat == GL_RG16I) {
+                               expected[i++] = 0xffffffff;
+                               expected[i] = 0x7fff;
+                       } else if (base->internalformat == GL_RGBA16 ||
+                                  base->internalformat == GL_RG16) {
+                               expected[i++] = 0x3f800000;
+                               expected[i] = 0x3effff00;
+                       } else if (base->internalformat == GL_RGBA16_SNORM ||
+                                  base->internalformat == GL_RG16_SNORM) {
+                               expected[i++] = 0xb8000100;
+                               expected[i] = 0x3f800000;
+                       } else if (base->internalformat == GL_RGBA16F ||
+                                  base->internalformat == GL_RG16F) {
+                               test_nan = true;
+                               expected[i] = true;
+                       } else if (base->internalformat == GL_RGBA8UI) {
+                               expected[i++] = 0xff;
+                               expected[i++] = 0xff;
+                               expected[i++] = 0xff;
+                               expected[i] = 0x7f;
+                       } else if (base->internalformat == GL_RGBA8I) {
+                               expected[i++] = 0xffffffff;
+                               expected[i++] = 0xffffffff;
+                               expected[i++] = 0xffffffff;
+                               expected[i] = 0x7f;
+                       } else if (base->internalformat == GL_RGB10_A2UI) {
+                               expected[i++] = 0x3ff;
+                               expected[i++] = 0x3ff;
+                               expected[i++] = 0x3ff;
+                               expected[i] = 0x1;
+                       } else if (base->internalformat == GL_RGBA8) {
+                               expected[i++] = 0x3f800000;
+                               expected[i++] = 0x3f800000;
+                               expected[i++] = 0x3f800000;
+                               expected[i] = 0x3efefeff;
+                       } else if (base->internalformat == GL_RGBA8_SNORM) {
+                               expected[i++] = 0xbc010204;
+                               expected[i++] = 0xbc010204;
+                               expected[i++] = 0xbc010204;
+                               expected[i] = 0x3f800000;
+                       } else if (base->internalformat == GL_RGB10_A2) {
+                               expected[i++] = 0x3f800000;
+                               expected[i++] = 0x3f800000;
+                               expected[i++] = 0x3f800000;
+                               expected[i] = 0x3eaaaaab;
+                       } else {
+                               expected[i] = 0x7fffffff;
+                       }
+                       break;
+               case GL_RGBA16F:
+               case GL_RGB16F:
+               case GL_RG16F:
+               case GL_R16F:
+                       if (base->internalformat == GL_RG32F ||
+                           base->internalformat == GL_RG32I ||
+                           base->internalformat == GL_RG32UI ||
+                           base->internalformat == GL_R32F ||
+                           base->internalformat == GL_R32I ||
+                           base->internalformat == GL_R32UI)
+                               expected[i] = 0x3c003c00;
+                       else if (base->internalformat == GL_RGBA16UI ||
+                                base->internalformat == GL_RGBA16I ||
+                                base->internalformat == GL_RGB16UI ||
+                                base->internalformat == GL_RGB16I ||
+                                base->internalformat == GL_RG16UI ||
+                                base->internalformat == GL_RG16I ||
+                                base->internalformat == GL_R16UI ||
+                                base->internalformat == GL_R16I)
+                               expected[i] = 0x3c00;
+                       else if (base->internalformat == GL_RGBA16 ||
+                                base->internalformat == GL_RGB16 ||
+                                base->internalformat == GL_RG16 ||
+                                base->internalformat == GL_R16)
+                               expected[i] = 0x3e7000f0;
+                       else if (base->internalformat == GL_RGBA16_SNORM ||
+                                base->internalformat == GL_RGB16_SNORM ||
+                                base->internalformat == GL_RG16_SNORM ||
+                                base->internalformat == GL_R16_SNORM)
+                               expected[i] = 0x3ef001e0;
+                       else if (base->internalformat == GL_RGBA8UI ||
+                                base->internalformat == GL_RGBA8I ||
+                                base->internalformat == GL_RG8UI ||
+                                base->internalformat == GL_RG8I) {
+                               expected[i++] = 0x00;
+                               expected[i] = 0x3c;
+                       } else if (base->internalformat == GL_RGBA8 ||
+                                  base->internalformat == GL_RG8) {
+                               expected[i++] = 0x00;
+                               expected[i] = 0x3e70f0f1;
+                       } else if (base->internalformat == GL_RGBA8_SNORM ||
+                                  base->internalformat == GL_RG8_SNORM) {
+                               expected[i++] = 0x00;
+                               expected[i] = 0x3ef1e3c8;
+                       } else if (base->internalformat == GL_RGB10_A2UI) {
+                               expected[i++] = 0;
+                               expected[i++] = 0xf;
+                               expected[i++] = 0x3c0;
+                               expected[i] = 0;
+                       } else if (base->internalformat == GL_RGB10_A2) {
+                               expected[i++] = 0;
+                               expected[i++] = 0x3c703c0f;
+                               expected[i++] = 0x3f703c0f;
+                               expected[i] = 0;
+                       } else
+                               expected[i] = 0x3f800000;
+                       break;
+               case GL_RGBA32UI:
+               case GL_RGB32UI:
+               case GL_RG32UI:
+               case GL_R32UI:
+               case GL_RGBA16UI:
+               case GL_RGB16UI:
+               case GL_RG16UI:
+               case GL_R16UI:
+               case GL_RGBA8UI:
+               case GL_RGB8UI:
+               case GL_RG8UI:
+               case GL_R8UI:
+               case GL_RGB10_A2UI:
+               case GL_RGBA16:
+               case GL_RGB16:
+               case GL_RG16:
+               case GL_R16:
+               case GL_RGBA8:
+               case GL_RGB8:
+               case GL_RG8:
+               case GL_R8:
+               case GL_RGB10_A2:
+                       if (base->internalformat == GL_RGBA32F ||
+                           base->internalformat == GL_RGB32F ||
+                           base->internalformat == GL_RGBA32UI ||
+                           base->internalformat == GL_RGB32UI ||
+                           base->internalformat == GL_RGBA32I ||
+                           base->internalformat == GL_RGB32I ||
+                           base->internalformat == GL_RG32F ||
+                           base->internalformat == GL_RG32I ||
+                           base->internalformat == GL_RG32UI ||
+                           base->internalformat == GL_R32F ||
+                           base->internalformat == GL_R32I ||
+                           base->internalformat == GL_R32UI ||
+                           base->internalformat == GL_RGBA16I ||
+                           base->internalformat == GL_RGB16I ||
+                           base->internalformat == GL_RG16I ||
+                           base->internalformat == GL_R16I ||
+                           base->internalformat == GL_RGBA8I ||
+                           base->internalformat == GL_RGB8I ||
+                           base->internalformat == GL_RG8I ||
+                           base->internalformat == GL_R8I)
+                               expected[i] = 0xffffffff;
+                       else if (base->internalformat == GL_RGBA16 ||
+                                base->internalformat == GL_RGB16 ||
+                                base->internalformat == GL_RG16 ||
+                                base->internalformat == GL_R16 ||
+                                base->internalformat == GL_RGBA8 ||
+                                base->internalformat == GL_RGB8 ||
+                                base->internalformat == GL_RG8 ||
+                                base->internalformat == GL_R8 ||
+                                base->internalformat == GL_RGB10_A2)
+                               expected[i] = 0x3f800000;
+                       else if (base->internalformat == GL_RGBA16_SNORM ||
+                                base->internalformat == GL_RGB16_SNORM ||
+                                base->internalformat == GL_RG16_SNORM ||
+                                base->internalformat == GL_R16_SNORM)
+                               expected[i] = 0xb8000100;
+                       else if (base->internalformat == GL_RGBA16F ||
+                                base->internalformat == GL_RGB16F ||
+                                base->internalformat == GL_RG16F ||
+                                base->internalformat == GL_R16F) {
+                               test_nan = true;
+                               expected[i] = true;
+                       } else if (base->internalformat == GL_RGBA8UI ||
+                                  base->internalformat == GL_RGB8UI ||
+                                  base->internalformat == GL_RG8UI ||
+                                  base->internalformat == GL_R8UI)
+                               expected[i] = 0xff;
+                       else if (base->internalformat == GL_RGBA8_SNORM ||
+                                base->internalformat == GL_RGB8_SNORM ||
+                                base->internalformat == GL_RG8_SNORM ||
+                                base->internalformat == GL_R8_SNORM)
+                               expected[i] = 0xbc010204;
+                       else if (base->internalformat == GL_RGB10_A2UI) {
+                               expected[i++] = 0x3ff;
+                               expected[i++] = 0x3ff;
+                               expected[i++] = 0x3ff;
+                               expected[i] = 0x3;
+                       } else
+                               expected[i] = 0xffff;
+                       break;
+               case GL_RGBA16I:
+               case GL_RGB16I:
+               case GL_RG16I:
+               case GL_R16I:
+               case GL_RGBA16_SNORM:
+               case GL_RGB16_SNORM:
+               case GL_RG16_SNORM:
+               case GL_R16_SNORM:
+                       if (base->internalformat == GL_RG32F ||
+                           base->internalformat == GL_RG32I ||
+                           base->internalformat == GL_RG32UI ||
+                           base->internalformat == GL_R32F ||
+                           base->internalformat == GL_R32I ||
+                           base->internalformat == GL_R32UI)
+                               expected[i] = 0x7fff7fff;
+                       else if (base->internalformat == GL_RGBA16 ||
+                                base->internalformat == GL_RGB16 ||
+                                base->internalformat == GL_RG16 ||
+                                base->internalformat == GL_R16)
+                               expected[i] = 0x3effff00;
+                       else if (base->internalformat == GL_RGBA16_SNORM ||
+                                base->internalformat == GL_RGB16_SNORM ||
+                                base->internalformat == GL_RG16_SNORM ||
+                                base->internalformat == GL_R16_SNORM)
+                               expected[i] = 0x3f800000;
+                       else if (base->internalformat == GL_RGBA16F ||
+                                base->internalformat == GL_RGB16F ||
+                                base->internalformat == GL_RG16F ||
+                                base->internalformat == GL_R16F) {
+                               test_nan = true;
+                               expected[i] = true;
+                       } else if (base->internalformat == GL_RGBA8UI ||
+                                  base->internalformat == GL_RG8UI) {
+                               expected[i++] = 0xff;
+                               expected[i] = 0x7f;
+                       } else if (base->internalformat == GL_RGBA8I ||
+                                  base->internalformat == GL_RG8I) {
+                               expected[i++] = 0xffffffff;
+                               expected[i] = 0x7f;
+                       } else if (base->internalformat == GL_RGBA8 ||
+                                  base->internalformat == GL_RG8) {
+                               expected[i++] = 0x3f800000;
+                               expected[i] = 0x3efefeff;
+                       } else if (base->internalformat == GL_RGBA8_SNORM ||
+                                  base->internalformat == GL_RG8_SNORM) {
+                               expected[i++] = 0xbc010204;
+                               expected[i] = 0x3f800000;
+                       } else if (base->internalformat == GL_RGB10_A2UI) {
+                               expected[i++] = 0x3ff;
+                               expected[i++] = 0x3df;
+                               expected[i++] = 0x3ff;
+                               expected[i] = 0x1;
+                       } else if (base->internalformat == GL_RGB10_A2) {
+                               expected[i++] = 0x3f800000;
+                               expected[i++] = 0x3f77fdff;
+                               expected[i++] = 0x3f800000;
+                               expected[i] = 0x3eaaaaab;
+                       } else
+                               expected[i] = 0x7fff;
+                       break;
+               case GL_RGBA8I:
+               case GL_RGB8I:
+               case GL_RG8I:
+               case GL_R8I:
+               case GL_RGBA8_SNORM:
+               case GL_RGB8_SNORM:
+               case GL_RG8_SNORM:
+               case GL_R8_SNORM:
+                       if (base->internalformat == GL_R32F ||
+                           base->internalformat == GL_R32I ||
+                           base->internalformat == GL_R32UI)
+                               expected[i] = 0x7f7f7f7f;
+                       else if (base->internalformat == GL_RG16UI ||
+                                base->internalformat == GL_RG16I ||
+                                base->internalformat == GL_R16UI ||
+                                base->internalformat == GL_R16I)
+                               expected[i] = 0x7f7f;
+                       else if (base->internalformat == GL_RG16 ||
+                                base->internalformat == GL_R16 ||
+                                base->internalformat == GL_RGBA8 ||
+                                base->internalformat == GL_RGB8 ||
+                                base->internalformat == GL_RG8 ||
+                                base->internalformat == GL_R8)
+                               expected[i] = 0x3efefeff;
+                       else if (base->internalformat == GL_RG16F ||
+                                base->internalformat == GL_R16F) {
+                               test_nan = true;
+                               expected[i] = true;
+                       } else if (base->internalformat == GL_RG16_SNORM ||
+                                base->internalformat == GL_R16_SNORM)
+                               expected[i] = 0x3f7efffe;
+                       else if (base->internalformat == GL_RGBA8UI ||
+                                base->internalformat == GL_RGB8UI ||
+                                base->internalformat == GL_RG8UI ||
+                                base->internalformat == GL_R8UI ||
+                                base->internalformat == GL_RGBA8I ||
+                                base->internalformat == GL_RGB8I ||
+                                base->internalformat == GL_RG8I ||
+                                base->internalformat == GL_R8I)
+                               expected[i] = 0x7f;
+                       else if (base->internalformat == GL_RGB10_A2UI) {
+                               expected[i++] = 0x37f;
+                               expected[i++] = 0x3df;
+                               expected[i++] = 0x3f7;
+                               expected[i] = 0x1;
+                       } else if (base->internalformat == GL_RGB10_A2) {
+                               expected[i++] = 0x3f5ff7fe;
+                               expected[i++] = 0x3f77fdff;
+                               expected[i++] = 0x3f7dff80;
+                               expected[i] = 0x3eaaaaab;
+                       } else
+                               expected[i] = 0x3f800000;
+                       break;
+               }
+       }
+
+       for (; i < 4; i++)
+               expected[i] = test_nan ? false :
+                             is_any_integer(base) ? (i == 3 ? 1 : 0) :
+                                                    (i == 3 ? 0x3f800000 : 0);
+
+       if (is_any_integer(base)) {
+               if (is_signed(base)) {
+                       sampler = "isampler2D";
+                       conv = "uvec4";
+               } else {
+                       sampler = "usampler2D";
+               }
+       } else {
+               sampler = "sampler2D";
+               if (test_nan)
+                       conv = "test_nan";
+               else
+                       conv = "floatBitsToUint";
+       }
+
+       /* Use texelFetch, because normal texture instructions flush denormals
+        * to 0 on radeonsi.
+        */
+       snprintf(fs, sizeof(fs),
+                "#version 130\n"
+                "#extension GL_ARB_shader_bit_encoding : enable\n"
+                "uniform %s s;\n"
+                "uniform uvec4 expected;\n"
+                "uvec4 test_nan(vec4 v) { return uvec4(isnan(v)); }\n"
+                "void main() { \n"
+                "      if (%s(texelFetch(s, ivec2(0), 0)) == expected) {\n"
+                "              gl_FragColor = vec4(0,1,0,0);\n"
+                "      } else {\n"
+                "              gl_FragColor = vec4(1,0,0,0);\n"
+                "      }\n"
+                "}\n",
+                sampler, conv);
+
+       prog = piglit_build_simple_program(vs, fs);
+       glUseProgram(prog);
+       glUniform1i(glGetUniformLocation(prog, "s"), 0);
+       glUniform4uiv(glGetUniformLocation(prog, "expected"), 1, expected);
+       return prog;
+}
+
+static void
+test_clear_by_sampling(const char *test_name,
+                      const struct format_info *base,
+                      const struct format_info *vformat,
+                      enum piglit_result *all)
+{
+       GLuint prog;
+       bool pass;
+       enum piglit_result one_result;
+
+       prog = create_test_clear_program(base, vformat);
+
+       /* Draw only one pixel. We don't need more. */
+       piglit_draw_rect(-1, -1, 2.0/TEX_SIZE, 2.0/TEX_SIZE);
+       pass = piglit_probe_pixel_rgba_silent(0, 0, green, NULL);
 
        one_result = pass ? PIGLIT_PASS : PIGLIT_FAIL;
        piglit_report_subtest_result(one_result, "%s", test_name);
        piglit_merge_result(all, one_result);
 
        glDeleteProgram(prog);
 }
 
 static bool
 render_to_view(const struct format_info *vformat, GLuint tex)
@@ -1153,47 +1645,83 @@ render_to_view(const struct format_info *vformat, 
GLuint tex)
                               GL_TEXTURE_2D, view, 0);
 
        status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
        if (status != GL_FRAMEBUFFER_COMPLETE) {
                glDeleteFramebuffers(1, &fbo);
                glDeleteTextures(1, &view);
                glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo);
                return false;
        }
 
-       if (vformat->format == GL_RGBA_INTEGER ||
-           vformat->format == GL_RGB_INTEGER ||
-           vformat->format == GL_RG_INTEGER ||
-           vformat->format == GL_RED_INTEGER) {
-               if (vformat->type == GL_BYTE ||
-                   vformat->type == GL_SHORT ||
-                   vformat->type == GL_INT) {
+       if (is_any_integer(vformat)) {
+               if (is_signed(vformat)) {
                        glUseProgram(prog_sint);
                        glUniform4iv(loc_sint, 1, (int*)vformat->render_value);
                } else {
                        glUseProgram(prog_uint);
                        glUniform4uiv(loc_uint, 1, vformat->render_value);
                }
        } else {
                glUseProgram(prog_float);
                glUniform4fv(loc_float, 1, (float*)vformat->render_value);
        }
 
        /* Fill the whole texture - needed by radeonsi. */
        piglit_draw_rect(-1, -1, 2, 2);
 
        glDeleteFramebuffers(1, &fbo);
        glDeleteTextures(1, &view);
        glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo);
        return true;
 }
 
+static bool
+clear_view(const struct format_info *vformat, GLuint tex)
+{
+       /* Use these clear values - needed to test radeonsi codepaths. */
+       static unsigned ucolor[] = {0xffffffff, 0xffffffff, 0xffffffff, 
0xffffffff};
+       static int icolor[] = {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
+       static float fcolor[] = {1, 1, 1, 1};
+       GLuint fbo, status, view;
+
+       view = create_view(vformat, tex);
+       glBindTexture(GL_TEXTURE_2D, 0);
+
+       glGenFramebuffers(1, &fbo);
+       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+       glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                              GL_TEXTURE_2D, view, 0);
+
+       status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+       if (status != GL_FRAMEBUFFER_COMPLETE) {
+               glDeleteFramebuffers(1, &fbo);
+               glDeleteTextures(1, &view);
+               glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo);
+               return false;
+       }
+
+       if (is_any_integer(vformat)) {
+               if (is_signed(vformat)) {
+                       glClearBufferiv(GL_COLOR, 0, icolor);
+               } else {
+                       glClearBufferuiv(GL_COLOR, 0, ucolor);
+               }
+       } else {
+               glClearBufferfv(GL_COLOR, 0, fcolor);
+       }
+
+       glDeleteFramebuffers(1, &fbo);
+       glDeleteTextures(1, &view);
+       glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo);
+       return true;
+}
+
 enum piglit_result
 piglit_display(void)
 {
        enum piglit_result result = PIGLIT_PASS;
        int classi;
 
        glClear(GL_COLOR_BUFFER_BIT);
 
        /* Reinterpret sampler formats. */
        for (classi = 0; classi < ARRAY_SIZE(classes); classi++) {
@@ -1236,37 +1764,57 @@ piglit_display(void)
 
                for (i = 0; vclass->formats[i].fs; i++) {
                        const struct format_info *base = &vclass->formats[i];
                        int j;
 
                        for (j = 0; vclass->formats[j].fs; j++) {
                                const struct format_info *vformat = 
&vclass->formats[j];
                                char test_name[128];
                                GLuint tex;
 
+                               tex = create_texture(vclass, base, true);
+                               glBindTexture(GL_TEXTURE_2D, 0);
+
+                               /* Test rendering. */
                                snprintf(test_name, sizeof(test_name),
                                         "render to %s as %s",
                                         
piglit_get_gl_enum_name(base->internalformat),
                                         
piglit_get_gl_enum_name(vformat->internalformat));
 
-                               tex = create_texture(vclass, base, true);
-                               glBindTexture(GL_TEXTURE_2D, 0);
-
                                if (!render_to_view(vformat, tex)) {
                                        
piglit_report_subtest_result(PIGLIT_SKIP, "%s", test_name);
                                        piglit_merge_result(&result, 
PIGLIT_SKIP);
                                        glDeleteTextures(1, &tex);
                                        continue;
                                }
 
                                glBindTexture(GL_TEXTURE_2D, tex);
                                test_by_sampling(test_name, base, &result);
+                               glBindTexture(GL_TEXTURE_2D, 0);
+
+                               /* Test clearing. */
+                               snprintf(test_name, sizeof(test_name),
+                                        "clear %s as %s",
+                                        
piglit_get_gl_enum_name(base->internalformat),
+                                        
piglit_get_gl_enum_name(vformat->internalformat));
+
+                               if (!clear_view(vformat, tex)) {
+                                       
piglit_report_subtest_result(PIGLIT_SKIP, "%s", test_name);
+                                       piglit_merge_result(&result, 
PIGLIT_SKIP);
+                                       glDeleteTextures(1, &tex);
+                                       continue;
+                               }
+
+                               glBindTexture(GL_TEXTURE_2D, tex);
+                               test_clear_by_sampling(test_name, base, 
vformat, &result);
+                               glBindTexture(GL_TEXTURE_2D, 0);
+
                                glDeleteTextures(1, &tex);
 
                                piglit_check_gl_error(GL_NO_ERROR);
                        }
                }
        }
 
        piglit_report_result(result);
        return PIGLIT_FAIL; /* unreachable */
 }
-- 
2.7.4

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to