zink: NV_compute_shader_derivatives
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 26 May 2021 15:25:21 +0000 (11:25 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 19 Jan 2023 18:00:22 +0000 (18:00 +0000)
nothing complicated here

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12120>

src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
src/gallium/drivers/zink/zink_device_info.py
src/gallium/drivers/zink/zink_screen.c

index 53b5eee..342d521 100644 (file)
@@ -4654,6 +4654,14 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_
          spirv_builder_emit_name(&ctx.builder, ctx.local_group_size_var, "gl_LocalGroupSize");
          spirv_builder_emit_builtin(&ctx.builder, ctx.local_group_size_var, SpvBuiltInWorkgroupSize);
       }
+      if (s->info.cs.derivative_group) {
+         SpvCapability caps[] = { 0, SpvCapabilityComputeDerivativeGroupQuadsNV, SpvCapabilityComputeDerivativeGroupLinearNV };
+         SpvExecutionMode modes[] = { 0, SpvExecutionModeDerivativeGroupQuadsNV, SpvExecutionModeDerivativeGroupLinearNV };
+         spirv_builder_emit_extension(&ctx.builder, "SPV_NV_compute_shader_derivatives");
+         spirv_builder_emit_cap(&ctx.builder, caps[s->info.cs.derivative_group]);
+         spirv_builder_emit_exec_mode(&ctx.builder, entry_point, modes[s->info.cs.derivative_group]);
+         ctx.explicit_lod = false;
+      }
       break;
    default:
       break;
index 7fd3fdc..ea9287d 100644 (file)
@@ -224,6 +224,10 @@ EXTENSIONS = [
               alias="portability_subset",
               features=True,
               guard=True),
+    Extension("VK_NV_compute_shader_derivatives",
+              alias="shader_derivs",
+              features=True,
+              conditions=["$feats.computeDerivativeGroupQuads", "$feats.computeDerivativeGroupLinear"]),
     Extension("VK_KHR_timeline_semaphore",
               alias="timeline",
               features=True),
index 8e1b01a..ca0be95 100644 (file)
@@ -618,6 +618,9 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_MAX_VERTEX_STREAMS:
       return screen->info.tf_props.maxTransformFeedbackStreams;
 
+   case PIPE_CAP_COMPUTE_SHADER_DERIVATIVES:
+      return screen->info.have_NV_compute_shader_derivatives;
+
    case PIPE_CAP_INT64:
    case PIPE_CAP_INT64_DIVMOD:
    case PIPE_CAP_DOUBLES: