Previously, we only ever worked on level 0. Now we work on levels 1 and 3 so that cross-level copying gets tested. --- tests/spec/arb_copy_image/formats.c | 92 ++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 31 deletions(-)
diff --git a/tests/spec/arb_copy_image/formats.c b/tests/spec/arb_copy_image/formats.c index 5b07a1e..ae56b4f 100644 --- a/tests/spec/arb_copy_image/formats.c +++ b/tests/spec/arb_copy_image/formats.c @@ -33,6 +33,8 @@ #include "piglit-util-gl.h" #define TEX_SIZE 32 +#define DEFAULT_SRC_LEVEL 1 +#define DEFAULT_DST_LEVEL 3 PIGLIT_GL_TEST_CONFIG_BEGIN @@ -476,8 +478,7 @@ const char ms_compare_fs_source[] = " ivec2 tex_px = ivec2(tex_coords * tex_size);\n" " for (int i = 0; i < samples; ++i) {\n" " %svec4 val1 = texelFetch(tex1, tex_px, i);\n" -" %svec4 val2 = texelFetch(tex2, tex_px, i);\n" -" if (val1 == val2)\n" +" %svec4 val2 = texelFetch(tex2, tex_px, i);\n" " if (val1 == val2)\n" " ++count;\n" " }\n" " gl_FragColor = mix(red, green, float(count) / float(samples));\n" @@ -683,8 +684,8 @@ run_multisample_test(struct texture_format *src_format, } static bool -check_texture(GLuint texture, const struct texture_format *format, - const unsigned char *data) +check_texture(GLuint texture, unsigned level, + const struct texture_format *format, const unsigned char *data) { int i, j, k; bool pass = true; @@ -696,9 +697,9 @@ check_texture(GLuint texture, const struct texture_format *format, glBindTexture(GL_TEXTURE_2D, texture); if (format->block_width != 1 || format->block_height != 1) { /* Compressed */ - glGetCompressedTexImage(GL_TEXTURE_2D, 0, tex_data); + glGetCompressedTexImage(GL_TEXTURE_2D, level, tex_data); } else { - glGetTexImage(GL_TEXTURE_2D, 0, format->format, + glGetTexImage(GL_TEXTURE_2D, level, format->format, format->data_type, tex_data); } @@ -737,6 +738,7 @@ run_test(struct texture_format *src_format, struct texture_format *dst_format) { bool pass = true, warn = false; unsigned src_width, src_height, dst_width, dst_height; + unsigned src_level, dst_level; GLuint texture[2]; glEnable(GL_TEXTURE_2D); @@ -747,61 +749,89 @@ run_test(struct texture_format *src_format, struct texture_format *dst_format) src_height = TEX_SIZE * src_format->block_height; glBindTexture(GL_TEXTURE_2D, texture[0]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - if (src_format->block_width != 1 || src_format->block_height != 1) { - /* Compressed */ - glCompressedTexImage2D(GL_TEXTURE_2D, 0, - src_format->internal_format, - src_width, src_height, 0, - TEX_SIZE * TEX_SIZE * src_format->bytes, - src_data); + if (src_format->can_be_reinterpreted) { + src_level = DEFAULT_SRC_LEVEL; + glTexStorage2D(GL_TEXTURE_2D, src_level + 2, + src_format->internal_format, + src_width << src_level, src_height << src_level); + if (src_format->block_width != 1 || + src_format->block_height != 1) { + /* Compressed */ + glCompressedTexSubImage2D(GL_TEXTURE_2D, src_level, + 0, 0, + src_width, src_height, + src_format->internal_format, + TEX_SIZE * TEX_SIZE * src_format->bytes, + src_data); + } else { + glTexSubImage2D(GL_TEXTURE_2D, src_level, 0, 0, + src_width, src_height, src_format->format, + src_format->data_type, src_data); + } } else { + src_level = 0; + /* All non-reintepritable textures are uncompressed */ glTexImage2D(GL_TEXTURE_2D, 0, src_format->internal_format, src_width, src_height, 0, src_format->format, src_format->data_type, src_data); } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); pass &= piglit_check_gl_error(GL_NO_ERROR); if (!pass) goto cleanup; - warn |= !check_texture(texture[0], src_format, src_data); + warn |= !check_texture(texture[0], src_level, src_format, src_data); dst_width = TEX_SIZE * dst_format->block_width; dst_height = TEX_SIZE * dst_format->block_height; glBindTexture(GL_TEXTURE_2D, texture[1]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - if (dst_format->block_width != 1 || dst_format->block_height != 1) { - /* Compressed */ - glCompressedTexImage2D(GL_TEXTURE_2D, 0, - dst_format->internal_format, - dst_width, dst_height, 0, - TEX_SIZE * TEX_SIZE * dst_format->bytes, - dst_data); + if (dst_format->can_be_reinterpreted) { + dst_level = DEFAULT_DST_LEVEL; + glTexStorage2D(GL_TEXTURE_2D, dst_level + 2, + dst_format->internal_format, + dst_width << dst_level, dst_height << dst_level); + if (dst_format->block_width != 1 || + dst_format->block_height != 1) { + /* Compressed */ + glCompressedTexSubImage2D(GL_TEXTURE_2D, dst_level, + 0, 0, + dst_width, dst_height, + dst_format->internal_format, + TEX_SIZE * TEX_SIZE * dst_format->bytes, + dst_data); + } else { + glTexSubImage2D(GL_TEXTURE_2D, dst_level, 0, 0, + dst_width, dst_height, dst_format->format, + dst_format->data_type, dst_data); + } } else { + dst_level = 0; + /* All non-reintepritable textures are uncompressed */ glTexImage2D(GL_TEXTURE_2D, 0, dst_format->internal_format, dst_width, dst_height, 0, dst_format->format, dst_format->data_type, dst_data); } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); pass &= piglit_check_gl_error(GL_NO_ERROR); if (!pass) goto cleanup; - warn |= !check_texture(texture[1], dst_format, dst_data); + warn |= !check_texture(texture[1], dst_level, dst_format, dst_data); - glCopyImageSubData(texture[0], GL_TEXTURE_2D, 0, + glCopyImageSubData(texture[0], GL_TEXTURE_2D, src_level, src_width / 4, src_height / 4, 0, - texture[1], GL_TEXTURE_2D, 0, + texture[1], GL_TEXTURE_2D, dst_level, dst_width / 4, dst_height / 4, 0, src_width / 2, src_height / 2, 1); pass &= piglit_check_gl_error(GL_NO_ERROR); - glCopyImageSubData(texture[1], GL_TEXTURE_2D, 0, + glCopyImageSubData(texture[1], GL_TEXTURE_2D, dst_level, 0, dst_height / 2, 0, - texture[1], GL_TEXTURE_2D, 0, + texture[1], GL_TEXTURE_2D, dst_level, dst_width / 2, 0, 0, dst_width / 2, dst_height / 2, 1); pass &= piglit_check_gl_error(GL_NO_ERROR); - pass &= check_texture(texture[1], dst_format, res_data); + pass &= check_texture(texture[1], dst_level, dst_format, res_data); cleanup: glDeleteTextures(2, texture); -- 2.1.0 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit