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