Mesa (main): radv: rework pipeline and shaders creation feedback

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 8 17:09:40 UTC 2022


Module: Mesa
Branch: main
Commit: 000e9ac87429da5674c60500ae2d3163e459f16f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=000e9ac87429da5674c60500ae2d3163e459f16f

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri Apr  8 08:38:05 2022 +0200

radv: rework pipeline and shaders creation feedback

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15794>

---

 src/amd/vulkan/radv_pipeline.c | 138 ++++++++++++++++-------------------------
 src/amd/vulkan/radv_shader.h   |   3 +-
 2 files changed, 53 insertions(+), 88 deletions(-)

diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 4182a5de6d7..19effb77425 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -3554,45 +3554,6 @@ gather_tess_info(struct radv_device *device, nir_shader **nir, struct radv_shade
             num_patches, tess_in_patch_size, tess_out_patch_size);
 }
 
-static void
-radv_init_feedback(const VkPipelineCreationFeedbackCreateInfo *ext)
-{
-   if (!ext)
-      return;
-
-   if (ext->pPipelineCreationFeedback) {
-      ext->pPipelineCreationFeedback->flags = 0;
-      ext->pPipelineCreationFeedback->duration = 0;
-   }
-
-   for (unsigned i = 0; i < ext->pipelineStageCreationFeedbackCount; ++i) {
-      ext->pPipelineStageCreationFeedbacks[i].flags = 0;
-      ext->pPipelineStageCreationFeedbacks[i].duration = 0;
-   }
-}
-
-static void
-radv_start_feedback(VkPipelineCreationFeedback *feedback)
-{
-   if (!feedback)
-      return;
-
-   feedback->duration -= radv_get_current_time();
-   feedback->flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT;
-}
-
-static void
-radv_stop_feedback(VkPipelineCreationFeedback *feedback, bool cache_hit)
-{
-   if (!feedback)
-      return;
-
-   feedback->duration += radv_get_current_time();
-   feedback->flags =
-      VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT |
-      (cache_hit ? VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT : 0);
-}
-
 static bool
 mem_vectorize_callback(unsigned align_mul, unsigned align_offset, unsigned bit_size,
                        unsigned num_components, nir_intrinsic_instr *low, nir_intrinsic_instr *high,
@@ -4130,8 +4091,7 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
                     const VkPipelineShaderStageCreateInfo *pStages,
                     uint32_t stageCount,
                     const VkPipelineCreateFlags flags, const uint8_t *custom_hash,
-                    VkPipelineCreationFeedback *pipeline_feedback,
-                    VkPipelineCreationFeedback **stage_feedbacks)
+                    const VkPipelineCreationFeedbackCreateInfo *creation_feedback)
 {
    struct vk_shader_module fs_m = {0};
    struct vk_shader_module *modules[MESA_VULKAN_SHADER_STAGES] = {
@@ -4151,9 +4111,14 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
    struct radv_pipeline_shader_stack_size **stack_sizes =
       pipeline->type == RADV_PIPELINE_COMPUTE ? &pipeline->compute.rt_stack_sizes : NULL;
    uint32_t *num_stack_sizes = stack_sizes ? &pipeline->compute.group_count : NULL;
+   VkPipelineCreationFeedbackEXT pipeline_feedback = {
+      .flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT,
+   };
+   VkPipelineCreationFeedbackEXT stages_feedback[MESA_VULKAN_SHADER_STAGES] = {0};
    bool noop_fs = false;
+   VkResult result = VK_SUCCESS;
 
-   radv_start_feedback(pipeline_feedback);
+   int64_t pipeline_start = os_time_get_nano();
 
    for (uint32_t i = 0; i < stageCount; i++) {
       const VkPipelineShaderStageCreateInfo *sinfo = &pStages[i];
@@ -4166,6 +4131,8 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
                             modules[stage]->sha1);
       }
 
+      stages_feedback[stage].flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT;
+
       pipeline->active_stages |= sinfo->stage;
    }
 
@@ -4204,26 +4171,30 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
        radv_create_shaders_from_pipeline_cache(device, cache, hash, pipeline,
                                                stack_sizes, num_stack_sizes,
                                                &found_in_application_cache)) {
-      radv_stop_feedback(pipeline_feedback, found_in_application_cache);
-      return VK_SUCCESS;
+      if (found_in_application_cache)
+         pipeline_feedback.flags |= VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT;
+      result = VK_SUCCESS;
+      goto done;
    }
 
    if (flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT) {
-      radv_stop_feedback(pipeline_feedback, found_in_application_cache);
-      return VK_PIPELINE_COMPILE_REQUIRED;
+      if (found_in_application_cache)
+         pipeline_feedback.flags |= VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT;
+      result = VK_PIPELINE_COMPILE_REQUIRED;
+      goto done;
    }
 
    for (uint32_t i = 0; i < stageCount; i++) {
       const VkPipelineShaderStageCreateInfo *sinfo = &pStages[i];
       gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage);
 
-      radv_start_feedback(stage_feedbacks[stage]);
+      int64_t stage_start = os_time_get_nano();
 
       nir[stage] = radv_shader_compile_to_nir(device, modules[stage], sinfo ? sinfo->pName : "main",
                                               stage, sinfo ? sinfo->pSpecializationInfo : NULL,
                                               pipeline_key);
 
-      radv_stop_feedback(stage_feedbacks[stage], false);
+      stages_feedback[stage].duration += os_time_get_nano() - stage_start;
    }
 
    if (!modules[MESA_SHADER_FRAGMENT] && !modules[MESA_SHADER_COMPUTE]) {
@@ -4232,13 +4203,14 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
       modules[MESA_SHADER_FRAGMENT] = &fs_m;
       noop_fs = true;
 
-      radv_start_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT]);
+      int64_t stage_start = os_time_get_nano();
 
       nir[MESA_SHADER_FRAGMENT] = radv_shader_compile_to_nir(device, modules[MESA_SHADER_FRAGMENT],
                                                              "main",  MESA_SHADER_FRAGMENT, NULL,
                                                               pipeline_key);
 
-      radv_stop_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT], false);
+      stages_feedback[MESA_SHADER_FRAGMENT].duration += os_time_get_nano() - stage_start;
+      stages_feedback[MESA_SHADER_FRAGMENT].flags = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT;
    }
 
    /* Force per-vertex VRS. */
@@ -4256,14 +4228,15 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
 
    for (int i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
       if (nir[i]) {
-         radv_start_feedback(stage_feedbacks[i]);
+         int64_t stage_start = os_time_get_nano();
+
          radv_optimize_nir(nir[i], optimize_conservatively, false);
 
          /* Gather info again, information such as outputs_read can be out-of-date. */
          nir_shader_gather_info(nir[i], nir_shader_get_entrypoint(nir[i]));
          radv_lower_io(device, nir[i]);
 
-         radv_stop_feedback(stage_feedbacks[i], false);
+         stages_feedback[i].duration += os_time_get_nano() - stage_start;
       }
    }
 
@@ -4328,7 +4301,7 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
 
    for (int i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
       if (nir[i]) {
-         radv_start_feedback(stage_feedbacks[i]);
+         int64_t stage_start = os_time_get_nano();
 
          /* Wave and workgroup size should already be filled. */
          assert(infos[i].wave_size && infos[i].workgroup_size);
@@ -4435,7 +4408,7 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
          nir_opt_sink(nir[i], move_opts | nir_move_load_ssbo);
          nir_opt_move(nir[i], move_opts);
 
-         radv_stop_feedback(stage_feedbacks[i], false);
+         stages_feedback[i].duration += os_time_get_nano() - stage_start;
       }
    }
 
@@ -4478,14 +4451,14 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
 
    if (nir[MESA_SHADER_FRAGMENT]) {
       if (!pipeline->shaders[MESA_SHADER_FRAGMENT]) {
-         radv_start_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT]);
+         int64_t stage_start = os_time_get_nano();
 
          pipeline->shaders[MESA_SHADER_FRAGMENT] = radv_shader_compile(
             device, &nir[MESA_SHADER_FRAGMENT], 1,
             pipeline_key, infos + MESA_SHADER_FRAGMENT, &args[MESA_SHADER_FRAGMENT],
             keep_executable_info, keep_statistic_info, &binaries[MESA_SHADER_FRAGMENT]);
 
-         radv_stop_feedback(stage_feedbacks[MESA_SHADER_FRAGMENT], false);
+         stages_feedback[MESA_SHADER_FRAGMENT].duration += os_time_get_nano() - stage_start;
       }
 
       active_stages &= ~(1 << MESA_SHADER_FRAGMENT);
@@ -4495,14 +4468,14 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
       if (!pipeline->shaders[MESA_SHADER_TESS_CTRL]) {
          struct nir_shader *combined_nir[] = {nir[MESA_SHADER_VERTEX], nir[MESA_SHADER_TESS_CTRL]};
 
-         radv_start_feedback(stage_feedbacks[MESA_SHADER_TESS_CTRL]);
+         int64_t stage_start = os_time_get_nano();
 
          pipeline->shaders[MESA_SHADER_TESS_CTRL] = radv_shader_compile(
             device, combined_nir, 2, pipeline_key,
             &infos[MESA_SHADER_TESS_CTRL], &args[MESA_SHADER_TESS_CTRL], keep_executable_info,
             keep_statistic_info, &binaries[MESA_SHADER_TESS_CTRL]);
 
-         radv_stop_feedback(stage_feedbacks[MESA_SHADER_TESS_CTRL], false);
+         stages_feedback[MESA_SHADER_TESS_CTRL].duration += os_time_get_nano() - stage_start;
       }
 
       active_stages &= ~(1 << MESA_SHADER_VERTEX);
@@ -4515,14 +4488,14 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
       if (!pipeline->shaders[MESA_SHADER_GEOMETRY]) {
          struct nir_shader *combined_nir[] = {nir[pre_stage], nir[MESA_SHADER_GEOMETRY]};
 
-         radv_start_feedback(stage_feedbacks[MESA_SHADER_GEOMETRY]);
+         int64_t stage_start = os_time_get_nano();
 
          pipeline->shaders[MESA_SHADER_GEOMETRY] = radv_shader_compile(
             device, combined_nir, 2, pipeline_key,
             &infos[MESA_SHADER_GEOMETRY], &args[MESA_SHADER_GEOMETRY], keep_executable_info,
             keep_statistic_info, &binaries[MESA_SHADER_GEOMETRY]);
 
-         radv_stop_feedback(stage_feedbacks[MESA_SHADER_GEOMETRY], false);
+         stages_feedback[MESA_SHADER_GEOMETRY].duration += os_time_get_nano() - stage_start;
       }
 
       active_stages &= ~(1 << pre_stage);
@@ -4531,13 +4504,13 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
 
    u_foreach_bit(i, active_stages) {
       if (!pipeline->shaders[i]) {
-         radv_start_feedback(stage_feedbacks[i]);
+         int64_t stage_start = os_time_get_nano();
 
          pipeline->shaders[i] = radv_shader_compile(
             device, &nir[i], 1, pipeline_key, infos + i, &args[i],
             keep_executable_info, keep_statistic_info, &binaries[i]);
 
-         radv_stop_feedback(stage_feedbacks[i], false);
+         stages_feedback[i].duration += os_time_get_nano() - stage_start;
       }
    }
 
@@ -4592,8 +4565,20 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout
    if (fs_m.nir)
       ralloc_free(fs_m.nir);
 
-   radv_stop_feedback(pipeline_feedback, false);
-   return VK_SUCCESS;
+done:
+   pipeline_feedback.duration = os_time_get_nano() - pipeline_start;
+
+   if (creation_feedback) {
+      *creation_feedback->pPipelineCreationFeedback = pipeline_feedback;
+
+      assert(stageCount == creation_feedback->pipelineStageCreationFeedbackCount);
+      for (uint32_t i = 0; i < stageCount; i++) {
+         gl_shader_stage s = vk_to_mesa_shader_stage(pStages[i].stage);
+         creation_feedback->pPipelineStageCreationFeedbacks[i] = stages_feedback[s];
+      }
+   }
+
+   return result;
 }
 
 static uint32_t
@@ -6507,24 +6492,13 @@ radv_graphics_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *
 
    const VkPipelineCreationFeedbackCreateInfo *creation_feedback =
       vk_find_struct_const(pCreateInfo->pNext, PIPELINE_CREATION_FEEDBACK_CREATE_INFO);
-   radv_init_feedback(creation_feedback);
-
-   VkPipelineCreationFeedback *pipeline_feedback =
-      creation_feedback ? creation_feedback->pPipelineCreationFeedback : NULL;
-
-   VkPipelineCreationFeedback *stage_feedbacks[MESA_VULKAN_SHADER_STAGES] = {0};
-   for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
-      gl_shader_stage stage = ffs(pCreateInfo->pStages[i].stage) - 1;
-      if (creation_feedback)
-         stage_feedbacks[stage] = &creation_feedback->pPipelineStageCreationFeedbacks[i];
-   }
 
    struct radv_pipeline_key key =
       radv_generate_graphics_pipeline_key(pipeline, pCreateInfo, &blend);
 
    result = radv_create_shaders(pipeline, pipeline_layout, device, cache, &key, pCreateInfo->pStages,
-                                pCreateInfo->stageCount, pCreateInfo->flags, NULL, pipeline_feedback,
-                                stage_feedbacks);
+                                pCreateInfo->stageCount, pCreateInfo->flags, NULL,
+                                creation_feedback);
    if (result != VK_SUCCESS)
       return result;
 
@@ -6824,7 +6798,6 @@ radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache,
    RADV_FROM_HANDLE(radv_device, device, _device);
    RADV_FROM_HANDLE(radv_pipeline_cache, cache, _cache);
    RADV_FROM_HANDLE(radv_pipeline_layout, pipeline_layout, pCreateInfo->layout);
-   VkPipelineCreationFeedback *stage_feedbacks[MESA_VULKAN_SHADER_STAGES] = {0};
    struct radv_pipeline *pipeline;
    VkResult result;
 
@@ -6843,18 +6816,11 @@ radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache,
 
    const VkPipelineCreationFeedbackCreateInfo *creation_feedback =
       vk_find_struct_const(pCreateInfo->pNext, PIPELINE_CREATION_FEEDBACK_CREATE_INFO);
-   radv_init_feedback(creation_feedback);
-
-   VkPipelineCreationFeedback *pipeline_feedback =
-      creation_feedback ? creation_feedback->pPipelineCreationFeedback : NULL;
-   if (creation_feedback)
-      stage_feedbacks[MESA_SHADER_COMPUTE] = &creation_feedback->pPipelineStageCreationFeedbacks[0];
 
    struct radv_pipeline_key key = radv_generate_compute_pipeline_key(pipeline, pCreateInfo);
 
    result = radv_create_shaders(pipeline, pipeline_layout, device, cache, &key, &pCreateInfo->stage,
-                                1, pCreateInfo->flags, custom_hash, pipeline_feedback,
-                                stage_feedbacks);
+                                1, pCreateInfo->flags, custom_hash, creation_feedback);
    if (result != VK_SUCCESS) {
       radv_pipeline_destroy(device, pipeline, pAllocator);
       return result;
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 3ca783facae..570f33bf292 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -528,8 +528,7 @@ VkResult radv_create_shaders(struct radv_pipeline *pipeline,
                              const VkPipelineShaderStageCreateInfo *pStages,
                              uint32_t stageCount,
                              const VkPipelineCreateFlags flags, const uint8_t *custom_hash,
-                             VkPipelineCreationFeedback *pipeline_feedback,
-                             VkPipelineCreationFeedback **stage_feedbacks);
+                             const VkPipelineCreationFeedbackCreateInfo *creation_feedback);
 
 struct radv_shader_args;
 



More information about the mesa-commit mailing list