radv: derive struct radv_shader from vk_pipeline_cache_object
authorDaniel Schürmann <daniel@schuermann.dev>
Fri, 17 Mar 2023 10:35:33 +0000 (11:35 +0100)
committerMarge Bot <emma+marge@anholt.net>
Tue, 11 Apr 2023 11:38:15 +0000 (11:38 +0000)
We will use radv_shader directly as cache entries.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22030>

src/amd/vulkan/radv_pipeline_cache.c
src/amd/vulkan/radv_shader.c
src/amd/vulkan/radv_shader.h

index 637d90f..00a923d 100644 (file)
@@ -206,6 +206,36 @@ radv_hash_rt_shaders(unsigned char *hash, const VkRayTracingPipelineCreateInfoKH
    _mesa_sha1_final(&ctx, hash);
 }
 
+static void
+radv_shader_destroy(struct vk_device *_device, struct vk_pipeline_cache_object *object)
+{
+   struct radv_device *device = container_of(_device, struct radv_device, vk);
+   struct radv_shader *shader = container_of(object, struct radv_shader, base);
+
+   if (device->shader_use_invisible_vram) {
+      /* Wait for any pending upload to complete, or we'll be writing into freed shader memory. */
+      radv_shader_wait_for_upload(device, shader->upload_seq);
+   }
+
+   radv_free_shader_memory(device, shader->alloc);
+
+   free(shader->code);
+   free(shader->spirv);
+   free(shader->nir_string);
+   free(shader->disasm_string);
+   free(shader->ir_string);
+   free(shader->statistics);
+
+   vk_pipeline_cache_object_finish(&shader->base);
+   free(shader);
+}
+
+const struct vk_pipeline_cache_object_ops radv_shader_ops = {
+   .serialize = NULL,
+   .deserialize = NULL,
+   .destroy = radv_shader_destroy,
+};
+
 static struct cache_entry *
 radv_pipeline_cache_search_unlocked(struct radv_pipeline_cache *cache, const unsigned char *sha1)
 {
index f308dfa..a6d0d5b 100644 (file)
@@ -1907,7 +1907,9 @@ radv_shader_create(struct radv_device *device, const struct radv_shader_binary *
    if (!shader)
       return NULL;
 
-   shader->ref_count = 1;
+   vk_pipeline_cache_object_init(&device->vk, &shader->base, &radv_shader_ops, shader->sha1,
+                                 SHA1_DIGEST_LENGTH);
+
    shader->info = binary->info;
 
    /* Copy the shader binary configuration. */
@@ -2519,27 +2521,6 @@ fail:
 }
 
 void
-radv_shader_destroy(struct radv_device *device, struct radv_shader *shader)
-{
-   assert(shader->ref_count == 0);
-
-   if (device->shader_use_invisible_vram) {
-      /* Wait for any pending upload to complete, or we'll be writing into freed shader memory. */
-      radv_shader_wait_for_upload(device, shader->upload_seq);
-   }
-
-   radv_free_shader_memory(device, shader->alloc);
-
-   free(shader->code);
-   free(shader->spirv);
-   free(shader->nir_string);
-   free(shader->disasm_string);
-   free(shader->ir_string);
-   free(shader->statistics);
-   free(shader);
-}
-
-void
 radv_shader_part_destroy(struct radv_device *device, struct radv_shader_part *shader_part)
 {
    assert(shader_part->ref_count == 0);
index 251e1d2..3f41105 100644 (file)
@@ -29,6 +29,7 @@
 #define RADV_SHADER_H
 
 #include "util/u_math.h"
+#include "vulkan/runtime/vk_pipeline_cache.h"
 #include "vulkan/vulkan.h"
 #include "ac_binary.h"
 #include "ac_shader_util.h"
@@ -502,7 +503,7 @@ union radv_shader_arena_block {
 };
 
 struct radv_shader {
-   uint32_t ref_count;
+   struct vk_pipeline_cache_object base;
 
    struct radeon_winsys_bo *bo;
    union radv_shader_arena_block *alloc;
@@ -515,6 +516,8 @@ struct radv_shader {
    uint32_t exec_size;
    struct radv_shader_info info;
 
+   uint8_t sha1[SHA1_DIGEST_LENGTH];
+
    /* sqtt only */
    void *code;
 
@@ -612,8 +615,6 @@ struct radv_shader_part *radv_create_ps_epilog(struct radv_device *device,
                                                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);
-
 void radv_shader_part_destroy(struct radv_device *device, struct radv_shader_part *shader_part);
 
 uint64_t radv_shader_get_va(const struct radv_shader *shader);
@@ -634,20 +635,19 @@ bool radv_can_dump_shader_stats(struct radv_device *device, nir_shader *nir);
 VkResult radv_dump_shader_stats(struct radv_device *device, struct radv_pipeline *pipeline,
                                 struct radv_shader *shader, gl_shader_stage stage, FILE *output);
 
+extern const struct vk_pipeline_cache_object_ops radv_shader_ops;
+
 static inline struct radv_shader *
 radv_shader_ref(struct radv_shader *shader)
 {
-   assert(shader && shader->ref_count >= 1);
-   p_atomic_inc(&shader->ref_count);
+   vk_pipeline_cache_object_ref(&shader->base);
    return shader;
 }
 
 static inline void
 radv_shader_unref(struct radv_device *device, struct radv_shader *shader)
 {
-   assert(shader && shader->ref_count >= 1);
-   if (p_atomic_dec_zero(&shader->ref_count))
-      radv_shader_destroy(device, shader);
+   vk_pipeline_cache_object_unref((struct vk_device *)device, &shader->base);
 }
 
 static inline struct radv_shader_part *