radv: allow to return the PS epilog binary to the pipeline
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 10 Mar 2023 15:04:57 +0000 (16:04 +0100)
committerMarge Bot <emma+marge@anholt.net>
Tue, 21 Mar 2023 13:53:59 +0000 (13:53 +0000)
To add it to the shaders cache.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21897>

src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_pipeline.c
src/amd/vulkan/radv_shader.c
src/amd/vulkan/radv_shader.h

index 9ae327a..c6f90d9 100644 (file)
@@ -4207,7 +4207,7 @@ lookup_ps_epilog(struct radv_cmd_buffer *cmd_buffer)
          return epilog_entry->data;
       }
 
-      epilog = radv_create_ps_epilog(device, &key);
+      epilog = radv_create_ps_epilog(device, &key, NULL);
       struct radv_ps_epilog_key *key2 = malloc(sizeof(*key2));
       if (!epilog || !key2) {
          radv_shader_part_unref(device, epilog);
index 537705f..8616a13 100644 (file)
@@ -3220,7 +3220,8 @@ static bool
 radv_pipeline_create_ps_epilog(struct radv_graphics_pipeline *pipeline,
                                const struct radv_pipeline_key *pipeline_key,
                                VkGraphicsPipelineLibraryFlagBitsEXT lib_flags,
-                               bool noop_fs)
+                               bool noop_fs,
+                               struct radv_shader_part_binary **ps_epilog_binary)
 {
    struct radv_device *device = pipeline->base.device;
    bool needs_ps_epilog = false;
@@ -3241,7 +3242,8 @@ radv_pipeline_create_ps_epilog(struct radv_graphics_pipeline *pipeline,
    }
 
    if (needs_ps_epilog) {
-      pipeline->ps_epilog = radv_create_ps_epilog(device, &pipeline_key->ps.epilog);
+      pipeline->ps_epilog =
+         radv_create_ps_epilog(device, &pipeline_key->ps.epilog, ps_epilog_binary);
       if (!pipeline->ps_epilog)
          return false;
    }
@@ -3351,6 +3353,7 @@ radv_graphics_pipeline_compile(struct radv_graphics_pipeline *pipeline,
    const char *noop_fs_entrypoint = "noop_fs";
    struct radv_shader_binary *binaries[MESA_VULKAN_SHADER_STAGES] = {NULL};
    struct radv_shader_binary *gs_copy_binary = NULL;
+   struct radv_shader_part_binary *ps_epilog_binary = NULL;
    unsigned char hash[20];
    bool keep_executable_info =
       radv_pipeline_capture_shaders(pipeline->base.device, pCreateInfo->flags);
@@ -3413,7 +3416,7 @@ radv_graphics_pipeline_compile(struct radv_graphics_pipeline *pipeline,
          pipeline_feedback.flags |= VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT;
 
       /* TODO: Add PS epilogs to the cache. */
-      if (!radv_pipeline_create_ps_epilog(pipeline, pipeline_key, lib_flags, noop_fs))
+      if (!radv_pipeline_create_ps_epilog(pipeline, pipeline_key, lib_flags, noop_fs, NULL))
          return VK_ERROR_OUT_OF_DEVICE_MEMORY;
 
       result = VK_SUCCESS;
@@ -3501,7 +3504,8 @@ radv_graphics_pipeline_compile(struct radv_graphics_pipeline *pipeline,
    radv_pipeline_nir_to_asm(pipeline, stages, pipeline_key, pipeline_layout, keep_executable_info,
                             keep_statistic_info, active_nir_stages, binaries, &gs_copy_binary);
 
-   if (!radv_pipeline_create_ps_epilog(pipeline, pipeline_key, lib_flags, noop_fs))
+   if (!radv_pipeline_create_ps_epilog(pipeline, pipeline_key, lib_flags, noop_fs,
+                                       &ps_epilog_binary))
       return VK_ERROR_OUT_OF_DEVICE_MEMORY;
 
    if (keep_executable_info) {
@@ -3546,6 +3550,7 @@ radv_graphics_pipeline_compile(struct radv_graphics_pipeline *pipeline,
    }
 
    free(gs_copy_binary);
+   free(ps_epilog_binary);
    for (int i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) {
       free(binaries[i]);
       if (stages[i].nir) {
index 97239b3..2a95713 100644 (file)
@@ -2944,7 +2944,8 @@ fail:
 }
 
 struct radv_shader_part *
-radv_create_ps_epilog(struct radv_device *device, const struct radv_ps_epilog_key *key)
+radv_create_ps_epilog(struct radv_device *device, const struct radv_ps_epilog_key *key,
+                      struct radv_shader_part_binary **binary_out)
 {
    struct radv_shader_part *epilog;
    struct radv_shader_args args = {0};
@@ -2985,7 +2986,11 @@ radv_create_ps_epilog(struct radv_device *device, const struct radv_ps_epilog_ke
       fprintf(stderr, "\ndisasm:\n%s\n", epilog->disasm_string);
    }
 
-   free(binary);
+   if (binary_out) {
+      *binary_out = binary;
+   } else {
+      free(binary);
+   }
 
    return epilog;
 
index 8bfdd02..52a3b2d 100644 (file)
@@ -623,7 +623,8 @@ struct radv_shader_part *radv_create_vs_prolog(struct radv_device *device,
                                                const struct radv_vs_prolog_key *key);
 
 struct radv_shader_part *radv_create_ps_epilog(struct radv_device *device,
-                                               const struct radv_ps_epilog_key *key);
+                                               const struct radv_ps_epilog_key *key,
+                                               struct radv_shader_part_binary **binary_out);
 
 void radv_shader_destroy(struct radv_device *device, struct radv_shader *shader);