diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index 00624a7da4c..a9dceac47c3 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -800,7 +800,7 @@ nvk_get_image_memory_requirements(struct nvk_device *dev, uint64_t size_B = 0; uint32_t align_B = 0; if (image->disjoint) { - uint8_t plane = nvk_image_aspects_to_plane(image, aspects); + uint8_t plane = nvk_image_memory_aspects_to_plane(image, aspects); nvk_image_plane_add_req(&image->planes[plane], &size_B, &align_B); } else { for (unsigned plane = 0; plane < image->plane_count; plane++) @@ -986,7 +986,7 @@ nvk_get_image_subresource_layout(UNUSED struct nvk_device *dev, { const VkImageSubresource *isr = &pSubresource->imageSubresource; - const uint8_t p = nvk_image_aspects_to_plane(image, isr->aspectMask); + const uint8_t p = nvk_image_memory_aspects_to_plane(image, isr->aspectMask); const struct nvk_image_plane *plane = &image->planes[p]; uint64_t offset_B = 0; @@ -1096,7 +1096,7 @@ nvk_BindImageMemory2(VkDevice device, if (image->disjoint) { const VkBindImagePlaneMemoryInfo *plane_info = vk_find_struct_const(pBindInfos[i].pNext, BIND_IMAGE_PLANE_MEMORY_INFO); - uint8_t plane = nvk_image_aspects_to_plane(image, plane_info->planeAspect); + uint8_t plane = nvk_image_memory_aspects_to_plane(image, plane_info->planeAspect); nvk_image_plane_bind(dev, &image->planes[plane], mem, &offset_B); } else { for (unsigned plane = 0; plane < image->plane_count; plane++) { diff --git a/src/nouveau/vulkan/nvk_image.h b/src/nouveau/vulkan/nvk_image.h index 296d9096073..cca869266b4 100644 --- a/src/nouveau/vulkan/nvk_image.h +++ b/src/nouveau/vulkan/nvk_image.h @@ -96,6 +96,12 @@ static inline uint8_t nvk_image_aspects_to_plane(ASSERTED const struct nvk_image *image, VkImageAspectFlags aspectMask) { + /* Memory planes are only allowed for memory operations */ + assert(!(aspectMask & (VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT | + VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT | + VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT | + VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT))); + /* Verify that the aspects are actually in the image */ assert(!(aspectMask & ~image->vk.aspects)); @@ -111,4 +117,22 @@ nvk_image_aspects_to_plane(ASSERTED const struct nvk_image *image, } } +static inline uint8_t +nvk_image_memory_aspects_to_plane(ASSERTED const struct nvk_image *image, + VkImageAspectFlags aspectMask) +{ + if (aspectMask & (VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT | + VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT | + VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT | + VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT)) { + /* We don't support DRM format modifiers on anything but single-plane + * color at the moment. + */ + assert(aspectMask == VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT); + return 0; + } else { + return nvk_image_aspects_to_plane(image, aspectMask); + } +} + #endif