On 18.07.18 00:01, Francisco Jerez wrote:
Danylo Piliaiev <danylo.pilia...@gmail.com> writes:

Test for the regression which happened when GL_TEXTURE_BUFFER was
allowed to have incompatible format.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106465

Signed-off-by: Danylo Piliaiev <danylo.pilia...@globallogic.com>
---
  .../arb_shader_image_load_store/invalid.c     | 54 +++++++++++++++++--
  1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/tests/spec/arb_shader_image_load_store/invalid.c 
b/tests/spec/arb_shader_image_load_store/invalid.c
index ed4b6c064..adab56ffc 100644
--- a/tests/spec/arb_shader_image_load_store/invalid.c
+++ b/tests/spec/arb_shader_image_load_store/invalid.c
@@ -172,12 +172,45 @@ init_level(const struct image_info img, unsigned level,
             GLenum format, unsigned w, unsigned h)
  {
          uint32_t pixels[4 * N];
-
          init_pixels(img, pixels, 1, 1, 1, 1);
-        glBindTexture(GL_TEXTURE_2D, get_texture(0));
-        glTexImage2D(GL_TEXTURE_2D, level, format,
-                     w, h, 0, img.format->pixel_format,
-                     image_base_type(img.format), pixels);
+
+        glBindTexture(img.target->target, get_texture(0));
+
+        switch (img.target->target) {
+        case GL_TEXTURE_2D: {
+                glTexImage2D(GL_TEXTURE_2D, level, format,
+                        w, h, 0, img.format->pixel_format,
+                        image_base_type(img.format), pixels);
+                break;
+        }
+        case GL_TEXTURE_BUFFER: {
+                const struct image_extent grid = 
image_optimal_extent(img.size);
+                GLuint packed_tex;
+
+                assert(level == 0);
+
+                glBindBuffer(GL_PIXEL_PACK_BUFFER, get_buffer(0));
+                glBufferData(GL_PIXEL_PACK_BUFFER,
+                             img.size.x * image_pixel_size(img.format) / 8,
+                             NULL, GL_STATIC_DRAW);
+
+                glGenTextures(1, &packed_tex);
+                glBindTexture(GL_TEXTURE_2D, packed_tex);
+
+                glTexImage2D(GL_TEXTURE_2D, 0, format,
+                             grid.x, grid.y, 0, img.format->pixel_format,
+                             image_base_type(img.format), pixels);
+                glGetTexImage(GL_TEXTURE_2D, 0, img.format->pixel_format,
+                              img.format->pixel_type, NULL);
+                glDeleteTextures(1, &packed_tex);
+                glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+
+                glTexBuffer(GL_TEXTURE_BUFFER, format, get_buffer(0));
+                break;
Can't you call upload_image() instead of reimplementing these hacks here
in order to pack the pixels into a PBO?  Texture buffers only have one
level anyway so it shouldn't hurt to recreate the whole texture.

I cannot use upload_image() from common.c as is since there is a subtle difference: I need to pass custom internalFormat to glTexImage2D which is the point of this test
(same reason init_level existed before).
But yes, it looks like code duplication, an alternative is to extend upload_image_levels()
which also doesn't look good for me.
+        }
+        default:
+                abort();
+        }
return piglit_check_gl_error(GL_NO_ERROR);
  }
@@ -346,6 +379,8 @@ piglit_init(int argc, char **argv)
          for (op = image_ops; op->name; ++op) {
                  const struct image_info def_img = image_info(
                          GL_TEXTURE_2D, op->formats[0].format, W, H);
+                const struct image_info def_img_buffer = image_info(
+                        GL_TEXTURE_BUFFER, op->formats[0].format, W, H);
/*
                   * According to the spec, an access is considered
@@ -399,6 +434,15 @@ piglit_init(int argc, char **argv)
                                   invalidate_incompatible_format, false),
                          "%s/incompatible format test", op->name);
+ /* Test for the regression which happened when
+                 * GL_TEXTURE_BUFFER was allowed to have incompatible format.
+                 */
+                subtest(&status, true,
+                        run_test(op, def_img_buffer, def_img_buffer,
+                                 invalidate_incompatible_format, false),
+                        "%s/incompatible format test/image%s",
+                        op->name, def_img_buffer.target->name);
+
                  /*
                   * " * the texture bound to the image unit has layers,
                   *     and the selected layer or cube map face doesn't
--
2.17.1

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

Reply via email to