Mesa (main): mesa: clamp UINT values greater than INT_MAX for glGetInteger

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 7 05:19:49 UTC 2022


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Jun  5 18:30:13 2022 -0400

mesa: clamp UINT values greater than INT_MAX for glGetInteger

so that values greater than INT_MAX report INT_MAX with glGetInteger and
the full value with glGetInteger64. This allows exposing compute grid sizes
and max buffer sizes greater than INT_MAX.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16881>

---

 src/mesa/main/get.c | 47 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 1efab608967..1f44de2350f 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -2042,24 +2042,33 @@ _mesa_GetIntegerv(GLenum pname, GLint *params)
       break;
 
    case TYPE_INT_4:
-   case TYPE_UINT_4:
       params[3] = ((GLint *) p)[3];
       FALLTHROUGH;
    case TYPE_INT_3:
-   case TYPE_UINT_3:
       params[2] = ((GLint *) p)[2];
       FALLTHROUGH;
    case TYPE_INT_2:
-   case TYPE_UINT_2:
    case TYPE_ENUM_2:
       params[1] = ((GLint *) p)[1];
       FALLTHROUGH;
    case TYPE_INT:
-   case TYPE_UINT:
    case TYPE_ENUM:
       params[0] = ((GLint *) p)[0];
       break;
 
+   case TYPE_UINT_4:
+      params[3] = MIN2(((GLuint *) p)[3], INT_MAX);
+      FALLTHROUGH;
+   case TYPE_UINT_3:
+      params[2] = MIN2(((GLuint *) p)[2], INT_MAX);
+      FALLTHROUGH;
+   case TYPE_UINT_2:
+      params[1] = MIN2(((GLuint *) p)[1], INT_MAX);
+      FALLTHROUGH;
+   case TYPE_UINT:
+      params[0] = MIN2(((GLuint *) p)[0], INT_MAX);
+      break;
+
    case TYPE_ENUM16:
       params[0] = ((GLenum16 *) p)[0];
       break;
@@ -3032,16 +3041,23 @@ _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
       break;
 
    case TYPE_INT:
-   case TYPE_UINT:
       params[0] = v.value_int;
       break;
+   case TYPE_UINT:
+      params[0] = MIN2(v.value_uint, INT_MAX);
+      break;
    case TYPE_INT_4:
-   case TYPE_UINT_4:
       params[0] = v.value_int_4[0];
       params[1] = v.value_int_4[1];
       params[2] = v.value_int_4[2];
       params[3] = v.value_int_4[3];
       break;
+   case TYPE_UINT_4:
+      params[0] = MIN2((GLuint)v.value_int_4[0], INT_MAX);
+      params[1] = MIN2((GLuint)v.value_int_4[1], INT_MAX);
+      params[2] = MIN2((GLuint)v.value_int_4[2], INT_MAX);
+      params[3] = MIN2((GLuint)v.value_int_4[3], INT_MAX);
+      break;
    case TYPE_INT64:
       params[0] = INT64_TO_INT(v.value_int64);
       break;
@@ -3068,7 +3084,7 @@ _mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params )
       params[3] = v.value_int_4[3];
       break;
    case TYPE_UINT:
-      params[0] = (GLuint) v.value_int;
+      params[0] = v.value_uint;
       break;
    case TYPE_UINT_4:
       params[0] = (GLuint) v.value_int_4[0];
@@ -3385,24 +3401,33 @@ _mesa_GetFixedv(GLenum pname, GLfixed *params)
       break;
 
    case TYPE_INT_4:
-   case TYPE_UINT_4:
       params[3] = INT_TO_FIXED(((GLint *) p)[3]);
       FALLTHROUGH;
    case TYPE_INT_3:
-   case TYPE_UINT_3:
       params[2] = INT_TO_FIXED(((GLint *) p)[2]);
       FALLTHROUGH;
    case TYPE_INT_2:
-   case TYPE_UINT_2:
    case TYPE_ENUM_2:
       params[1] = INT_TO_FIXED(((GLint *) p)[1]);
       FALLTHROUGH;
    case TYPE_INT:
-   case TYPE_UINT:
    case TYPE_ENUM:
       params[0] = INT_TO_FIXED(((GLint *) p)[0]);
       break;
 
+   case TYPE_UINT_4:
+      params[3] = INT_TO_FIXED(((GLuint *) p)[3]);
+      FALLTHROUGH;
+   case TYPE_UINT_3:
+      params[2] = INT_TO_FIXED(((GLuint *) p)[2]);
+      FALLTHROUGH;
+   case TYPE_UINT_2:
+      params[1] = INT_TO_FIXED(((GLuint *) p)[1]);
+      FALLTHROUGH;
+   case TYPE_UINT:
+      params[0] = INT_TO_FIXED(((GLuint *) p)[0]);
+      break;
+
    case TYPE_ENUM16:
       params[0] = INT_TO_FIXED((GLint)(((GLenum16 *) p)[0]));
       break;



More information about the mesa-commit mailing list