[Piglit] [PATCH] shader_runner: add support for doubles
Kenneth Graunke
kenneth at whitecape.org
Sun Apr 13 22:48:21 PDT 2014
On 04/09/2014 08:36 PM, Dave Airlie wrote:
> 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"))
Don't you mean 40 here?
> + 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)) {
I wonder if we could combine this with the code that handles
"mat"...it's kind of a shame to duplicate it.
> + 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];
Pretty sure you want 'd' here, not 'f'.
> + } else {
> + matrixdata[matrix_stride * r + c] =
> + f[r * rows + c];
Ditto (d not f).
With those three things fixed, this get a:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> + }
> + }
> + }
> } 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);
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20140413/e7a66d3a/attachment.sig>
More information about the Piglit
mailing list