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 <airlied@redhat.com>
This commit is contained in:

committed by
Eduardo Lima Mitev

parent
580816b747
commit
e98a3c799f
@@ -1025,6 +1025,7 @@ _mesa_GetInternalformati64v(GLenum target, GLenum internalformat,
|
|||||||
{
|
{
|
||||||
GLint params32[16];
|
GLint params32[16];
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
GLsizei realSize = MIN2(bufSize, 16);
|
||||||
|
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
GET_CURRENT_CONTEXT(ctx);
|
||||||
|
|
||||||
@@ -1035,8 +1036,18 @@ _mesa_GetInternalformati64v(GLenum target, GLenum internalformat,
|
|||||||
return;
|
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++)
|
_mesa_GetInternalformativ(target, internalformat, pname, realSize, params32);
|
||||||
params[i] = params32[i];
|
|
||||||
|
for (i = 0; i < realSize; i++) {
|
||||||
|
/* We only copy back the values that changed */
|
||||||
|
if (params32[i] < 0)
|
||||||
|
break;
|
||||||
|
params[i] = (GLint64) params32[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user