diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 0baa908684f..909d92adda1 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -3691,6 +3691,21 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_pipeline_layout } } + /* Upload shader binaries. */ + for (int i = 0; i < MESA_VULKAN_SHADER_STAGES; ++i) { + struct radv_shader *shader = pipeline->shaders[i]; + if (!shader) + continue; + + if (!radv_shader_binary_upload(device, binaries[i], shader)) + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + + if (i == MESA_SHADER_GEOMETRY && pipeline->gs_copy_shader) { + if (!radv_shader_binary_upload(device, gs_copy_binary, pipeline->gs_copy_shader)) + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + } + } + if (!keep_executable_info) { if (pipeline->gs_copy_shader) { assert(!binaries[MESA_SHADER_COMPUTE] && !pipeline->shaders[MESA_SHADER_COMPUTE]); diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index dfba72b8d47..34d74f81307 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -355,6 +355,13 @@ radv_create_shaders_from_pipeline_cache( p += entry->binary_sizes[i]; entry->shaders[i] = radv_shader_create(device, binary, false, true, NULL); + + if (!radv_shader_binary_upload(device, binary, entry->shaders[i])) { + free(binary); + radv_pipeline_cache_unlock(cache); + return false; + } + free(binary); } else if (entry->binary_sizes[i]) { p += entry->binary_sizes[i]; diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 68b6497f3e6..61ed8cfd8c4 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -1606,7 +1606,7 @@ radv_open_rtld_binary(struct radv_device *device, const struct radv_shader *shad return ac_rtld_open(rtld_binary, open_info); } -static bool +bool radv_shader_binary_upload(struct radv_device *device, const struct radv_shader_binary *binary, struct radv_shader *shader) { @@ -1710,9 +1710,6 @@ radv_shader_create(struct radv_device *device, const struct radv_shader_binary * radv_postprocess_config(device, &config, &binary->info, binary->stage, args, &shader->config); } - if (!radv_shader_binary_upload(device, binary, shader)) - return NULL; - if (binary->type == RADV_BINARY_TYPE_RTLD) { struct radv_shader_binary_rtld *bin = (struct radv_shader_binary_rtld *)binary; struct ac_rtld_binary rtld_binary = {0}; diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 52a5b06ab7c..a09afe900c2 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -514,6 +514,9 @@ struct radv_shader *radv_shader_compile( struct radv_shader_info *info, bool keep_shader_info, bool keep_statistic_info, struct radv_shader_binary **binary_out); +bool radv_shader_binary_upload(struct radv_device *device, const struct radv_shader_binary *binary, + struct radv_shader *shader); + struct radv_shader * radv_create_gs_copy_shader(struct radv_device *device, struct nir_shader *nir, struct radv_shader_info *info, struct radv_shader_binary **binary_out,