[Piglit] [PATCH] shader_runner: add support for doubles
Dave Airlie
airlied at gmail.com
Wed Apr 9 20:36:33 PDT 2014
From: Dave Airlie <airlied at redhat.com>
This adds support for double uniforms to shader_runner, these
can be used to write ARB_gpu_shader_fp64 tests.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
tests/shaders/shader_runner.c | 131 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 131 insertions(+)
diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index dba7944..07e8105 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -1138,6 +1138,15 @@ get_floats(const char *line, float *f, unsigned count)
f[i] = strtod(line, (char **) &line);
}
+void
+get_doubles(const char *line, double *d, unsigned count)
+{
+ unsigned i;
+
+ for (i = 0; i < count; i++)
+ d[i] = strtod(line, (char **) &line);
+}
+
void
get_ints(const char *line, int *ints, unsigned count)
@@ -1172,6 +1181,18 @@ check_unsigned_support(void)
}
/**
+ * Check that the GL implementation supports double uniforms
+ * (e.g. through glUniform1d). If not, terminate the test with a
+ * SKIP.
+ */
+void
+check_double_support(void)
+{
+ if (gl_version.num < 30 && !piglit_is_extension_supported("GL_ARB_gpu_shader_fp64"))
+ piglit_report_result(PIGLIT_SKIP);
+}
+
+/**
* Handles uploads of UBO uniforms by mapping the buffer and storing
* the data. If the uniform is not in a uniform block, returns false.
*/
@@ -1183,6 +1204,7 @@ set_ubo_uniform(const char *name, const char *type, const char *line)
GLint offset;
char *data;
float f[16];
+ double d[16];
int ints[16];
unsigned uints[16];
int name_len = strlen(name);
@@ -1231,6 +1253,9 @@ set_ubo_uniform(const char *name, const char *type, const char *line)
} else if (string_match("uint", type)) {
get_uints(line, uints, 1);
memcpy(data, uints, sizeof(int));
+ } else if (string_match("double", type)) {
+ get_doubles(line, d, 1);
+ memcpy(data, d, sizeof(double));
} else if (string_match("vec", type)) {
int elements = type[3] - '0';
get_floats(line, f, elements);
@@ -1243,6 +1268,10 @@ set_ubo_uniform(const char *name, const char *type, const char *line)
int elements = type[4] - '0';
get_uints(line, uints, elements);
memcpy(data, uints, elements * sizeof(unsigned));
+ } else if (string_match("dvec", type)) {
+ int elements = type[3] - '0';
+ get_doubles(line, d, elements);
+ memcpy(data, d, elements * sizeof(double));
} else if (string_match("mat", type)) {
GLint matrix_stride, row_major;
int cols = type[3] - '0';
@@ -1273,6 +1302,36 @@ set_ubo_uniform(const char *name, const char *type, const char *line)
}
}
}
+ } else if (string_match("dmat", type)) {
+ GLint matrix_stride, row_major;
+ int cols = type[3] - '0';
+ int rows = type[4] == 'x' ? type[5] - '0' : cols;
+ int r, c;
+ double *matrixdata = (double *)data;
+
+ assert(cols >= 2 && cols <= 4);
+ assert(rows >= 2 && rows <= 4);
+
+ get_doubles(line, d, rows * cols);
+
+ glGetActiveUniformsiv(prog, 1, &uniform_index,
+ GL_UNIFORM_MATRIX_STRIDE, &matrix_stride);
+ glGetActiveUniformsiv(prog, 1, &uniform_index,
+ GL_UNIFORM_IS_ROW_MAJOR, &row_major);
+
+ matrix_stride /= sizeof(double);
+
+ for (c = 0; c < cols; c++) {
+ for (r = 0; r < rows; r++) {
+ if (row_major) {
+ matrixdata[matrix_stride * c + r] =
+ f[r * rows + c];
+ } else {
+ matrixdata[matrix_stride * r + c] =
+ f[r * rows + c];
+ }
+ }
+ }
} else {
printf("unknown uniform type \"%s\" for \"%s\"\n", type, name);
piglit_report_result(PIGLIT_FAIL);
@@ -1288,6 +1347,7 @@ set_uniform(const char *line)
{
char name[512];
float f[16];
+ double d[16];
int ints[16];
unsigned uints[16];
GLuint prog;
@@ -1325,6 +1385,11 @@ set_uniform(const char *line)
val = strtoul(line, NULL, 0);
glUniform1ui(loc, val);
return;
+ } else if (string_match("double", type)) {
+ check_double_support();
+ get_doubles(line, d, 1);
+ glUniform1dv(loc, 1, d);
+ return;
} else if (string_match("vec", type)) {
switch (type[3]) {
case '2':
@@ -1371,6 +1436,22 @@ set_uniform(const char *line)
glUniform4uiv(loc, 1, uints);
return;
}
+ } else if (string_match("dvec", type)) {
+ check_double_support();
+ switch (type[4]) {
+ case '2':
+ get_doubles(line, d, 2);
+ glUniform2dv(loc, 1, d);
+ return;
+ case '3':
+ get_doubles(line, d, 3);
+ glUniform3dv(loc, 1, d);
+ return;
+ case '4':
+ get_doubles(line, d, 4);
+ glUniform4dv(loc, 1, d);
+ return;
+ }
} else if (string_match("mat", type) && type[3] != '\0') {
char cols = type[3];
char rows = type[4] == 'x' ? type[5] : cols;
@@ -1421,6 +1502,56 @@ set_uniform(const char *line)
return;
}
}
+ } else if (string_match("dmat", type) && type[3] != '\0') {
+ char cols = type[3];
+ char rows = type[4] == 'x' ? type[5] : cols;
+ switch (cols) {
+ case '2':
+ switch (rows) {
+ case '2':
+ get_doubles(line, d, 4);
+ glUniformMatrix2dv(loc, 1, GL_FALSE, d);
+ return;
+ case '3':
+ get_doubles(line, d, 6);
+ glUniformMatrix2x3dv(loc, 1, GL_FALSE, d);
+ return;
+ case '4':
+ get_doubles(line, d, 8);
+ glUniformMatrix2x4dv(loc, 1, GL_FALSE, d);
+ return;
+ }
+ case '3':
+ switch (rows) {
+ case '2':
+ get_doubles(line, d, 6);
+ glUniformMatrix3x2dv(loc, 1, GL_FALSE, d);
+ return;
+ case '3':
+ get_doubles(line, d, 9);
+ glUniformMatrix3dv(loc, 1, GL_FALSE, d);
+ return;
+ case '4':
+ get_doubles(line, d, 12);
+ glUniformMatrix3x4dv(loc, 1, GL_FALSE, d);
+ return;
+ }
+ case '4':
+ switch (rows) {
+ case '2':
+ get_doubles(line, d, 8);
+ glUniformMatrix4x2dv(loc, 1, GL_FALSE, d);
+ return;
+ case '3':
+ get_doubles(line, d, 12);
+ glUniformMatrix4x3dv(loc, 1, GL_FALSE, d);
+ return;
+ case '4':
+ get_doubles(line, d, 16);
+ glUniformMatrix4dv(loc, 1, GL_FALSE, d);
+ return;
+ }
+ }
}
strcpy_to_space(name, type);
--
1.8.5.3
More information about the Piglit
mailing list