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;
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),
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: