[Piglit] [PATCH] textureGather: add textureGatherOffsets to execution test (v2)

Dave Airlie airlied at gmail.com
Sun Feb 9 18:31:30 PST 2014


From: Dave Airlie <airlied at redhat.com>

Test for checking textureGatherOffsets from ARB_gpu_shader5 works, this
is tested on the nvidia binary driver and passes.

also add to all.py.

Cc: Chris Forbes <chrisf at ijw.co.nz>
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 tests/all.py                            |  8 ++--
 tests/texturing/shaders/textureGather.c | 73 ++++++++++++++++++++++++---------
 2 files changed, 58 insertions(+), 23 deletions(-)

diff --git a/tests/all.py b/tests/all.py
index 68186d1..ba34543 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -1694,7 +1694,7 @@ for stage in ['vs', 'fs']:
         for comps in ['r', 'rg', 'rgb', 'rgba']:
             for cs in [0, 1, 2, 3][:len(comps)]:
                 for sampler in ['2D', '2DArray', 'Cube', 'CubeArray', '2DRect']:
-                    for func in ['textureGather'] if 'Cube' in sampler else ['textureGather', 'textureGatherOffset']:
+                    for func in ['textureGather'] if 'Cube' in sampler else ['textureGather', 'textureGatherOffset', 'textureGatherOffsets' ]:
                         testname = '%s/%s-%s-%s-%s-%s' % (
                                 func, stage, comps,
                                 cs,
@@ -1702,7 +1702,7 @@ for stage in ['vs', 'fs']:
                         address_mode = 'clamp' if sampler == '2DRect' else 'repeat'
                         cmd = 'textureGather %s %s %s %s %s %s %s' % (
                                 stage,
-                                'nonconst' if func == 'textureGatherOffset' else '',
+                                'offsets' if func == 'textureGatherOffsets' else 'nonconst' if func == 'textureGatherOffset' else '',
                                 comps, cs, type, sampler, address_mode
                                 )
                         arb_gpu_shader5[testname] = concurrent_test(cmd)
@@ -1721,12 +1721,12 @@ for stage in ['vs', 'fs']:
                             arb_gpu_shader5[testname] = concurrent_test(cmd)
     # test shadow samplers
     for sampler in ['2D', '2DArray', 'Cube', 'CubeArray', '2DRect']:
-        for func in ['textureGather'] if 'Cube' in sampler else ['textureGather', 'textureGatherOffset']:
+        for func in ['textureGather'] if 'Cube' in sampler else ['textureGather', 'textureGatherOffset', 'textureGatherOffsets' ]:
             testname = '%s/%s-r-none-shadow-%s' % (func, stage, sampler)
             address_mode = 'clamp' if sampler == '2DRect' else 'repeat'
             cmd = 'textureGather %s shadow r %s %s %s' % (
                     stage,
-                    'nonconst' if func == 'textureGatherOffset' else '',
+                    'offsets' if func == 'textureGatherOffsets' else 'nonconst' if func == 'textureGatherOffset' else '',
                     sampler,
                     address_mode)
             arb_gpu_shader5[testname] = concurrent_test(cmd)
diff --git a/tests/texturing/shaders/textureGather.c b/tests/texturing/shaders/textureGather.c
index df8781a..244dbf8 100644
--- a/tests/texturing/shaders/textureGather.c
+++ b/tests/texturing/shaders/textureGather.c
@@ -18,6 +18,7 @@ enum { UNORM_T, FLOAT_T, INT_T, UINT_T, SHADOW_T, NUM_COMPTYPES } comptype = UNO
 enum { SAMPLER_2D, SAMPLER_2DARRAY, SAMPLER_CUBE, SAMPLER_CUBEARRAY, SAMPLER_2DRECT } sampler = SAMPLER_2D;
 bool use_offset = false;
 bool use_nonconst = false;
+bool use_offsets = false;
 int components = 0;
 int comp_select = -1;
 
@@ -84,7 +85,7 @@ piglit_display(void)
  */
 
 static unsigned char
-pixel_value(int i, int j)
+pixel_value(int i, int j, int offset_sel)
 {
 	if (swizzle == ZERO)
 		return 0;
@@ -95,6 +96,25 @@ pixel_value(int i, int j)
 		/* apply texel offset */
 		i += -8;
 		j += 7;
+	} else if (use_offsets) {
+		switch (offset_sel) {
+		case 0:
+			i += -8;
+			j += 7;
+			break;
+		case 1:
+			i += 7;
+			j += -8;
+			break;
+		case 2:
+			i += 3;
+			j += 3;
+			break;
+		case 3:
+			i += -3;
+			j += -3;
+			break;
+		}
 	}
 
 	if (address_mode == GL_REPEAT) {
@@ -146,16 +166,30 @@ make_expected(void)
 	for (j = 0; j < TEXTURE_HEIGHT; j++)
 		for (i = 0; i < TEXTURE_WIDTH; i++) {
 			if (comptype == SHADOW_T) {
-				*pe++ = shadow_compare(norm_value(pixel_value(i, j + 1)));
-				*pe++ = shadow_compare(norm_value(pixel_value(i + 1, j + 1)));
-				*pe++ = shadow_compare(norm_value(pixel_value(i + 1, j)));
-				*pe++ = shadow_compare(norm_value(pixel_value(i, j)));
+				if (use_offsets) {
+					*pe++ = shadow_compare(norm_value(pixel_value(i, j, 0)));
+					*pe++ = shadow_compare(norm_value(pixel_value(i, j, 1)));
+					*pe++ = shadow_compare(norm_value(pixel_value(i, j, 2)));
+					*pe++ = shadow_compare(norm_value(pixel_value(i, j, 3)));
+				} else {
+					*pe++ = shadow_compare(norm_value(pixel_value(i, j + 1, 0)));
+					*pe++ = shadow_compare(norm_value(pixel_value(i + 1, j + 1, 0)));
+					*pe++ = shadow_compare(norm_value(pixel_value(i + 1, j, 0)));
+					*pe++ = shadow_compare(norm_value(pixel_value(i, j, 0)));
+				}
 			}
 			else {
-				*pe++ = norm_value(pixel_value(i, j + 1));
-				*pe++ = norm_value(pixel_value(i + 1, j + 1));
-				*pe++ = norm_value(pixel_value(i + 1, j));
-				*pe++ = norm_value(pixel_value(i, j));
+				if (use_offsets) {
+					*pe++ = norm_value(pixel_value(i, j, 0));
+					*pe++ = norm_value(pixel_value(i, j, 1));
+					*pe++ = norm_value(pixel_value(i, j, 2));
+					*pe++ = norm_value(pixel_value(i, j, 3));
+				} else {
+					*pe++ = norm_value(pixel_value(i, j + 1, 0));
+					*pe++ = norm_value(pixel_value(i + 1, j + 1, 0));
+					*pe++ = norm_value(pixel_value(i + 1, j, 0));
+					*pe++ = norm_value(pixel_value(i, j, 0));
+				}
 			}
 		}
 }
@@ -212,7 +246,7 @@ do_requires(void)
 	if (sampler == SAMPLER_CUBEARRAY)
 		piglit_require_extension("GL_ARB_texture_cube_map_array");
 
-	if (use_offset && (sampler == SAMPLER_CUBE || sampler == SAMPLER_CUBEARRAY)) {
+	if ((use_offsets || use_offset) && (sampler == SAMPLER_CUBE || sampler == SAMPLER_CUBEARRAY)) {
 		printf("Offset is not supported with cube or cube array samplers.\n");
 		piglit_report_result(PIGLIT_SKIP);
 	}
@@ -231,7 +265,7 @@ do_requires(void)
 	 * or use non-constant offsets, or use shadow comparitor, or
 	 * use gsampler2DRect, check that we have ARB_gpu_shader5
 	 */
-	if (comp_select != -1 || use_nonconst || comptype == SHADOW_T || sampler == SAMPLER_2DRECT)
+	if (comp_select != -1 || use_offsets || use_nonconst || comptype == SHADOW_T || sampler == SAMPLER_2DRECT)
 		piglit_require_extension("GL_ARB_gpu_shader5");
 
 	/* if rect sampler, repeat is not available */
@@ -364,7 +398,7 @@ do_shader_setup(void)
 		"gl_FragCoord.xy",		/* 2drect */
 	};
 	char *comp_expr[] = {"", ", 0", ", 1", ", 2", ", 3"};
-	bool need_shader5 = (comp_select != -1) || use_nonconst || (comptype == SHADOW_T) || sampler == SAMPLER_2DRECT;
+	bool need_shader5 = (comp_select != -1) || use_offsets || use_nonconst || (comptype == SHADOW_T) || sampler == SAMPLER_2DRECT;
 
 	if (stage == VS) {
 		asprintf(&vs_code, "#version %s\n"
@@ -388,12 +422,12 @@ do_shader_setup(void)
 				prefix[comptype],
 				samplersuffix[sampler],
 				comptype == SHADOW_T ? "Shadow" : "",
-				use_nonconst ? "uniform ivec2 o1,o2;\n" : "",
+			 use_offsets ? "const ivec2 osets[4] = ivec2[4](ivec2(-8,7), ivec2(-8, 7), ivec2(-8, 7), ivec2(-8, 7));\n" :use_nonconst ? "uniform ivec2 o1,o2;\n" : "",
 				swizzle == ONE ? scale[0] : scale[comptype],
-				use_offset ? "Offset" : "",
+				use_offsets ? "Offsets" : (use_offset ? "Offset" : ""),
 				vs_tc_expr[sampler],
 				comptype == SHADOW_T ? ", 0.5" : "",
-				use_nonconst ? ", o1+o2" : use_offset ? ", ivec2(-8,7)" :  "",
+			 use_offsets ? ", osets" : use_nonconst ? ", o1+o2" : use_offset ? ", ivec2(-8,7)" :  "",
 				comp_expr[1 + comp_select]);
 		asprintf(&fs_code,
 				"#version %s\n"
@@ -433,12 +467,12 @@ do_shader_setup(void)
 				prefix[comptype],
 				samplersuffix[sampler],
 				comptype == SHADOW_T ? "Shadow" : "",
-				use_nonconst ? "uniform ivec2 o1,o2;\n" : "",
+			 use_offsets ? "const ivec2 osets[4] = ivec2[4](ivec2(-8,7), ivec2(7, -8), ivec2(3, 3), ivec2(-3, -3));\n" :use_nonconst ? "uniform ivec2 o1,o2;\n" : "",
 				swizzle == ONE ? scale[0] : scale[comptype],
-				use_offset ? "Offset" : "",
+				use_offsets ? "Offsets" : (use_offset ? "Offset" : ""),
 				fs_tc_expr[sampler],
 				comptype == SHADOW_T ? ", 0.5" : "",
-				use_nonconst ? ", o1+o2" : use_offset ? ", ivec2(-8,7)" :  "",
+			 use_offsets ? ", osets" : use_nonconst ? ", o1+o2" : use_offset ? ", ivec2(-8,7)" :  "",
 				comp_expr[1 + comp_select]);
 	}
 
@@ -476,7 +510,7 @@ do_geometry_setup(void)
 void
 fail_with_usage(void)
 {
-	printf("Usage: textureGather <stage> [offset] [nonconst] <components> <swizzle> <comptype> <sampler> <compselect> <addressmode>\n"
+	printf("Usage: textureGather <stage> [offset] [nonconst] [offsets] <components> <swizzle> <comptype> <sampler> <compselect> <addressmode>\n"
 	       "	stage = vs|fs\n"
 	       "	components = r|rg|rgb|rgba\n"
 	       "	swizzle = red|green|blue|alpha|zero|one\n"
@@ -497,6 +531,7 @@ piglit_init(int argc, char **argv)
 		else if (!strcmp(opt, "fs")) stage = FS;
 		else if (!strcmp(opt, "offset")) use_offset = true;
 		else if (!strcmp(opt, "nonconst")) use_nonconst = true;
+		else if (!strcmp(opt, "offsets")) use_offsets = true;
 		else if (!strcmp(opt, "r")) components = 1;
 		else if (!strcmp(opt, "rg")) components = 2;
 		else if (!strcmp(opt, "rgb")) components = 3;
-- 
1.8.5.3



More information about the Piglit mailing list