SV_params_nodes[8] = dxil_get_metadata_int32(mod, rec->elements[0].reg); // Element packing start row
SV_params_nodes[9] = dxil_get_metadata_int8(mod, (psv->cols_and_start >> 4) & 0x3); // Element packing start column
- const struct dxil_mdnode *SV_metadata[4];
+ const struct dxil_mdnode *SV_metadata[6];
unsigned num_metadata_nodes = 0;
if (rec->elements[0].stream != 0) {
SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int32(mod, DXIL_SIGNATURE_ELEMENT_OUTPUT_STREAM);
SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int8(mod, usage_mask);
}
+ uint8_t dynamic_index_mask = psv->dynamic_mask_and_stream & 0xf;
+ if (dynamic_index_mask) {
+ SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int32(mod, DXIL_SIGNATURE_ELEMENT_DYNAMIC_INDEX_COMPONENT_MASK);
+ SV_metadata[num_metadata_nodes++] = dxil_get_metadata_int8(mod, dynamic_index_mask);
+ }
+
SV_params_nodes[10] = num_metadata_nodes ? dxil_get_metadata_node(mod, SV_metadata, num_metadata_nodes) : NULL;
return dxil_get_metadata_node(mod, SV_params_nodes, ARRAY_SIZE(SV_params_nodes));
}
for (unsigned r = 0; r < sig_rec->num_elements; ++r)
sig_rec->elements[r].never_writes_mask &= ~comp_mask;
+
+ if (!nir_src_is_const(intr->src[row_index])) {
+ struct dxil_psv_signature_element *psv_rec = is_patch_constant ?
+ &ctx->mod.psv_patch_consts[nir_intrinsic_base(intr)] :
+ &ctx->mod.psv_outputs[nir_intrinsic_base(intr)];
+ psv_rec->dynamic_mask_and_stream |= comp_mask;
+ }
}
for (unsigned i = 0; i < intr->num_components && success; ++i) {
comp_mask = 1;
for (unsigned r = 0; r < sig_rec->num_elements; ++r)
sig_rec->elements[r].always_reads_mask |= (comp_mask & sig_rec->elements[r].mask);
+
+ if (!nir_src_is_const(intr->src[row_index])) {
+ struct dxil_psv_signature_element *psv_rec = is_patch_constant ?
+ &ctx->mod.psv_patch_consts[nir_intrinsic_base(intr)] :
+ &ctx->mod.psv_inputs[ctx->mod.input_mappings[nir_intrinsic_base(intr)]];
+ psv_rec->dynamic_mask_and_stream |= comp_mask;
+ }
}
for (unsigned i = 0; i < intr->num_components; ++i) {
comp_mask <<= (var_base_component * comp_size);
for (unsigned r = 0; r < sig_rec->num_elements; ++r)
sig_rec->elements[r].always_reads_mask |= (comp_mask & sig_rec->elements[r].mask);
+
+ if (!nir_src_is_const(intr->src[1])) {
+ struct dxil_psv_signature_element *psv_rec =
+ &ctx->mod.psv_inputs[ctx->mod.input_mappings[nir_intrinsic_base(intr)]];
+ psv_rec->dynamic_mask_and_stream |= comp_mask;
+ }
}
for (unsigned i = 0; i < intr->num_components; ++i) {