[Piglit] [PATCH 2/7] gl-3.1: Add testing for updated required sized texture formats.
Eric Anholt
eric at anholt.net
Thu May 16 07:28:44 PDT 2013
v2: Rebase to master, make it work on core contexts, and add a few
formats I'd missed when writing the table originally.
---
tests/all.tests | 3 +-
tests/spec/gl-3.0/required-sized-texture-formats.c | 57 ++++++++++----
tests/util/sized-internalformats.c | 87 ++++++++++++++++++++++
tests/util/sized-internalformats.h | 14 ++++
4 files changed, 146 insertions(+), 15 deletions(-)
diff --git a/tests/all.tests b/tests/all.tests
index 5643919..8e452a7 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -696,7 +696,7 @@ add_concurrent_test(gl30, 'genmipmap-errors')
add_concurrent_test(gl30, 'getfragdatalocation')
add_concurrent_test(gl30, 'integer-errors')
gl30['minmax'] = concurrent_test('gl-3.0-minmax')
-add_concurrent_test(gl30, 'gl-3.0-required-sized-texture-formats')
+gl30['required-sized-texture-formats'] = concurrent_test('gl-3.0-required-sized-texture-formats 30')
add_concurrent_test(gl30, 'gl-3.0-required-renderbuffer-attachment-formats')
add_concurrent_test(gl30, 'gl-3.0-required-texture-attachment-formats')
add_concurrent_test(gl30, 'gl-3.0-texture-integer')
@@ -712,6 +712,7 @@ gl31['minmax'] = concurrent_test('gl-3.1-minmax')
for subtest in ['generated', 'written', 'flush']:
cmdline = 'primitive-restart-xfb {0}'.format(subtest)
gl31[cmdline] = concurrent_test('gl-3.1-' + cmdline)
+gl31['required-sized-texture-formats'] = concurrent_test('gl-3.0-required-sized-texture-formats 31')
# Group spec/glsl-es-1.00
spec['glsl-es-1.00'] = Group()
diff --git a/tests/spec/gl-3.0/required-sized-texture-formats.c b/tests/spec/gl-3.0/required-sized-texture-formats.c
index 9ec5954..a3524e7 100644
--- a/tests/spec/gl-3.0/required-sized-texture-formats.c
+++ b/tests/spec/gl-3.0/required-sized-texture-formats.c
@@ -35,18 +35,19 @@
* internal formats for any texture type will allocate exactly
* the internal component sizes and types shown for that format
* in tables 3.16- 3.17:"
+ *
+ * In GL 3.1 this is changed to allow increased precision for the
+ * required sized formats. From page 118 of the GL 3.1 core spec PDF
+ * (20090528):
+ *
+ * "In addition, implementations are required to support the
+ * following sized and compressed internal formats. Requesting
+ * one of these sized internal formats for any texture type will
+ * allocate at least the internal component sizes, and exactly
+ * the component types shown for that format in tables 3.12-
+ * 3.13: "
*/
-PIGLIT_GL_TEST_CONFIG_BEGIN
-
- config.supports_gl_compat_version = 10;
-
- config.window_width = 32;
- config.window_height = 32;
- config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
-
-PIGLIT_GL_TEST_CONFIG_END
-
GLenum type_queries[CHANNELS] = {
GL_TEXTURE_RED_TYPE,
GL_TEXTURE_GREEN_TYPE,
@@ -69,6 +70,8 @@ GLenum size_queries[CHANNELS] = {
GL_TEXTURE_STENCIL_SIZE,
};
+static int target_version;
+
enum piglit_result
piglit_display(void)
{
@@ -83,7 +86,7 @@ piglit_init(int argc, char **argv)
GLuint tex;
int i, c;
- piglit_require_gl_version(30);
+ piglit_require_gl_version(target_version);
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
@@ -95,11 +98,16 @@ piglit_init(int argc, char **argv)
GLenum format, type;
const struct sized_internalformat *f;
- /* FINISHME: Add support for future GL versions. */
- if (required_formats[i].version != 30)
+ if (!valid_for_gl_version(&required_formats[i], target_version))
continue;
f = get_sized_internalformat(required_formats[i].token);
+ if (!f) {
+ printf("Failed to get sized format for %s\n",
+ piglit_get_gl_enum_name(required_formats[i].token));
+ pass = false;
+ continue;
+ }
if (f->token == GL_DEPTH24_STENCIL8 ||
f->token == GL_DEPTH32F_STENCIL8) {
@@ -184,10 +192,14 @@ piglit_init(int argc, char **argv)
f->bits[c] == UCMP) {
if (sizes[c] <= 0 || sizes[c] > 8)
format_pass = false;
- } else {
+ } else if (target_version == 30) {
if (sizes[c] != get_channel_size(f, c)) {
format_pass = false;
}
+ } else {
+ if (sizes[c] < get_channel_size(f, c)) {
+ format_pass = false;
+ }
}
if (types[c] != get_channel_type(f, c))
@@ -221,3 +233,20 @@ piglit_init(int argc, char **argv)
piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
}
+
+int
+main(int argc, char *argv[])
+{
+ struct piglit_gl_test_config config;
+
+ setup_required_size_test(argc, argv, &config);
+ target_version = MAX2(config.supports_gl_compat_version,
+ config.supports_gl_core_version);
+ config.init = piglit_init;
+ config.display = piglit_display;
+
+ piglit_gl_test_run(argc, argv, &config);
+
+ /* UNREACHED */
+ return 0;
+}
diff --git a/tests/util/sized-internalformats.c b/tests/util/sized-internalformats.c
index 406aee4..1017832 100644
--- a/tests/util/sized-internalformats.c
+++ b/tests/util/sized-internalformats.c
@@ -41,6 +41,7 @@ static const struct {
{ 24, GL_UNSIGNED_NORMALIZED },
{ 16, GL_UNSIGNED_NORMALIZED },
+ { 16, GL_SIGNED_NORMALIZED },
{ 16, GL_FLOAT },
{ 16, GL_INT },
{ 16, GL_UNSIGNED_INT },
@@ -130,6 +131,19 @@ const struct sized_internalformat sized_internalformats[] = {
FORMAT(GL_RGBA32I, I32, I32, I32, I32, NONE, NONE, NONE, NONE),
FORMAT(GL_RGBA32UI, U32, U32, U32, U32, NONE, NONE, NONE, NONE),
+ /* SNORM formats introduced as required sized texture formats
+ * in GL 3.1, but didn't get sizes actually specified until GL
+ * 3.2's table 3.12.
+ */
+ FORMAT(GL_R8_SNORM, SN8, NONE, NONE, NONE, NONE, NONE, NONE, NONE),
+ FORMAT(GL_R16_SNORM, SN16, NONE, NONE, NONE, NONE, NONE, NONE, NONE),
+ FORMAT(GL_RG8_SNORM, SN8, SN8, NONE, NONE, NONE, NONE, NONE, NONE),
+ FORMAT(GL_RG16_SNORM, SN16, SN16, NONE, NONE, NONE, NONE, NONE, NONE),
+ FORMAT(GL_RGB8_SNORM, SN8, SN8, SN8, NONE, NONE, NONE, NONE, NONE),
+ FORMAT(GL_RGB16_SNORM, SN16, SN16, SN16, NONE, NONE, NONE, NONE, NONE),
+ FORMAT(GL_RGBA8_SNORM, SN8, SN8, SN8, SN8, NONE, NONE, NONE, NONE),
+ FORMAT(GL_RGBA16_SNORM, SN16, SN16, SN16, SN16, NONE, NONE, NONE, NONE),
+
/* Sized internal luminance formats, table 3.17 of the GL 3.0
* specification.
*/
@@ -225,6 +239,7 @@ const struct required_format required_formats[] = {
/* Required color formats (texture-only): */
{ GL_RGBA16_SNORM, 31, false },
+ { GL_RGBA8_SNORM, 31, false },
{ GL_RGB32F, 30, false },
{ GL_RGB32I, 30, false },
{ GL_RGB32UI, 30, false },
@@ -244,11 +259,13 @@ const struct required_format required_formats[] = {
{ GL_RGB9_E5, 30, false },
{ GL_RG16_SNORM, 31, false },
+ { GL_RG8_SNORM, 31, false },
{ GL_COMPRESSED_RG_RGTC2, 30, false },
{ GL_COMPRESSED_SIGNED_RG_RGTC2, 30, false },
{ GL_R16_SNORM, 31, false },
+ { GL_R8_SNORM, 31, false },
{ GL_COMPRESSED_RED_RGTC1, 30, false },
{ GL_COMPRESSED_SIGNED_RED_RGTC1, 30, false },
@@ -313,3 +330,73 @@ print_bits(int size, GLenum type)
else
printf("??");
}
+
+static bool
+string_starts_with(const char *string, const char *start)
+{
+ return !strncmp(string, start, strlen(start));
+}
+
+bool
+valid_for_gl_version(const struct required_format *format, int target_version)
+{
+ if (format->version > target_version)
+ return false;
+
+ /* Since we have a core context for 3.1, don't test
+ * deprecated formats there.
+ */
+ if (piglit_get_gl_version() >= 31 &&
+ !piglit_is_extension_supported("GL_ARB_compatibility")) {
+ const char *name = piglit_get_gl_enum_name(format->token);
+ if (string_starts_with(name, "GL_ALPHA") ||
+ string_starts_with(name, "GL_LUMINANCE_ALPHA") ||
+ string_starts_with(name, "GL_LUMINANCE") ||
+ string_starts_with(name, "GL_INTENSITY")) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static void
+usage(const char *name)
+{
+ fprintf(stderr, "usage: %s <30 | 31>\n", name);
+ piglit_report_result(PIGLIT_FAIL);
+}
+
+/**
+ * Sets up the test config for the 3 required size tests across GL
+ * compat/core versions.
+ */
+void
+setup_required_size_test(int argc, char **argv,
+ struct piglit_gl_test_config *config)
+{
+ int target_version;
+
+ if (argc < 2)
+ usage(argv[0]);
+
+ piglit_gl_test_config_init(config);
+
+ target_version = strtol(argv[1], NULL, 0);
+
+ switch (target_version) {
+ case 30:
+ config->supports_gl_compat_version = 30;
+ break;
+ case 31:
+ config->supports_gl_core_version = target_version;
+ break;
+ default:
+ usage(argv[0]);
+ }
+
+ config->window_width = 32;
+ config->window_height = 32;
+ config->window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
+
+}
diff --git a/tests/util/sized-internalformats.h b/tests/util/sized-internalformats.h
index e01c2f3..5271f14 100644
--- a/tests/util/sized-internalformats.h
+++ b/tests/util/sized-internalformats.h
@@ -36,6 +36,7 @@ enum bits_types {
UN24,
UN16,
+ SN16,
F16,
I16,
U16,
@@ -104,3 +105,16 @@ get_channel_type(const struct sized_internalformat *f, enum channel c);
void
print_bits(int size, GLenum type);
+
+bool
+valid_for_gl_version(const struct required_format *format, int target_version);
+
+void
+piglit_init(int argc, char **argv);
+
+enum piglit_result
+piglit_display(void);
+
+void
+setup_required_size_test(int argc, char **argv,
+ struct piglit_gl_test_config *config);
--
1.8.3.rc0
More information about the Piglit
mailing list