mesa: add interaction between compute derivatives and variable local sizes
authorIlia Mirkin <imirkin@alum.mit.edu>
Thu, 16 Apr 2020 02:27:11 +0000 (22:27 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 17 Apr 2020 13:51:11 +0000 (13:51 +0000)
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>

src/mesa/main/compute.c

index 013d6a6..8e446af 100644 (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;
 }