Some of the error checks were incorrect before.  Per the spec:

1. GL_TEXTURE_BUFFER and GL_TEXTURE_CUBE_MAP_+/-_XYZ are not legal targets
and should be flagged as invalid enums.

2. GL_INVALID_OPERATION should be generated when trying to copy between
compressed/uncompressed formats whose block/texel size do not match.

v2: Also quote spec language for the tests being done, per Ian.
And, remove testing invalid target enums.
---
 tests/spec/arb_copy_image/api_errors.c | 59 ++++++++++++++++++++++++++--------
 1 file changed, 45 insertions(+), 14 deletions(-)

diff --git a/tests/spec/arb_copy_image/api_errors.c 
b/tests/spec/arb_copy_image/api_errors.c
index 0ef1eda..00c97a5 100644
--- a/tests/spec/arb_copy_image/api_errors.c
+++ b/tests/spec/arb_copy_image/api_errors.c
@@ -78,22 +78,16 @@ image_storage(GLenum target, GLuint name, GLenum 
internal_format,
        }
 }
 
-GLenum targets[] = {
+/* only testing legal targets below */
+static const GLenum targets[] = {
        GL_TEXTURE_1D,
        GL_TEXTURE_1D_ARRAY,
        GL_TEXTURE_2D,
        GL_TEXTURE_RECTANGLE,
-       GL_TEXTURE_BUFFER,
        GL_TEXTURE_2D_ARRAY,
        GL_TEXTURE_2D_MULTISAMPLE,
        GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
        GL_TEXTURE_CUBE_MAP,
-       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,
        GL_TEXTURE_CUBE_MAP_ARRAY,
        GL_TEXTURE_3D
 };
@@ -132,29 +126,45 @@ test_simple_errors(GLenum src_target, GLenum dst_target)
        /* This is no longer needed */
        image_delete(src_target, src2);
 
+       /* Section 18.3.2 (Copying Between Images) of the OpenGL 4.5 Core
+        * Profile spec says:
+        *
+        *     "An INVALID_VALUE error is generated if either name does not
+        *     correspond to a valid renderbuffer or texture object according
+        *     to the corresponding target parameter."
+        */
        if (src_target != GL_RENDERBUFFER_EXT) {
                for (i = 0; i < ARRAY_LENGTH(targets); ++i) {
                        if (targets[i] == src_target)
                                continue;
 
+                       /* here, targets[i] doesn't match src object's target */
                        glCopyImageSubData(src, targets[i], 0, 0, 0, 0,
                                           dst, dst_target, 0, 0, 0, 0,
                                           0, 0, 0);
-                       pass &= piglit_check_gl_error(GL_INVALID_ENUM);
+                       pass &= piglit_check_gl_error(GL_INVALID_VALUE);
                        if (!pass)
                                return false;
                }
        }
 
+       /* Section 18.3.2 (Copying Between Images) of the OpenGL 4.5 Core
+        * Profile spec says:
+        *
+        *     "An INVALID_VALUE error is generated if either name does not
+        *     correspond to a valid renderbuffer or texture object according
+        *     to the corresponding target parameter."
+        */
        if (dst_target != GL_RENDERBUFFER_EXT) {
                for (i = 0; i < ARRAY_LENGTH(targets); ++i) {
                        if (targets[i] == dst_target)
                                continue;
 
+                       /* here, targets[i] doesn't match dst object's target */
                        glCopyImageSubData(src, src_target, 0, 0, 0, 0,
                                           dst, targets[i], 0, 0, 0, 0,
                                           0, 0, 0);
-                       pass &= piglit_check_gl_error(GL_INVALID_ENUM);
+                       pass &= piglit_check_gl_error(GL_INVALID_VALUE);
                        if (!pass)
                                return false;
                }
@@ -230,19 +240,38 @@ test_compressed_alignment_errors()
                           tex[1], GL_TEXTURE_2D, 0, 0, 0, 0, 20, 24, 1);
        pass &= piglit_check_gl_error(GL_INVALID_VALUE);
 
-       /* Check for compressed with wrong block size */
+       /* Section 18.3.2 (Copying Between Images) of the OpenGL 4.5 Core
+        * Profile spec says:
+        *
+        *     "An INVALID_OPERATION error is generated if the texel size of
+        *     the uncompressed image is not equal to the block size of the
+        *     compressed image."
+        */
        glBindTexture(GL_TEXTURE_2D, tex[2]);
        glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB16UI, 32, 32);
        glCopyImageSubData(tex[0], GL_TEXTURE_2D, 0, 0, 0, 0,
                           tex[2], GL_TEXTURE_2D, 0, 0, 0, 0, 20, 20, 1);
-       pass &= piglit_check_gl_error(GL_INVALID_VALUE);
+       pass &= piglit_check_gl_error(GL_INVALID_OPERATION);
 
+       /* Section 18.3.2 (Copying Between Images) of the OpenGL 4.5 Core
+        * Profile spec says:
+        *
+        *     "An INVALID_OPERATION error is generated if the formats are
+         *     not compatible."
+         *
+         * The definition of compatible refers back to table 8.22 "Compatible
+        * internal formats for TextureView."  This table does not contain
+        * S3TC formats because they are from an older extension.  Given the
+        * different encodings of DXT1 and DXT3 textures, it is reasonable to
+        * assume they would not be compatible for texture views, and this
+        * matches at least NVIDIA's implementation.
+        */
        glBindTexture(GL_TEXTURE_2D, tex[3]);
        glTexStorage2D(GL_TEXTURE_2D, 1,
                       GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 32, 32);
        glCopyImageSubData(tex[0], GL_TEXTURE_2D, 0, 0, 0, 0,
                           tex[3], GL_TEXTURE_2D, 0, 0, 0, 0, 20, 20, 1);
-       pass &= piglit_check_gl_error(GL_INVALID_VALUE);
+       pass &= piglit_check_gl_error(GL_INVALID_OPERATION);
 
        glDeleteTextures(4, tex);
 
@@ -258,7 +287,9 @@ piglit_display(void)
        pass &= test_simple_errors(GL_RENDERBUFFER, GL_TEXTURE_2D);
        pass &= test_simple_errors(GL_TEXTURE_2D, GL_RENDERBUFFER);
        pass &= test_simple_errors(GL_RENDERBUFFER, GL_RENDERBUFFER);
-       pass &= test_compressed_alignment_errors();
+       if (piglit_is_extension_supported("GL_EXT_texture_compression_s3tc")) {
+               pass &= test_compressed_alignment_errors();
+       }
 
        return pass ? PIGLIT_PASS : PIGLIT_FAIL;
 }
-- 
1.9.1

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

Reply via email to