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;
}