And return a better error value.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107954
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_pipeline.c | 32 +++++++++++++++++++++++++-------
 src/amd/vulkan/radv_shader.c   |  3 +++
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index ae269c32c49..f1e3c6f9fe9 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -1983,8 +1983,8 @@ merge_tess_info(struct shader_info *tes_info,
        tes_info->tess.point_mode |= tcs_info->tess.point_mode;
 }
 
-static
-void radv_create_shaders(struct radv_pipeline *pipeline,
+static VkResult
+radv_create_shaders(struct radv_pipeline *pipeline,
                          struct radv_device *device,
                          struct radv_pipeline_cache *cache,
                          struct radv_pipeline_key key,
@@ -2023,7 +2023,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
 
        if (radv_create_shader_variants_from_pipeline_cache(device, cache, 
hash, pipeline->shaders) &&
            (!modules[MESA_SHADER_GEOMETRY] || pipeline->gs_copy_shader)) {
-               return;
+               return VK_SUCCESS;
        }
 
        if (!modules[MESA_SHADER_FRAGMENT] && !modules[MESA_SHADER_COMPUTE]) {
@@ -2056,6 +2056,9 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
                                                    stage ? 
stage->pSpecializationInfo : NULL,
                                                    flags);
 
+               if (!nir[i])
+                       goto fail;
+
                /* We don't want to alter meta shaders IR directly so clone it
                 * first.
                 */
@@ -2202,6 +2205,14 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
 
        if (fs_m.nir)
                ralloc_free(fs_m.nir);
+
+       return VK_SUCCESS;
+
+fail:
+       for (int i = 0; i < MESA_SHADER_STAGES; ++i)
+               ralloc_free(nir[i]);
+       ralloc_free(fs_m.nir);
+       return VK_ERROR_INVALID_SHADER_NV;
 }
 
 static uint32_t
@@ -3448,9 +3459,11 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
                pStages[stage] = &pCreateInfo->pStages[i];
        }
 
-       radv_create_shaders(pipeline, device, cache, 
-                           radv_generate_graphics_pipeline_key(pipeline, 
pCreateInfo, &blend, has_view_index),
-                           pStages, pCreateInfo->flags);
+       result = radv_create_shaders(pipeline, device, cache,
+                                    
radv_generate_graphics_pipeline_key(pipeline, pCreateInfo, &blend, 
has_view_index),
+                                    pStages, pCreateInfo->flags);
+       if (result != VK_SUCCESS)
+               return result;
 
        pipeline->graphics.spi_baryc_cntl = S_0286E0_FRONT_FACE_ALL_BITS(1);
        radv_pipeline_init_multisample_state(pipeline, &blend, pCreateInfo);
@@ -3683,7 +3696,12 @@ static VkResult radv_compute_pipeline_create(
        assert(pipeline->layout);
 
        pStages[MESA_SHADER_COMPUTE] = &pCreateInfo->stage;
-       radv_create_shaders(pipeline, device, cache, (struct radv_pipeline_key) 
{0}, pStages, pCreateInfo->flags);
+       result = radv_create_shaders(pipeline, device, cache,
+                                    (struct radv_pipeline_key) {0}, pStages, 
pCreateInfo->flags);
+       if (result != VK_SUCCESS) {
+               radv_pipeline_destroy(device, pipeline, pAllocator);
+               return result;
+       }
 
        pipeline->user_data_0[MESA_SHADER_COMPUTE] = 
radv_pipeline_stage_to_user_data_0(pipeline, MESA_SHADER_COMPUTE, 
device->physical_device->rad_info.chip_class);
        pipeline->need_indirect_descriptor_sets |= 
pipeline->shaders[MESA_SHADER_COMPUTE]->info.need_indirect_descriptor_sets;
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 51e0b7d65fc..9fd7b478a3e 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -230,6 +230,9 @@ radv_shader_compile_to_nir(struct radv_device *device,
                                           spec_entries, num_spec_entries,
                                           stage, entrypoint_name,
                                           &spirv_options, &nir_options);
+               if (!entry_point)
+                       return NULL;
+
                nir = entry_point->shader;
                assert(nir->info.stage == stage);
                nir_validate_shader(nir);
-- 
2.19.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to