diff options
author | Nanley Chery <nanley.g.chery@intel.com> | 2016-07-11 17:33:24 -0700 |
---|---|---|
committer | Nanley Chery <nanley.g.chery@intel.com> | 2016-07-15 10:35:40 -0700 |
commit | fd16e6432104389fa659bb1d011aa6fb82952737 (patch) | |
tree | 09e8a96d9651657f3c24fbd1f6c044a05a064085 /src/intel/vulkan | |
parent | 50a669de4e216d2e3bea3ec1148c7e79f77ecb27 (diff) | |
download | external_mesa3d-fd16e6432104389fa659bb1d011aa6fb82952737.zip external_mesa3d-fd16e6432104389fa659bb1d011aa6fb82952737.tar.gz external_mesa3d-fd16e6432104389fa659bb1d011aa6fb82952737.tar.bz2 |
anv/descriptor_set: Fix binding partly undefined descriptor sets
Section 13.2.3. of the Vulkan spec requires that implementations be able to
bind sparsely-defined Descriptor Sets without any errors or exceptions.
When binding a descriptor set that contains a dynamic buffer binding/descriptor,
the driver attempts to dereference the descriptor's buffer_view field if it is
non-NULL. It currently segfaults on undefined descriptors as this field is never
zero-initialized. Zero undefined descriptors to avoid segfaulting. This
solution was suggested by Jason Ekstrand.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96850
Cc: 12.0 <mesa-stable@lists.freedesktop.org>
Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Diffstat (limited to 'src/intel/vulkan')
-rw-r--r-- | src/intel/vulkan/anv_descriptor_set.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index 448ae0e..bd3ebed 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -409,6 +409,11 @@ anv_descriptor_set_create(struct anv_device *device, (struct anv_buffer_view *) &set->descriptors[layout->size]; set->buffer_count = layout->buffer_count; + /* By defining the descriptors to be zero now, we can later verify that + * a descriptor has not been populated with user data. + */ + memset(set->descriptors, 0, sizeof(struct anv_descriptor) * layout->size); + /* Go through and fill out immutable samplers if we have any */ struct anv_descriptor *desc = set->descriptors; for (uint32_t b = 0; b < layout->binding_count; b++) { |