Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/state.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 123761f2..6b088fff 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -2388,6 +2388,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s struct vkd3d_shader_transform_feedback_info xfb_info; struct vkd3d_shader_spirv_target_info ps_target_info; struct vkd3d_shader_interface_info shader_interface; + struct vkd3d_shader_binding_offset_info offset_info; struct vkd3d_shader_spirv_target_info *target_info; const struct d3d12_root_signature *root_signature; struct vkd3d_shader_signature input_signature; @@ -2397,6 +2398,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s const struct vkd3d_format *format; unsigned int instance_divisor; VkVertexInputRate input_rate; + const void **chain_next; unsigned int i, j; size_t rt_count; uint32_t mask; @@ -2627,6 +2629,16 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s shader_interface.push_constant_buffer_count = root_signature->root_constant_count; shader_interface.combined_samplers = NULL; shader_interface.combined_sampler_count = 0; + chain_next = &shader_interface.next; + + if (root_signature->binding_offsets) + { + shader_interface.next = &offset_info; + offset_info.type = VKD3D_SHADER_STRUCTURE_TYPE_BINDING_OFFSET_INFO; + offset_info.next = NULL; + offset_info.binding_offsets = root_signature->binding_offsets; + chain_next = &offset_info.next; + }
for (i = 0; i < ARRAY_SIZE(shader_stages); ++i) { @@ -2692,11 +2704,11 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s goto fail; }
- shader_interface.next = shader_stages[i].stage == xfb_stage ? &xfb_info : NULL; + *chain_next = shader_stages[i].stage == xfb_stage ? &xfb_info : NULL; if (target_info) { - target_info->next = shader_interface.next; - shader_interface.next = target_info; + target_info->next = *chain_next; + *chain_next = target_info; }
if (FAILED(hr = create_shader_stage(device, &graphics->stages[graphics->stage_count],