diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 8a41fdd7e67..8ebc58f5117 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -2189,8 +2189,22 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetDeviceImageMemoryRequirements( if (lvp_CreateImage(_device, pInfo->pCreateInfo, NULL, &_image) != VK_SUCCESS) return; LVP_FROM_HANDLE(lvp_image, image, _image); - pMemoryRequirements->memoryRequirements.size = image->size; - pMemoryRequirements->memoryRequirements.alignment = image->alignment; + + /* Per spec VUs of VkImageMemoryRequirementsInfo2 */ + const bool need_plane_info = + image->vk.create_flags & VK_IMAGE_CREATE_DISJOINT_BIT && + (image->plane_count > 1 || + image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT); + const VkImagePlaneMemoryRequirementsInfo plane_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, + .planeAspect = pInfo->planeAspect, + }; + const VkImageMemoryRequirementsInfo2 base_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, + .pNext = need_plane_info ? &plane_info : NULL, + .image = _image, + }; + lvp_GetImageMemoryRequirements2(_device, &base_info, pMemoryRequirements); lvp_DestroyImage(_device, _image, NULL); }