Mesa (master): mesa/main: Clamp GetUniformui64v values to be >= 0

Iago Toral Quiroga itoral at kemper.freedesktop.org
Thu Jun 1 07:02:24 UTC 2017


Module: Mesa
Branch: master
Commit: cc972c2845e7c8554918e3aaaab95c1581ff5599
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cc972c2845e7c8554918e3aaaab95c1581ff5599

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Thu May 18 11:43:54 2017 +0200

mesa/main: Clamp GetUniformui64v values to be >= 0

Like we do for the 32-bit case.

v2:
  - need unsigned rounding for float->uint64 conversion (Nicolai)
  - use roundf() instead of IROUND() macros (Iago)

Reviewed-by: Matt Turner <mattst88 at gmail.com>

---

 src/mesa/main/uniform_query.cpp | 46 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 314f7d8a1b..aca54163bf 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -550,7 +550,6 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
                break;
 
             case GLSL_TYPE_INT64:
-            case GLSL_TYPE_UINT64:
                switch (uni->type->base_type) {
                case GLSL_TYPE_UINT: {
                   uint64_t tmp = src[sidx].u;
@@ -569,6 +568,13 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
                   memcpy(&dst[didx].u, &tmp, sizeof(tmp));
                   break;
                }
+               case GLSL_TYPE_UINT64: {
+                  uint64_t u64;
+                  memcpy(&u64, &src[sidx].u, sizeof(u64));
+                  int64_t tmp = MIN2(u64, INT_MAX);
+                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
+                  break;
+               }
                case GLSL_TYPE_FLOAT: {
                   int64_t tmp = src[sidx].f;
                   memcpy(&dst[didx].u, &tmp, sizeof(tmp));
@@ -580,6 +586,44 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
                }
                break;
 
+            case GLSL_TYPE_UINT64:
+               switch (uni->type->base_type) {
+               case GLSL_TYPE_UINT: {
+                  uint64_t tmp = src[sidx].u;
+                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
+                  break;
+               }
+               case GLSL_TYPE_INT:
+               case GLSL_TYPE_SAMPLER:
+               case GLSL_TYPE_IMAGE: {
+                  int64_t tmp = MAX2(src[sidx].i, 0);
+                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
+                  break;
+               }
+               case GLSL_TYPE_BOOL: {
+                  int64_t tmp = src[sidx].i ? 1.0f : 0.0f;
+                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
+                  break;
+               }
+               case GLSL_TYPE_INT64: {
+                  uint64_t i64;
+                  memcpy(&i64, &src[sidx].i, sizeof(i64));
+                  uint64_t tmp = MAX2(i64, 0);
+                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
+                  break;
+               }
+               case GLSL_TYPE_FLOAT: {
+                  uint64_t tmp = src[sidx].f < 0.0f ?
+                     0ull : (uint64_t) roundf(src[sidx].f);
+                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
+                  break;
+               }
+               default:
+                  assert(!"Should not get here.");
+                  break;
+               }
+               break;
+
             default:
                assert(!"Should not get here.");
                break;




More information about the mesa-commit mailing list