summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Huang <shawn.p.huang@gmail.com>2022-12-11 16:07:06 -0500
committerEric Engestrom <eric@engestrom.ch>2022-12-14 20:47:02 +0000
commit3e3def9620017b83b8032d4ed20b3419cf0e6513 (patch)
tree7831a5d7515f01c221c542cd1fe9988877dacece
parent0c7a3133ac6a7746ee9856a6ad4c5b7835dc858c (diff)
downloadmesa-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.json2
-rw-r--r--src/intel/vulkan/anv_image.c15
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);
}