Module: Mesa Branch: main Commit: 74647ee45af6759487c75cd93cb7be70f0b7fe61 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=74647ee45af6759487c75cd93cb7be70f0b7fe61
Author: Thomas H.P. Andersen <pho...@gmail.com> Date: Mon Oct 23 21:29:18 2023 +0200 nvk: VK_EXT_pipeline_creation_feedback dEQP-VK.*creation_feedback* Test run totals: Passed: 13/73 (17.8%) Failed: 0/73 (0.0%) Not supported: 60/73 (82.2%) Warnings: 0/73 (0.0%) Waived: 0/73 (0.0%) Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25550> --- src/nouveau/vulkan/nvk_graphics_pipeline.c | 41 +++++++++++++++++++++++++++--- src/nouveau/vulkan/nvk_physical_device.c | 1 + 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/nouveau/vulkan/nvk_graphics_pipeline.c b/src/nouveau/vulkan/nvk_graphics_pipeline.c index 26e5dd3dcf7..a1c2b77ddf9 100644 --- a/src/nouveau/vulkan/nvk_graphics_pipeline.c +++ b/src/nouveau/vulkan/nvk_graphics_pipeline.c @@ -186,6 +186,17 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, NULL, 0, &all, NULL, 0, NULL); assert(result == VK_SUCCESS); + VkPipelineCreationFeedbackEXT pipeline_feedback = { + .flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT, + }; + VkPipelineCreationFeedbackEXT stage_feedbacks[MESA_SHADER_STAGES] = { 0 }; + + int64_t pipeline_start = os_time_get_nano(); + + const VkPipelineCreationFeedbackCreateInfo *creation_feedback = + vk_find_struct_const(pCreateInfo->pNext, + PIPELINE_CREATION_FEEDBACK_CREATE_INFO); + const VkPipelineShaderStageCreateInfo *infos[MESA_SHADER_STAGES] = {}; nir_shader *nir[MESA_SHADER_STAGES] = {}; struct vk_pipeline_robustness_state robustness[MESA_SHADER_STAGES]; @@ -225,10 +236,12 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, bool cache_hit = false; cache_objs[stage] = vk_pipeline_cache_lookup_object(cache, &sha1, sizeof(sha1), &nvk_shader_ops, &cache_hit); - if (cache_objs[stage]) { - pipeline->base.shaders[stage] = - container_of(cache_objs[stage], struct nvk_shader, base); - } + pipeline->base.shaders[stage] = + container_of(cache_objs[stage], struct nvk_shader, base); + + if (cache_hit && cache != dev->mem_cache) + pipeline_feedback.flags |= + VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT; } } @@ -254,6 +267,8 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, continue; if (!cache_objs[stage]) { + int64_t stage_start = os_time_get_nano(); + unsigned char sha1[SHA1_DIGEST_LENGTH]; nvk_hash_shader(sha1, sinfo, &robustness[stage], state.rp->view_mask != 0, pipeline_layout, @@ -280,10 +295,12 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, cache_objs[stage] = vk_pipeline_cache_add_object(cache, cache_objs[stage]); + stage_feedbacks[stage].flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT; pipeline->base.shaders[stage] = container_of(cache_objs[stage], struct nvk_shader, base); } + stage_feedbacks[stage].duration += os_time_get_nano() - stage_start; ralloc_free(nir[stage]); } @@ -420,6 +437,22 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, pipeline->dynamic.ms.sample_locations = &pipeline->_dynamic_sl; vk_dynamic_graphics_state_fill(&pipeline->dynamic, &state); + pipeline_feedback.duration = os_time_get_nano() - pipeline_start; + if (creation_feedback) { + *creation_feedback->pPipelineCreationFeedback = pipeline_feedback; + + int fb_count = creation_feedback->pipelineStageCreationFeedbackCount; + if (pCreateInfo->stageCount == fb_count) { + for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) { + const VkPipelineShaderStageCreateInfo *sinfo = + &pCreateInfo->pStages[i]; + gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage); + creation_feedback->pPipelineStageCreationFeedbacks[i] = + stage_feedbacks[stage]; + } + } + } + *pPipeline = nvk_pipeline_to_handle(&pipeline->base); return VK_SUCCESS; diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 103e0e7c56b..273d782a066 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -174,6 +174,7 @@ nvk_get_device_extensions(const struct nvk_instance *instance, .EXT_mutable_descriptor_type = true, .EXT_non_seamless_cube_map = true, .EXT_pci_bus_info = info->type == NV_DEVICE_TYPE_DIS, + .EXT_pipeline_creation_feedback = true, .EXT_physical_device_drm = true, .EXT_primitive_topology_list_restart = true, .EXT_private_data = true,