summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2020-04-15 22:27:11 -0400
committerMarge Bot <[email protected]>2020-04-17 13:51:11 +0000
commitac0b8d58b963efbeadb4461b39f7d910996c2db7 (patch)
treede0467ea47d71cd6593e45a4b039066144a3753e /src/mesa
parent8c949b2aa6e0c27e92a05a57eda11672c2bdb157 (diff)
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 <[email protected]> Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4583>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/main/compute.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/main/compute.c b/src/mesa/main/compute.c
index 013d6a68567..8e446afa9ee 100644
--- a/src/mesa/main/compute.c
+++ b/src/mesa/main/compute.c
@@ -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;
}