diff options
author | Faith Ekstrand <faith.ekstrand@collabora.com> | 2023-08-02 11:36:41 -0500 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-08-04 21:32:07 +0000 |
commit | af72961ff175978e5983a65f9187333dfb1548db (patch) | |
tree | 45a2f1c9ffdf378892aa17b043bf7269fafe5850 | |
parent | 733d20277c7878d8c0411f25f49298eed9be0ccd (diff) |
nvk: Rework memory requirements to handle aspects correctly
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
-rw-r--r-- | src/nouveau/vulkan/nvk_image.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index 72ead0897c7..e95e6237dca 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -620,26 +620,19 @@ nvk_image_plane_add_req(struct nvk_image_plane *plane, *size_B += plane->nil.size_B; } -VKAPI_ATTR void VKAPI_CALL -nvk_GetImageMemoryRequirements2(VkDevice device, - const VkImageMemoryRequirementsInfo2 *pInfo, - VkMemoryRequirements2 *pMemoryRequirements) +static void +nvk_get_image_memory_requirements(struct nvk_device *dev, + struct nvk_image *image, + VkImageAspectFlags aspects, + VkMemoryRequirements2 *pMemoryRequirements) { - VK_FROM_HANDLE(nvk_device, dev, device); - VK_FROM_HANDLE(nvk_image, image, pInfo->image); - uint32_t memory_types = (1 << dev->pdev->mem_type_cnt) - 1; // TODO hope for the best? - VkImageAspectFlags aspects = image->vk.aspects; - uint64_t size_B = 0; uint32_t align_B = 0; if (image->disjoint) { - const VkImagePlaneMemoryRequirementsInfo *plane_memory_req_info = - vk_find_struct_const(pInfo->pNext, IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO); - aspects = plane_memory_req_info->planeAspect; uint8_t plane = nvk_image_aspects_to_plane(image, aspects); nvk_image_plane_add_req(&image->planes[plane], &size_B, &align_B); } else { @@ -674,6 +667,23 @@ nvk_GetImageMemoryRequirements2(VkDevice device, } } +VKAPI_ATTR void VKAPI_CALL +nvk_GetImageMemoryRequirements2(VkDevice device, + const VkImageMemoryRequirementsInfo2 *pInfo, + VkMemoryRequirements2 *pMemoryRequirements) +{ + VK_FROM_HANDLE(nvk_device, dev, device); + VK_FROM_HANDLE(nvk_image, image, pInfo->image); + + const VkImagePlaneMemoryRequirementsInfo *plane_info = + vk_find_struct_const(pInfo->pNext, IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO); + const VkImageAspectFlags aspects = + image->disjoint ? plane_info->planeAspect : image->vk.aspects; + + nvk_get_image_memory_requirements(dev, image, aspects, + pMemoryRequirements); +} + VKAPI_ATTR void VKAPI_CALL nvk_GetDeviceImageMemoryRequirements(VkDevice device, const VkDeviceImageMemoryRequirementsKHR *pInfo, @@ -686,12 +696,12 @@ nvk_GetDeviceImageMemoryRequirements(VkDevice device, result = nvk_image_init(dev, &image, pInfo->pCreateInfo); assert(result == VK_SUCCESS); - VkImageMemoryRequirementsInfo2 info2 = { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, - .image = nvk_image_to_handle(&image), - }; + const VkImageAspectFlags aspects = + image.disjoint ? pInfo->planeAspect : image.vk.aspects; + + nvk_get_image_memory_requirements(dev, &image, aspects, + pMemoryRequirements); - nvk_GetImageMemoryRequirements2(device, &info2, pMemoryRequirements); nvk_image_finish(dev, &image, NULL); } |