[Piglit] [PATCH 2/3] shader_runner: Add 'probe atomic counter' command

Jordan Justen jordan.l.justen at intel.com
Sat Jun 7 11:58:59 PDT 2014


This command allows a test to probe the value of an atomic counter.

For example 'probe atomic counter ( 0 ) == 512' will read the
atomic counter at offset 0, and compare for equality with 512.

'probe atomic counter ( 1 ) > 512' will read the atomic counter
at offset 4, and ensure the value is greater than 512.

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 tests/shaders/shader_runner.c | 56 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 4babd36..8c8d8f6 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -184,6 +184,9 @@ lookup_enum_string(const struct string_to_enum *table, const char **line,
 bool
 compare(float ref, float value, enum comparison cmp);
 
+static bool
+compare_uint(GLuint ref, GLuint value, enum comparison cmp);
+
 static void
 version_init(struct component_version *v, enum version_tag tag, bool es, unsigned num)
 {
@@ -420,6 +423,21 @@ compare(float ref, float value, enum comparison cmp)
 	return false;
 }
 
+static bool
+compare_uint(GLuint ref, GLuint value, enum comparison cmp)
+{
+	switch (cmp) {
+	case equal:         return value == ref;
+	case not_equal:     return value != ref;
+	case less:          return value <  ref;
+	case greater_equal: return value >= ref;
+	case greater:       return value >  ref;
+	case less_equal:    return value <= ref;
+	}
+
+	assert(!"Should not get here.");
+	return false;
+}
 
 /**
  * Get the string representation of a comparison operator
@@ -1985,6 +2003,38 @@ bind_vao_if_supported()
 	}
 }
 
+static bool
+probe_atomic_counter(GLint counter_num, const char *op, uint32_t value)
+{
+        uint32_t *p;
+	enum comparison cmp;
+	bool result;
+
+	process_comparison(op, &cmp);
+
+	glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomics_bo);
+	p = glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, counter_num * sizeof(uint32_t),
+			     sizeof(uint32_t), GL_MAP_READ_BIT);
+
+        if (!p) {
+                printf("Couldn't map atomic counter to verify expected value.\n");
+                return false;
+        }
+
+	result = compare_uint(value, *p, cmp);
+
+	if (!result) {
+		printf("Atomic counter %d test failed: Reference %s Observed\n",
+		       counter_num, comparison_string(cmp));
+		printf("  Reference: %u\n", value);
+		printf("  Observed:  %u\n", *p);
+		glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
+		return false;
+        }
+
+        glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
+        return true;
+}
 
 enum piglit_result
 piglit_display(void)
@@ -2137,6 +2187,12 @@ piglit_display(void)
 				pass = false;
 			}
 		} else if (sscanf(line,
+				  "probe atomic counter ( %d ) %s %d",
+				  &x, s, &y) == 3) {
+			if (!probe_atomic_counter(x, s, y)) {
+				piglit_report_result(PIGLIT_FAIL);
+			}
+		} else if (sscanf(line,
 				  "relative probe rgba ( %f , %f ) "
 				  "( %f , %f , %f , %f )",
 				  c + 0, c + 1,
-- 
2.0.0.rc4



More information about the Piglit mailing list