mesa: add interaction between compute derivatives and variable local sizes

This is an added interaction in NV_compute_shader_derivatives added in
Sep 2019.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4583>
This commit is contained in:
Ilia Mirkin
2020-04-15 22:27:11 -04:00
committed by Marge Bot
parent 8c949b2aa6
commit ac0b8d58b9

View File

@@ -178,6 +178,37 @@ validate_DispatchComputeGroupSizeARB(struct gl_context *ctx,
return GL_FALSE;
}
/* The NV_compute_shader_derivatives spec says:
*
* "An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if
* the active program for the compute shader stage has a compute shader
* using the "derivative_group_quadsNV" layout qualifier and
* <group_size_x> or <group_size_y> is not a multiple of two.
*
* An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if
* the active program for the compute shader stage has a compute shader
* using the "derivative_group_linearNV" layout qualifier and the product
* of <group_size_x>, <group_size_y>, and <group_size_z> is not a multiple
* of four."
*/
if (prog->info.cs.derivative_group == DERIVATIVE_GROUP_QUADS &&
((group_size[0] & 1) || (group_size[1] & 1))) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glDispatchComputeGroupSizeARB(derivative_group_quadsNV "
"requires group_size_x (%d) and group_size_y (%d) to be "
"divisble by 2)", group_size[0], group_size[1]);
return GL_FALSE;
}
if (prog->info.cs.derivative_group == DERIVATIVE_GROUP_LINEAR &&
total_invocations & 3) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glDispatchComputeGroupSizeARB(derivative_group_linearNV "
"requires product of group sizes (%"PRIu64") to be divisible "
"by 4)", total_invocations);
return GL_FALSE;
}
return GL_TRUE;
}