From c1381daab8465730f7792bfeadfe2bcbd5805111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 5 Jun 2022 18:30:13 -0400 Subject: [PATCH] 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 Part-of: --- 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;