We will use radv_shader directly as cache entries.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22030>
_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)
{
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. */
}
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);
#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"
};
struct radv_shader {
- uint32_t ref_count;
+ struct vk_pipeline_cache_object base;
struct radeon_winsys_bo *bo;
union radv_shader_arena_block *alloc;
uint32_t exec_size;
struct radv_shader_info info;
+ uint8_t sha1[SHA1_DIGEST_LENGTH];
+
/* sqtt only */
void *code;
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);
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 *