microsoft/compiler: Handle load_per_vertex_output as LoadOutputControlPoint

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>
This commit is contained in:
Jesse Natalie 2022-01-03 16:15:12 -08:00 committed by Marge Bot
parent a550c059c7
commit a39881b788
2 changed files with 12 additions and 2 deletions

View 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 {

View 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: