From afb4cced5c3cd3a5f72b750283ac3dd15793508b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 31 Jan 2022 12:00:27 -0500 Subject: [PATCH] lavapipe: more descriptor validation Reviewed-by: Dave Airlie Part-of: --- .../frontends/lavapipe/lvp_descriptor_set.c | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c index 752964b5f9b..df134baf336 100644 --- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c +++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c @@ -171,6 +171,37 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDescriptorSetLayout( set_layout->shader_stages |= binding->stageFlags; } +#ifndef NDEBUG + /* this otherwise crashes later and is annoying to track down */ + unsigned array[] = { + VK_SHADER_STAGE_VERTEX_BIT, + VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, + VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, + VK_SHADER_STAGE_GEOMETRY_BIT, + VK_SHADER_STAGE_FRAGMENT_BIT, + VK_SHADER_STAGE_COMPUTE_BIT, + }; + for (unsigned i = 0; i <= MESA_SHADER_COMPUTE; i++) { + uint16_t const_buffer_count = 0; + uint16_t shader_buffer_count = 0; + uint16_t sampler_count = 0; + uint16_t sampler_view_count = 0; + uint16_t image_count = 0; + if (set_layout->shader_stages & array[i]) { + const_buffer_count += set_layout->stage[i].const_buffer_count; + shader_buffer_count += set_layout->stage[i].shader_buffer_count; + sampler_count += set_layout->stage[i].sampler_count; + sampler_view_count += set_layout->stage[i].sampler_view_count; + image_count += set_layout->stage[i].image_count; + } + assert(const_buffer_count <= device->physical_device->device_limits.maxPerStageDescriptorUniformBuffers); + assert(shader_buffer_count <= device->physical_device->device_limits.maxPerStageDescriptorStorageBuffers); + assert(sampler_count <= device->physical_device->device_limits.maxPerStageDescriptorSamplers); + assert(sampler_view_count <= device->physical_device->device_limits.maxPerStageDescriptorSampledImages); + assert(image_count <= device->physical_device->device_limits.maxPerStageDescriptorStorageImages); + } +#endif + free(bindings); set_layout->dynamic_offset_count = dynamic_offset_count;