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];
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user