From 179d9e35112a993476d33638309f5984614a202b Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 23 Apr 2022 18:55:00 -0400 Subject: [PATCH] panvk: Handle empty shaders gracefully Fixes dEQP-VK.spirv_assembly.instruction.compute.shader_default_output.int.uninitialized Signed-off-by: Alyssa Rosenzweig Reviewed-by: Jason Ekstrand Part-of: --- src/panfrost/ci/deqp-panfrost-g52-vk.toml | 1 + src/panfrost/vulkan/panvk_vX_pipeline.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/panfrost/ci/deqp-panfrost-g52-vk.toml b/src/panfrost/ci/deqp-panfrost-g52-vk.toml index a223c499bc5..77db5a0a985 100644 --- a/src/panfrost/ci/deqp-panfrost-g52-vk.toml +++ b/src/panfrost/ci/deqp-panfrost-g52-vk.toml @@ -24,5 +24,6 @@ include = [ "dEQP-VK.pipeline.input_assembly.*", "dEQP-VK.pipeline.sampler.view_type.*.format.r*.address_modes.all_mode_clamp_to_border*", "dEQP-VK.spirv_assembly.instruction.compute.opquantize.*", + "dEQP-VK.spirv_assembly.instruction.compute.shader_default_output.*", "dEQP-VK.ssbo.layout.single_basic_type.*", ] diff --git a/src/panfrost/vulkan/panvk_vX_pipeline.c b/src/panfrost/vulkan/panvk_vX_pipeline.c index 84860706b2a..8db64430db2 100644 --- a/src/panfrost/vulkan/panvk_vX_pipeline.c +++ b/src/panfrost/vulkan/panvk_vX_pipeline.c @@ -162,6 +162,12 @@ static VkResult panvk_pipeline_builder_upload_shaders(struct panvk_pipeline_builder *builder, struct panvk_pipeline *pipeline) { + /* In some cases, the optimized shader is empty. Don't bother allocating + * anything in this case. + */ + if (builder->shader_total_size == 0) + return VK_SUCCESS; + struct panfrost_bo *bin_bo = panfrost_bo_create(&builder->device->physical_device->pdev, builder->shader_total_size, PAN_BO_EXECUTE, @@ -335,8 +341,13 @@ panvk_pipeline_builder_init_shaders(struct panvk_pipeline_builder *builder, if (i == MESA_SHADER_VERTEX && shader->info.vs.writes_point_size) pipeline->ia.writes_point_size = true; - mali_ptr shader_ptr = pipeline->binary_bo->ptr.gpu + - builder->stages[i].shader_offset; + mali_ptr shader_ptr = 0; + + /* Handle empty shaders gracefully */ + if (util_dynarray_num_elements(&builder->shaders[i]->binary, uint8_t)) { + shader_ptr = pipeline->binary_bo->ptr.gpu + + builder->stages[i].shader_offset; + } void *rsd = pipeline->state_bo->ptr.cpu + builder->stages[i].rsd_offset; mali_ptr gpu_rsd = pipeline->state_bo->ptr.gpu + builder->stages[i].rsd_offset;