summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/formatquery.c
diff options
context:
space:
mode:
authorAlejandro PiƱeiro <[email protected]>2015-12-19 12:45:43 +0100
committerEduardo Lima Mitev <[email protected]>2016-03-03 15:14:06 +0100
commite98a3c799f5db65966f87c5d59552ae22a001084 (patch)
tree5bf81edfea3eb6e5a8cbe6aec0066192dc69e675 /src/mesa/main/formatquery.c
parent580816b74723af481dd85c845caca8aa41274ed5 (diff)
mesa/formatquery: handle unmodified buffer for SAMPLES on the 64-bit query
From arb_internalformat_query2 spec: " If <internalformat> is not color-renderable, depth-renderable, or stencil-renderable (as defined in section 4.4.4), or if <target> does not support multiple samples (ie other than TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY, or RENDERBUFFER), <params> is not modified." So there are cases where the buffer should not be modified. As the 64-bit query is a wrapper over the 32-bit query, we can't just copy the values to the equivalent 32-bit buffer, as that would fail if the original params contained values greater that INT_MAX. So we need to copy-back only the values that got modified by the 32-bit query. We do that by filling the temporal buffer by negatives, as the 32-bit query should not return negative values ever. Reviewed-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/mesa/main/formatquery.c')
-rw-r--r--src/mesa/main/formatquery.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
index 14afe6fcf02..14c69f629df 100644
--- a/src/mesa/main/formatquery.c
+++ b/src/mesa/main/formatquery.c
@@ -1025,6 +1025,7 @@ _mesa_GetInternalformati64v(GLenum target, GLenum internalformat,
{
GLint params32[16];
unsigned i;
+ GLsizei realSize = MIN2(bufSize, 16);
GET_CURRENT_CONTEXT(ctx);
@@ -1035,8 +1036,18 @@ _mesa_GetInternalformati64v(GLenum target, GLenum internalformat,
return;
}
- _mesa_GetInternalformativ(target, internalformat, pname, bufSize, params32);
+ /* For SAMPLES there are cases where params needs to remain unmodified. As
+ * no pname can return a negative value, we fill params32 with negative
+ * values as reference values, that can be used to know what copy-back to
+ * params */
+ memset(params32, -1, 16);
- for (i = 0; i < bufSize; i++)
- params[i] = params32[i];
+ _mesa_GetInternalformativ(target, internalformat, pname, realSize, params32);
+
+ for (i = 0; i < realSize; i++) {
+ /* We only copy back the values that changed */
+ if (params32[i] < 0)
+ break;
+ params[i] = (GLint64) params32[i];
+ }
}