Module: Mesa
Branch: main
Commit: 7f0e213a577ca916f32f27ace3fcc3346a8eec77
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=7f0e213a577ca916f32f27ace3fcc3346a8eec77

Author: Mike Blumenkrantz <[email protected]>
Date:   Wed May 26 11:25:21 2021 -0400

zink: NV_compute_shader_derivatives

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 | 8 ++++++++
 src/gallium/drivers/zink/zink_device_info.py         | 4 ++++
 src/gallium/drivers/zink/zink_screen.c               | 3 +++
 3 files changed, 15 insertions(+)

diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c 
b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 53b5eee1838..342d52182ef 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -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;
diff --git a/src/gallium/drivers/zink/zink_device_info.py 
b/src/gallium/drivers/zink/zink_device_info.py
index 7fd3fdcb86b..ea9287d579c 100644
--- a/src/gallium/drivers/zink/zink_device_info.py
+++ b/src/gallium/drivers/zink/zink_device_info.py
@@ -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),
diff --git a/src/gallium/drivers/zink/zink_screen.c 
b/src/gallium/drivers/zink/zink_screen.c
index 8e1b01abf28..ca0be9510cd 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -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:

Reply via email to