[Mesa-dev] [PATCH] radv: do not segfault when the SPIRV entry point is NULL
Samuel Pitoiset
samuel.pitoiset at gmail.com
Mon Sep 17 14:35:34 UTC 2018
On 9/17/18 11:22 AM, Jason Ekstrand wrote:
> It's not the job of the driver to check these things. Developers should
> be running with validation layers enabled which are supposed to catch
> this. There are so many other ways things can go wrong if the user
> provides bad input and this only fixes one tiny one.
Yes, you are right. Please ignore this patch.
>
> On Mon, Sep 17, 2018 at 4:18 AM Samuel Pitoiset
> <samuel.pitoiset at gmail.com <mailto:samuel.pitoiset at gmail.com>> wrote:
>
> And return a better error value.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107954
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com
> <mailto:samuel.pitoiset at 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 at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list