subgroup_le_mask_var,
subgroup_lt_mask_var,
subgroup_size_var;
+
+ SpvId discard_func;
};
static SpvId
static void
emit_discard(struct ntv_context *ctx, nir_intrinsic_instr *intr)
{
- assert(ctx->block_started);
- spirv_builder_emit_kill(&ctx->builder);
- /* discard is weird in NIR, so let's just create an unreachable block after
- it and hope that the vulkan driver will DCE any instructinos in it. */
- spirv_builder_label(&ctx->builder, spirv_builder_new_id(&ctx->builder));
+ assert(ctx->discard_func);
+ SpvId type_void = spirv_builder_type_void(&ctx->builder);
+ spirv_builder_function_call(&ctx->builder, type_void,
+ ctx->discard_func, NULL, 0);
}
static void
spirv_builder_emit_exec_mode(&ctx.builder, entry_point,
SpvExecutionModeXfb);
}
+
+ if (s->info.stage == MESA_SHADER_FRAGMENT && s->info.fs.uses_discard) {
+ ctx.discard_func = spirv_builder_new_id(&ctx.builder);
+ spirv_builder_emit_name(&ctx.builder, ctx.discard_func, "discard");
+ spirv_builder_function(&ctx.builder, ctx.discard_func, type_void,
+ SpvFunctionControlMaskNone,
+ type_void_func);
+ SpvId label = spirv_builder_new_id(&ctx.builder);
+ spirv_builder_label(&ctx.builder, label);
+ spirv_builder_emit_kill(&ctx.builder);
+ spirv_builder_function_end(&ctx.builder);
+ }
+
spirv_builder_function(&ctx.builder, entry_point, type_void,
SpvFunctionControlMaskNone,
type_void_func);