From a39881b7881712e3857d70e5f06369dc3eedb06f Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 3 Jan 2022 16:15:12 -0800 Subject: [PATCH] microsoft/compiler: Handle load_per_vertex_output as LoadOutputControlPoint Reviewed-by: Boris Brezillon Reviewed-by: Bill Kristiansen Part-of: --- src/microsoft/compiler/dxil_function.c | 1 + src/microsoft/compiler/nir_to_dxil.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/microsoft/compiler/dxil_function.c b/src/microsoft/compiler/dxil_function.c index 35c812bdd26..d25be90970a 100644 --- a/src/microsoft/compiler/dxil_function.c +++ b/src/microsoft/compiler/dxil_function.c @@ -86,6 +86,7 @@ static struct predefined_func_descr predefined_funcs[] = { {"dx.op.coverage", "i", "i", DXIL_ATTR_KIND_READ_NONE}, {"dx.op.storePatchConstant", "v", "iiicO", DXIL_ATTR_KIND_NO_UNWIND}, {"dx.op.loadPatchConstant", "O", "iiic", DXIL_ATTR_KIND_READ_NONE}, +{"dx.op.loadOutputControlPoint", "O", "iiici", DXIL_ATTR_KIND_READ_NONE}, }; struct func_descr { diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index 1f166b046bd..d725a721095 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -288,6 +288,7 @@ enum dxil_intr { DXIL_INTR_MAKE_DOUBLE = 101, DXIL_INTR_SPLIT_DOUBLE = 102, + DXIL_INTR_LOAD_OUTPUT_CONTROL_POINT = 103, DXIL_INTR_LOAD_PATCH_CONSTANT = 104, DXIL_INTR_STORE_PATCH_CONSTANT = 106, DXIL_INTR_OUTPUT_CONTROL_POINT_ID = 107, @@ -3064,6 +3065,7 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr bool is_patch_constant = ctx->mod.shader_kind == DXIL_DOMAIN_SHADER && intr->intrinsic == nir_intrinsic_load_input; + bool is_output_control_point = intr->intrinsic == nir_intrinsic_load_per_vertex_output; unsigned opcode_val; const char *func_name; @@ -3073,6 +3075,9 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr } else if (is_patch_constant) { opcode_val = DXIL_INTR_LOAD_PATCH_CONSTANT; func_name = "dx.op.loadPatchConstant"; + } else if (is_output_control_point) { + opcode_val = DXIL_INTR_LOAD_OUTPUT_CONTROL_POINT; + func_name = "dx.op.loadOutputControlPoint"; } else { opcode_val = DXIL_INTR_LOAD_INPUT; func_name = "dx.op.loadInput"; @@ -3086,10 +3091,13 @@ emit_load_input_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr if (!input_id) return false; - int row_index = intr->intrinsic == nir_intrinsic_load_per_vertex_input ? 1 : 0; + bool is_per_vertex = + intr->intrinsic == nir_intrinsic_load_per_vertex_input || + intr->intrinsic == nir_intrinsic_load_per_vertex_output; + int row_index = is_per_vertex ? 1 : 0; const struct dxil_value *vertex_id = NULL; if (!is_patch_constant) { - if (intr->intrinsic == nir_intrinsic_load_per_vertex_input) { + if (is_per_vertex) { vertex_id = get_src(ctx, &intr->src[0], 0, nir_type_int); } else if (attr_at_vertex) { vertex_id = dxil_module_get_int8_const(&ctx->mod, ctx->opts->provoking_vertex); @@ -4085,6 +4093,7 @@ emit_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *intr) return emit_get_ssbo_size(ctx, intr); case nir_intrinsic_load_input: case nir_intrinsic_load_per_vertex_input: + case nir_intrinsic_load_per_vertex_output: return emit_load_input_via_intrinsic(ctx, intr); case nir_intrinsic_store_output: case nir_intrinsic_store_per_vertex_output: