diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 38c5785cb64..95965bc7c7f 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -144,6 +144,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported = .EXT_host_query_reset = true, .EXT_index_type_uint8 = true, .EXT_multi_draw = true, + .EXT_pipeline_creation_feedback = true, .EXT_post_depth_coverage = true, .EXT_private_data = true, .EXT_primitive_topology_list_restart = true, diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 4a67f6bb8c8..91375d4b11a 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -24,6 +24,7 @@ #include "lvp_private.h" #include "vk_util.h" #include "glsl_types.h" +#include "util/os_time.h" #include "spirv/nir_spirv.h" #include "nir/nir_builder.h" #include "lvp_lower_vulkan_resource.h" @@ -1085,6 +1086,7 @@ lvp_graphics_pipeline_create( vk_object_base_init(&device->vk, &pipeline->base, VK_OBJECT_TYPE_PIPELINE); + uint64_t t0 = os_time_get_nano(); result = lvp_graphics_pipeline_init(pipeline, device, cache, pCreateInfo, pAllocator); if (result != VK_SUCCESS) { @@ -1092,6 +1094,13 @@ lvp_graphics_pipeline_create( return result; } + VkPipelineCreationFeedbackCreateInfo *feedback = (void*)vk_find_struct_const(pCreateInfo->pNext, PIPELINE_CREATION_FEEDBACK_CREATE_INFO); + if (feedback) { + feedback->pPipelineCreationFeedback->duration = os_time_get_nano() - t0; + feedback->pPipelineCreationFeedback->flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT; + memset(feedback->pPipelineStageCreationFeedbacks, 0, sizeof(VkPipelineCreationFeedback) * feedback->pipelineStageCreationFeedbackCount); + } + *pPipeline = lvp_pipeline_to_handle(pipeline); return VK_SUCCESS; @@ -1176,6 +1185,7 @@ lvp_compute_pipeline_create( vk_object_base_init(&device->vk, &pipeline->base, VK_OBJECT_TYPE_PIPELINE); + uint64_t t0 = os_time_get_nano(); result = lvp_compute_pipeline_init(pipeline, device, cache, pCreateInfo, pAllocator); if (result != VK_SUCCESS) { @@ -1183,6 +1193,13 @@ lvp_compute_pipeline_create( return result; } + const VkPipelineCreationFeedbackCreateInfo *feedback = (void*)vk_find_struct_const(pCreateInfo->pNext, PIPELINE_CREATION_FEEDBACK_CREATE_INFO); + if (feedback) { + feedback->pPipelineCreationFeedback->duration = os_time_get_nano() - t0; + feedback->pPipelineCreationFeedback->flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT; + memset(feedback->pPipelineStageCreationFeedbacks, 0, sizeof(VkPipelineCreationFeedback) * feedback->pipelineStageCreationFeedbackCount); + } + *pPipeline = lvp_pipeline_to_handle(pipeline); return VK_SUCCESS;