diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index caf74960..f91dae78 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -4072,6 +4072,7 @@ static bool d3d12_command_list_update_compute_pipeline(struct d3d12_command_list static bool d3d12_command_list_update_raygen_pipeline(struct d3d12_command_list *list) { const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; + bool stack_size_dirty = false; if (list->current_pipeline != VK_NULL_HANDLE) return true; @@ -4088,12 +4089,20 @@ static bool d3d12_command_list_update_raygen_pipeline(struct d3d12_command_list VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, list->rt_state->pipeline)); list->command_buffer_pipeline = list->rt_state->pipeline; + stack_size_dirty = true; + } + else + { + stack_size_dirty = list->dynamic_state.pipeline_stack_size != list->rt_state->pipeline_stack_size; } - /* Pipeline stack size is part of the PSO, not any command buffer state - * for some reason ... */ - VK_CALL(vkCmdSetRayTracingPipelineStackSizeKHR(list->vk_command_buffer, - list->rt_state->pipeline_stack_size)); + if (stack_size_dirty) + { + /* Pipeline stack size is part of the PSO, not any command buffer state for some reason ... */ + VK_CALL(vkCmdSetRayTracingPipelineStackSizeKHR(list->vk_command_buffer, + list->rt_state->pipeline_stack_size)); + list->dynamic_state.pipeline_stack_size = list->rt_state->pipeline_stack_size; + } return true; } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index ad7a69bc..176c855a 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1590,6 +1590,8 @@ struct vkd3d_dynamic_state VkExtent2D fragment_size; VkFragmentShadingRateCombinerOpKHR combiner_ops[D3D12_RS_SET_SHADING_RATE_COMBINER_COUNT]; } fragment_shading_rate; + + uint32_t pipeline_stack_size; }; /* ID3D12CommandList */