diff options
author | Peng Huang <shawn.p.huang@gmail.com> | 2022-12-11 16:07:06 -0500 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2022-12-14 20:47:02 +0000 |
commit | 3e3def9620017b83b8032d4ed20b3419cf0e6513 (patch) | |
tree | 7831a5d7515f01c221c542cd1fe9988877dacece | |
parent | 0c7a3133ac6a7746ee9856a6ad4c5b7835dc858c (diff) | |
download | mesa-3e3def9620017b83b8032d4ed20b3419cf0e6513.tar.gz |
intel: Fix crashes for importing drm buffer
image_aspect_to_binding() converts aspect to index by subrracting
VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT, however these enum values
are bitfields, not consecutive numbers, so comparing and subtracting
them won't work.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20269>
(cherry picked from commit 7642f3b99c8b17c7cfa1f140c65ce82e7dbcea2b)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/intel/vulkan/anv_image.c | 15 |
2 files changed, 12 insertions, 5 deletions
diff --git a/.pick_status.json b/.pick_status.json index 976cbcd4da4..ac33add38aa 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -796,7 +796,7 @@ "description": "intel: Fix crashes for importing drm buffer", "nominated": false, "nomination_type": null, - "resolution": 4, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index f3d092381a1..7b1cba5c1b1 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -59,21 +59,28 @@ memory_range_end(struct anv_image_memory_range memory_range) static struct anv_image_binding * image_aspect_to_binding(struct anv_image *image, VkImageAspectFlags aspect) { - uint32_t plane; + uint32_t plane = 0; assert(image->disjoint); if (image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) { /* Spec requires special aspects for modifier images. */ - assert(aspect >= VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT && - aspect <= VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT); + assert(aspect == VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT || + aspect == VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT || + aspect == VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT || + aspect == VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT); /* We don't advertise DISJOINT for modifiers with aux, and therefore we * don't handle queries of the modifier's "aux plane" here. */ assert(!isl_drm_modifier_has_aux(image->vk.drm_format_mod)); - plane = aspect - VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT; + switch(aspect) { + case VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT: plane = 0; break; + case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT: plane = 1; break; + case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT: plane = 2; break; + case VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT: plane = 3; break; + } } else { plane = anv_image_aspect_to_plane(image, aspect); } |