[Mesa-dev] [PATCH] mesa/uniforms: fix get_uniform for doubles

Dave Airlie airlied at gmail.com
Wed Sep 30 00:48:38 PDT 2015


The initial glGetUniformdv support didn't cover all the
casting cases that are apparantly legal, and cts seems to
test for them.

I've updated the piglit test to cover these cases now.

cc: "11.0" <mesa-stable at lists.freedesktop.org>
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/mesa/main/uniform_query.cpp | 39 +++++++++++++++++++++++++++++----------
 1 file changed, 29 insertions(+), 10 deletions(-)

diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 0bee594..4b23fe2 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -319,19 +319,12 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
 
       return;
    }
-   if ((uni->type->base_type == GLSL_TYPE_DOUBLE &&
-        returnType != GLSL_TYPE_DOUBLE) ||
-       (uni->type->base_type != GLSL_TYPE_DOUBLE &&
-        returnType == GLSL_TYPE_DOUBLE)) {
-	 _mesa_error( ctx, GL_INVALID_OPERATION,
-	             "glGetnUniform*vARB(incompatible uniform types)");
-	return;
-   }
 
    {
       unsigned elements = (uni->type->is_sampler())
 	 ? 1 : uni->type->components();
       const int dmul = uni->type->base_type == GLSL_TYPE_DOUBLE ? 2 : 1;
+      const int rmul = returnType == GLSL_TYPE_DOUBLE ? 2 : 1;
 
       /* Calculate the source base address *BEFORE* modifying elements to
        * account for the size of the user's buffer.
@@ -343,7 +336,7 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
              returnType == GLSL_TYPE_UINT || returnType == GLSL_TYPE_DOUBLE);
 
       /* doubles have a different size than the other 3 types */
-      unsigned bytes = sizeof(src[0]) * elements * dmul;
+      unsigned bytes = sizeof(src[0]) * elements * rmul;
       if (bufSize < 0 || bytes > (unsigned) bufSize) {
 	 _mesa_error( ctx, GL_INVALID_OPERATION,
 	             "glGetnUniform*vARB(out of bounds: bufSize is %d,"
@@ -387,12 +380,35 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
 	       case GLSL_TYPE_BOOL:
 		  dst[i].f = src[i].i ? 1.0f : 0.0f;
 		  break;
+	       case GLSL_TYPE_DOUBLE:
+		  dst[i].f = *(double *)&src[i].f;
+		  break;
 	       default:
 		  assert(!"Should not get here.");
 		  break;
 	       }
 	       break;
-
+            case GLSL_TYPE_DOUBLE:
+               switch (uni->type->base_type) {
+               case GLSL_TYPE_UINT:
+                  *(double *)&dst[i].f = (double) src[i].u;
+                  break;
+               case GLSL_TYPE_INT:
+               case GLSL_TYPE_SAMPLER:
+               case GLSL_TYPE_IMAGE:
+                  *(double *)&dst[i].f = (double) src[i].i;
+                  break;
+               case GLSL_TYPE_BOOL:
+		  *(double *)&dst[i].f = src[i].i ? 1.0f : 0.0f;
+		  break;
+               case GLSL_TYPE_FLOAT:
+                  *(double *)&dst[i].f = (double) src[i].f;
+                  break;
+               default:
+                  assert(!"Should not get here.");
+                  break;
+               }
+               break;
 	    case GLSL_TYPE_INT:
 	    case GLSL_TYPE_UINT:
 	       switch (uni->type->base_type) {
@@ -419,6 +435,9 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
 	       case GLSL_TYPE_BOOL:
 		  dst[i].i = src[i].i ? 1 : 0;
 		  break;
+	       case GLSL_TYPE_DOUBLE:
+		  dst[i].i = *(double *)&src[i].f;
+		  break;
 	       default:
 		  assert(!"Should not get here.");
 		  break;
-- 
2.4.3



More information about the mesa-dev mailing list