microsoft/compiler: Handle load_per_vertex_output as LoadOutputControlPoint
authorJesse Natalie <jenatali@microsoft.com>
Tue, 4 Jan 2022 00:15:12 +0000 (16:15 -0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 26 Jan 2022 01:31:35 +0000 (01:31 +0000)
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14399>

src/microsoft/compiler/dxil_function.c
src/microsoft/compiler/nir_to_dxil.c

index 35c812b..d25be90 100644 (file)
@@ -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 {
index 1f166b0..d725a72 100644 (file)
@@ -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: