From: Stefan Dösinger stefan@codeweavers.com
--- libs/vkd3d/device.c | 1 + libs/vkd3d/state.c | 19 +++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 1 + 3 files changed, 21 insertions(+)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 370a2f67f..61adfa1f9 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -104,6 +104,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] = VK_EXTENSION(EXT_DEPTH_CLIP_ENABLE, EXT_depth_clip_enable), VK_EXTENSION(EXT_DESCRIPTOR_INDEXING, EXT_descriptor_indexing), VK_EXTENSION(EXT_MUTABLE_DESCRIPTOR_TYPE, EXT_mutable_descriptor_type), + VK_EXTENSION(EXT_PIPELINE_CREATION_FEEDBACK, EXT_pipeline_creation_feedback), VK_EXTENSION(EXT_ROBUSTNESS_2, EXT_robustness2), VK_EXTENSION(EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION, EXT_shader_demote_to_helper_invocation), VK_EXTENSION(EXT_SHADER_STENCIL_EXPORT, EXT_shader_stencil_export), diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 8b72c6408..b1a625687 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -3912,12 +3912,14 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta VkRenderPass *vk_render_pass) { VkVertexInputBindingDescription bindings[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; + VkPipelineCreationFeedback feedback = {0}, stage_feedback[VKD3D_MAX_SHADER_STAGES]; const struct vkd3d_vk_device_procs *vk_procs = &state->device->vk_procs; struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; VkPipelineVertexInputDivisorStateCreateInfoEXT input_divisor_info; VkPipelineTessellationStateCreateInfo tessellation_info; struct vkd3d_graphics_pipeline_key persistent_key = {0}; struct vkd3d_graphics_pipeline_entry cache_entry = {0}; + VkPipelineCreationFeedbackCreateInfo feedback_info; VkPipelineVertexInputStateCreateInfo input_desc; VkPipelineInputAssemblyStateCreateInfo ia_desc; VkPipelineColorBlendStateCreateInfo blend_desc; @@ -4077,6 +4079,15 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta return VK_NULL_HANDLE; }
+ if (device->vk_info.EXT_pipeline_creation_feedback) + { + pipeline_desc.pNext = &feedback_info; + feedback_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO; + feedback_info.pNext = NULL; + feedback_info.pPipelineCreationFeedback = &feedback; + feedback_info.pipelineStageCreationFeedbackCount = ARRAY_SIZE(stage_feedback); + feedback_info.pPipelineStageCreationFeedbacks = stage_feedback; + } *vk_render_pass = pipeline_desc.renderPass;
if ((vr = VK_CALL(vkCreateGraphicsPipelines(device->vk_device, device->vk_pipeline_cache, @@ -4091,6 +4102,14 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta vkd3d_shader_cache_put(device->persistent_cache, &persistent_key, sizeof(persistent_key), &cache_entry, sizeof(cache_entry));
+ if (feedback.flags & VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT) + { + if (feedback.flags & VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT) + TRACE("Pipeline was found in the Vulkan pipeline cache.\n"); + else + TRACE("Pipeline was not found in the Vulkan pipeline cache.\n"); + } + if (d3d12_pipeline_state_put_pipeline_to_cache(state, &pipeline_key, vk_pipeline, pipeline_desc.renderPass)) return vk_pipeline;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 31f989947..581bc893b 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -248,6 +248,7 @@ struct vkd3d_vulkan_info bool EXT_depth_clip_enable; bool EXT_descriptor_indexing; bool EXT_mutable_descriptor_type; + bool EXT_pipeline_creation_feedback; bool EXT_robustness2; bool EXT_shader_demote_to_helper_invocation; bool EXT_shader_stencil_export;