diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index b9aa69d6fc4..92e17fe10af 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -2073,6 +2073,26 @@ radv_shader_create(struct radv_device *device, const struct radv_shader_binary * return shader; } +bool +radv_shader_reupload(struct radv_device *device, struct radv_shader *shader) +{ + if (device->shader_use_invisible_vram) { + struct radv_shader_dma_submission *submission = + radv_shader_dma_get_submission(device, shader->bo, shader->va, shader->code_size); + if (!submission) + return false; + + memcpy(submission->ptr, shader->code, shader->code_size); + + if (!radv_shader_dma_submit(device, submission, &shader->upload_seq)) + return false; + } else { + void *dest_ptr = shader->alloc->arena->ptr + shader->alloc->offset; + memcpy(dest_ptr, shader->code, shader->code_size); + } + return true; +} + static bool radv_shader_part_binary_upload(struct radv_device *device, const struct radv_shader_part_binary *bin, struct radv_shader_part *shader_part) diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 074ec6c0ce9..2b0e57ad4ac 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -685,6 +685,9 @@ 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); +/* Returns true on success and false on failure */ +bool radv_shader_reupload(struct radv_device *device, struct radv_shader *shader); + extern const struct vk_pipeline_cache_object_ops radv_shader_ops; static inline struct radv_shader *