Module: Mesa Branch: main Commit: 92a951db6a61762ba6be88416223278e2eb11c7b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=92a951db6a61762ba6be88416223278e2eb11c7b
Author: Konstantin Seurer <konstantin.seu...@gmail.com> Date: Mon Sep 11 21:38:37 2023 +0200 radv: Make pipeline cache object data generic Pipeline cache objects can hold some generic data. Anything concerning that should not be handled in "common" code paths. Reviewed-by: Friedrich Vock <friedrich.v...@gmx.de> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25224> --- src/amd/vulkan/radv_pipeline_cache.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index bb68462900f..3f2fb9222e7 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -229,8 +229,8 @@ const struct vk_pipeline_cache_object_ops radv_shader_ops = { struct radv_pipeline_cache_object { struct vk_pipeline_cache_object base; unsigned num_shaders; - unsigned num_stack_sizes; - void *data; /* pointer to stack sizes */ + uint32_t data_size; + void *data; /* Generic data stored alongside the shaders */ uint8_t sha1[SHA1_DIGEST_LENGTH]; struct radv_shader *shaders[]; }; @@ -238,11 +238,10 @@ struct radv_pipeline_cache_object { const struct vk_pipeline_cache_object_ops radv_pipeline_ops; static struct radv_pipeline_cache_object * -radv_pipeline_cache_object_create(struct vk_device *device, unsigned num_shaders, const void *hash, - unsigned num_stack_sizes) +radv_pipeline_cache_object_create(struct vk_device *device, unsigned num_shaders, const void *hash, unsigned data_size) { - const size_t size = sizeof(struct radv_pipeline_cache_object) + (num_shaders * sizeof(struct radv_shader *)) + - (num_stack_sizes * sizeof(uint32_t)); + const size_t size = + sizeof(struct radv_pipeline_cache_object) + (num_shaders * sizeof(struct radv_shader *)) + data_size; struct radv_pipeline_cache_object *object = vk_alloc(&device->alloc, size, 8, VK_SYSTEM_ALLOCATION_SCOPE_CACHE); if (!object) @@ -250,8 +249,8 @@ radv_pipeline_cache_object_create(struct vk_device *device, unsigned num_shaders vk_pipeline_cache_object_init(device, &object->base, &radv_pipeline_ops, object->sha1, SHA1_DIGEST_LENGTH); object->num_shaders = num_shaders; - object->num_stack_sizes = num_stack_sizes; object->data = &object->shaders[num_shaders]; + object->data_size = data_size; memcpy(object->sha1, hash, SHA1_DIGEST_LENGTH); memset(object->shaders, 0, sizeof(object->shaders[0]) * num_shaders); @@ -281,10 +280,10 @@ radv_pipeline_cache_object_deserialize(struct vk_pipeline_cache *cache, const vo assert(key_size == SHA1_DIGEST_LENGTH); unsigned total_size = blob->end - blob->current; unsigned num_shaders = blob_read_uint32(blob); - unsigned num_stack_sizes = blob_read_uint32(blob); + unsigned data_size = blob_read_uint32(blob); struct radv_pipeline_cache_object *object; - object = radv_pipeline_cache_object_create(&device->vk, num_shaders, key_data, num_stack_sizes); + object = radv_pipeline_cache_object_create(&device->vk, num_shaders, key_data, data_size); if (!object) return NULL; @@ -306,7 +305,6 @@ radv_pipeline_cache_object_deserialize(struct vk_pipeline_cache *cache, const vo object->shaders[i] = container_of(shader, struct radv_shader, base); } - const size_t data_size = num_stack_sizes * sizeof(uint32_t); blob_copy_bytes(blob, object->data, data_size); return &object->base; @@ -318,13 +316,12 @@ radv_pipeline_cache_object_serialize(struct vk_pipeline_cache_object *object, st struct radv_pipeline_cache_object *pipeline_obj = container_of(object, struct radv_pipeline_cache_object, base); blob_write_uint32(blob, pipeline_obj->num_shaders); - blob_write_uint32(blob, pipeline_obj->num_stack_sizes); + blob_write_uint32(blob, pipeline_obj->data_size); for (unsigned i = 0; i < pipeline_obj->num_shaders; i++) blob_write_bytes(blob, pipeline_obj->shaders[i]->hash, sizeof(pipeline_obj->shaders[i]->hash)); - const size_t data_size = pipeline_obj->num_stack_sizes * sizeof(uint32_t); - blob_write_bytes(blob, pipeline_obj->data, data_size); + blob_write_bytes(blob, pipeline_obj->data, pipeline_obj->data_size); return true; } @@ -448,7 +445,7 @@ radv_ray_tracing_pipeline_cache_search(struct radv_device *device, struct vk_pip } assert(idx == pipeline_obj->num_shaders); - assert(pipeline->stage_count == pipeline_obj->num_stack_sizes); + assert(pipeline->stage_count == pipeline_obj->data_size / sizeof(uint32_t)); uint32_t *stack_sizes = pipeline_obj->data; for (unsigned i = 0; i < pipeline->stage_count; i++) @@ -490,7 +487,7 @@ radv_ray_tracing_pipeline_cache_insert(struct radv_device *device, struct vk_pip num_shaders += radv_ray_tracing_stage_is_compiled(&pipeline->stages[i]) ? 1 : 0; struct radv_pipeline_cache_object *pipeline_obj = - radv_pipeline_cache_object_create(&device->vk, num_shaders, sha1, pipeline->stage_count); + radv_pipeline_cache_object_create(&device->vk, num_shaders, sha1, pipeline->stage_count * sizeof(uint32_t)); unsigned idx = 0; if (pipeline->base.base.shaders[MESA_SHADER_INTERSECTION])