[Piglit] [PATCH 2/2] texture_integer: add ARB_texture_rgb10_a2ui support.

Dave Airlie airlied at gmail.com
Sun Dec 4 12:04:04 PST 2011


From: Dave Airlie <airlied at redhat.com>

This adds support for the GL_RGB10_A2UI format to the integer texture
format test.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 .../ext_texture_integer/texture-integer-glsl130.c  |   54 +++++++++++++++++++-
 1 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/tests/spec/ext_texture_integer/texture-integer-glsl130.c b/tests/spec/ext_texture_integer/texture-integer-glsl130.c
index eaaa525..6d1920f 100644
--- a/tests/spec/ext_texture_integer/texture-integer-glsl130.c
+++ b/tests/spec/ext_texture_integer/texture-integer-glsl130.c
@@ -116,6 +116,13 @@ static const struct format_info rg_formats[] = {
 	{ "GL_R32UI", GL_R32UI, GL_RED_INTEGER, 32, GL_FALSE },
 };
 
+static const struct format_info rgb10_formats[] = {
+	{ "GL_RGB10_A2UI", GL_RGB10_A2UI, GL_RGBA_INTEGER_EXT, 10, GL_FALSE },
+	{ "GL_RGB10_A2UI (bgra)", GL_RGB10_A2UI, GL_BGRA_INTEGER_EXT, 10, GL_FALSE },
+	{ "GL_RGB10_A2UI (rev)", GL_RGB10_A2UI, GL_RGBA_INTEGER_EXT, 10, GL_TRUE },
+	{ "GL_RGB10_A2UI (rev bgra)", GL_RGB10_A2UI, GL_BGRA_INTEGER_EXT, 10, GL_TRUE },
+};
+
 static const char *FragShaderText =
 	"#version 130\n"
 	"uniform vec4 bias; \n"
@@ -141,6 +148,9 @@ get_max_val(const struct format_info *info)
 		else
 			max = 255;
 		break;
+	case 10:
+		max = 1023;
+		break;
 	case 16:
 		if (info->Signed)
 			max = 32767;
@@ -230,6 +240,29 @@ fill_array(int comps, int texels, void *buf, int bpp, const int val[4])
 	}
 }
 
+static void
+fill_array_rgb10(int comps, int texels, void *buf, int type,
+	   const int val[4])
+{
+	int i;
+	GLuint *b = (GLuint *)buf;
+
+	if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
+		for (i = 0; i < texels; i++) {
+			b[i] = (val[0] & 0x3ff) << 0 |
+				(val[1] & 0x3ff) << 10 |
+				(val[2] & 0x3ff) << 20 |
+				(val[3] & 0x3) << 30;
+		}
+	} else if (type == GL_UNSIGNED_INT_10_10_10_2) {
+		for (i = 0; i < texels; i++) {
+			b[i] = (val[3] & 0x3) << 0 |
+			       (val[2] & 0x3ff) << 2 |
+			       (val[1] & 0x3ff) << 12 |
+			       (val[0] & 0x3ff) << 22;
+		}
+	}
+}
 
 static GLenum
 get_datatype(const struct format_info *info)
@@ -237,6 +270,8 @@ get_datatype(const struct format_info *info)
 	switch (info->BitsPerChannel) {
 	case 8:
 		return info->Signed ? GL_BYTE : GL_UNSIGNED_BYTE;
+	case 10:
+		return info->Signed ? GL_UNSIGNED_INT_10_10_10_2 : GL_UNSIGNED_INT_2_10_10_10_REV;
 	case 16:
 		return info->Signed ? GL_SHORT : GL_UNSIGNED_SHORT;
 	case 32:
@@ -286,8 +321,14 @@ test_format(const struct format_info *info)
 	value[3] = rand() % max;
 
 	/* alloc, fill texture image */
-	buf = malloc(comps * texels * info->BitsPerChannel / 8);
-	fill_array(comps, texels, buf, info->BitsPerChannel, value);
+	if (info->BitsPerChannel == 10) {
+		value[3] = rand() % 3;
+		buf = malloc(texels * 4);
+		fill_array_rgb10(comps, texels, buf, type, value);
+	} else {
+		buf = malloc(comps * texels * info->BitsPerChannel / 8);
+		fill_array(comps, texels, buf, info->BitsPerChannel, value);
+	}
 
 	glTexImage2D(GL_TEXTURE_2D, 0, info->IntFormat, TexWidth, TexHeight, 0,
 		     info->BaseFormat, type, buf);
@@ -429,6 +470,15 @@ test_general_formats(void)
 			}
 		}
 	}
+
+	if (piglit_is_extension_supported("GL_ARB_texture_rgb10_a2ui")) {
+		for (f = 0; f < ARRAY_SIZE(rgb10_formats); f++) {
+			for (i = 0; i < 5; i++) {
+				if (!test_format(&rgb10_formats[f]))
+					return GL_FALSE;
+			}
+		}
+	}
 	return GL_TRUE;
 }
 
-- 
1.7.7.3



More information about the Piglit mailing list