[Piglit] [PATCH] fs-texelFetchOffset-2D: don't assume undefined values to be solid black

sroland at vmware.com sroland at vmware.com
Wed Nov 28 15:12:36 PST 2012


From: Roland Scheidegger <sroland at vmware.com>

core GL specifies out-of-bound texel fetches return undefined results,
except in a robust context with ARB_robust_buffer_access_behavior supported
(which is core in 4.3), in which case texel fetch will return 0 (OpenGL 4.3
compatibility profile, page 387, subsection 11.1.3.2 Texel Fetches).
Since the test requires neither robust context nor that extension it cannot
assume any specific result value. In any case even returning zero is not what
the test expected, since it wanted [0,0,0,1] instead.
(With this change softpipe passes the test, as it clamps the coords.)

v2: fix black->undefined, formatting, comments
---
 .../glsl-1.30/execution/fs-texelFetchOffset-2D.c   |   29 ++++++++++++++++----
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/tests/spec/glsl-1.30/execution/fs-texelFetchOffset-2D.c b/tests/spec/glsl-1.30/execution/fs-texelFetchOffset-2D.c
index 19e3654..8bdca7a 100644
--- a/tests/spec/glsl-1.30/execution/fs-texelFetchOffset-2D.c
+++ b/tests/spec/glsl-1.30/execution/fs-texelFetchOffset-2D.c
@@ -76,7 +76,7 @@ piglit_display(void)
 	bool pass = true;
 	float red[4]   = {1.0, 0.0, 0.0, 1.0};
 	float blue[4]  = {0.0, 0.0, 1.0, 1.0};
-	float black[4] = {0.0, 0.0, 0.0, 1.0};
+	float undefined[4] = {0.0, 0.0, 0.0, 0.0};
 
 	glClearColor(0.5, 0.5, 0.5, 1.0);
 	glClear(GL_COLOR_BUFFER_BIT);
@@ -92,12 +92,29 @@ piglit_display(void)
 		for (q = 0; q < 4; q++) {
 			const int tex_x = (q / 2) * ((width / 2));
 			const int tex_y = (q % 2) * ((height / 2));
-			float *c = black;
+			float *c = undefined;
 			const int x = 10+20*q;
 
-			/* fancy stuff - we should see red and blue
-			   due to the offset for 3 levels, 
-			   otherwise we get lots of black border color */
+			/* fancy stuff - we should see some red and blue
+			 * due to the offset for 3 levels, all the rest is
+			 * undefined due to out-of-bounds.
+			 * Only with ARB_robust_buffer_access_behavior
+			 * (and a robust context) the undefined result would
+			 * be guaranteed to be zero instead.
+			 *
+			 * From the GL 3.0 spec, page 105 ("Texel Fetches"):
+			 *
+			 *     "The results of the texel fetch are
+			 *      undefined if any of the following
+			 *      conditions hold:
+			 *
+			 *      ...
+			 *
+			 *      - The texel coordinates refer to a
+			 *        border texel outside of the defined
+			 *        extents of the specified LOD"
+			 */
+
 			if (l < 3) {
 				if (q == 2) c = red;
 				else if (q == 3) c = blue;
@@ -107,7 +124,7 @@ piglit_display(void)
 			piglit_Uniform2i(pos_location, tex_x, tex_y);
 			piglit_draw_rect(x, y, 10, 10);
 
-			if (width > 2) /* below 1 wide no test */
+			if (width > 2 && c != undefined) /* below 1 wide no test */
 				pass &= piglit_probe_rect_rgba(x, y, 10, 10, c);
 		}
 	}
-- 
1.7.9.5



More information about the Piglit mailing list