From 763fa8f45afc8ac3e4348bc59922486c250ba7fd Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Mon, 11 Mar 2024 12:07:17 +0100 Subject: [PATCH] panvk: Move image related definitions to panvk_image.{h,c} Move GetImageMemoryRequirements2(), GetImageSparseMemoryRequirements2() and BindImageMemory2() implementations to panvk_image.c, so we have all image related functions where they belong, and create a panvk_image.h header for the panvk_image struct definition. Signed-off-by: Boris Brezillon Acked-by: Erik Faye-Lund Reviewed-by: Mary Guillemard Reviewed-by: Rebecca Mckeever Part-of: --- src/panfrost/vulkan/panvk_device.c | 68 +----------------- src/panfrost/vulkan/panvk_image.c | 72 ++++++++++++++++++- src/panfrost/vulkan/panvk_image.h | 27 +++++++ src/panfrost/vulkan/panvk_private.h | 17 ----- src/panfrost/vulkan/panvk_vX_cmd_buffer.c | 1 + src/panfrost/vulkan/panvk_vX_descriptor_set.c | 1 + src/panfrost/vulkan/panvk_vX_device.c | 1 + src/panfrost/vulkan/panvk_vX_image.c | 2 + src/panfrost/vulkan/panvk_vX_meta_blit.c | 1 + src/panfrost/vulkan/panvk_vX_meta_clear.c | 1 + src/panfrost/vulkan/panvk_vX_meta_copy.c | 1 + 11 files changed, 107 insertions(+), 85 deletions(-) create mode 100644 src/panfrost/vulkan/panvk_image.h diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index ff30568ea5d..ce0a869a9dc 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -26,6 +26,7 @@ * DEALINGS IN THE SOFTWARE. */ +#include "panvk_image.h" #include "panvk_private.h" #include "decode.h" @@ -1573,30 +1574,6 @@ panvk_GetBufferMemoryRequirements2(VkDevice device, pMemoryRequirements->memoryRequirements.size = size; } -VKAPI_ATTR void VKAPI_CALL -panvk_GetImageMemoryRequirements2(VkDevice device, - const VkImageMemoryRequirementsInfo2 *pInfo, - VkMemoryRequirements2 *pMemoryRequirements) -{ - VK_FROM_HANDLE(panvk_image, image, pInfo->image); - - const uint64_t alignment = 4096; - const uint64_t size = panvk_image_get_total_size(image); - - pMemoryRequirements->memoryRequirements.memoryTypeBits = 1; - pMemoryRequirements->memoryRequirements.alignment = alignment; - pMemoryRequirements->memoryRequirements.size = size; -} - -VKAPI_ATTR void VKAPI_CALL -panvk_GetImageSparseMemoryRequirements2( - VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, - uint32_t *pSparseMemoryRequirementCount, - VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) -{ - panvk_stub(); -} - VKAPI_ATTR void VKAPI_CALL panvk_GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) @@ -1643,49 +1620,6 @@ panvk_BindBufferMemory2(VkDevice device, uint32_t bindInfoCount, return VK_SUCCESS; } -VKAPI_ATTR VkResult VKAPI_CALL -panvk_BindImageMemory2(VkDevice device, uint32_t bindInfoCount, - const VkBindImageMemoryInfo *pBindInfos) -{ - for (uint32_t i = 0; i < bindInfoCount; ++i) { - VK_FROM_HANDLE(panvk_image, image, pBindInfos[i].image); - VK_FROM_HANDLE(panvk_device_memory, mem, pBindInfos[i].memory); - struct pan_kmod_bo *old_bo = image->bo; - - assert(mem); - image->bo = pan_kmod_bo_get(mem->bo); - image->pimage.data.base = mem->addr.dev; - image->pimage.data.offset = pBindInfos[i].memoryOffset; - /* Reset the AFBC headers */ - if (drm_is_afbc(image->pimage.layout.modifier)) { - /* Transient CPU mapping */ - void *base = pan_kmod_bo_mmap(mem->bo, 0, pan_kmod_bo_size(mem->bo), - PROT_WRITE, MAP_SHARED, NULL); - - assert(base != MAP_FAILED); - - for (unsigned layer = 0; layer < image->pimage.layout.array_size; - layer++) { - for (unsigned level = 0; level < image->pimage.layout.nr_slices; - level++) { - void *header = base + image->pimage.data.offset + - (layer * image->pimage.layout.array_stride) + - image->pimage.layout.slices[level].offset; - memset(header, 0, - image->pimage.layout.slices[level].afbc.header_size); - } - } - - ASSERTED int ret = os_munmap(base, pan_kmod_bo_size(mem->bo)); - assert(!ret); - } - - pan_kmod_bo_put(old_bo); - } - - return VK_SUCCESS; -} - VKAPI_ATTR VkResult VKAPI_CALL panvk_CreateEvent(VkDevice _device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c index a95da1589f9..0b52f63d2fb 100644 --- a/src/panfrost/vulkan/panvk_image.c +++ b/src/panfrost/vulkan/panvk_image.c @@ -28,6 +28,7 @@ #include "pan_props.h" +#include "panvk_image.h" #include "panvk_private.h" #include "drm-uapi/drm_fourcc.h" @@ -37,7 +38,9 @@ #include "vk_object.h" #include "vk_util.h" -unsigned +#define PANVK_MAX_PLANES 1 + +static unsigned panvk_image_get_total_size(const struct panvk_image *image) { assert(util_format_get_num_planes(image->pimage.layout.format) == 1); @@ -269,6 +272,73 @@ panvk_DestroyImageView(VkDevice _device, VkImageView _view, vk_image_view_destroy(&device->vk, pAllocator, &view->vk); } +VKAPI_ATTR void VKAPI_CALL +panvk_GetImageMemoryRequirements2(VkDevice device, + const VkImageMemoryRequirementsInfo2 *pInfo, + VkMemoryRequirements2 *pMemoryRequirements) +{ + VK_FROM_HANDLE(panvk_image, image, pInfo->image); + + const uint64_t alignment = 4096; + const uint64_t size = panvk_image_get_total_size(image); + + pMemoryRequirements->memoryRequirements.memoryTypeBits = 1; + pMemoryRequirements->memoryRequirements.alignment = alignment; + pMemoryRequirements->memoryRequirements.size = size; +} + +VKAPI_ATTR void VKAPI_CALL +panvk_GetImageSparseMemoryRequirements2( + VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, + uint32_t *pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) +{ + panvk_stub(); +} + +VKAPI_ATTR VkResult VKAPI_CALL +panvk_BindImageMemory2(VkDevice device, uint32_t bindInfoCount, + const VkBindImageMemoryInfo *pBindInfos) +{ + for (uint32_t i = 0; i < bindInfoCount; ++i) { + VK_FROM_HANDLE(panvk_image, image, pBindInfos[i].image); + VK_FROM_HANDLE(panvk_device_memory, mem, pBindInfos[i].memory); + struct pan_kmod_bo *old_bo = image->bo; + + assert(mem); + image->bo = pan_kmod_bo_get(mem->bo); + image->pimage.data.base = mem->addr.dev; + image->pimage.data.offset = pBindInfos[i].memoryOffset; + /* Reset the AFBC headers */ + if (drm_is_afbc(image->pimage.layout.modifier)) { + /* Transient CPU mapping */ + void *base = pan_kmod_bo_mmap(mem->bo, 0, pan_kmod_bo_size(mem->bo), + PROT_WRITE, MAP_SHARED, NULL); + + assert(base != MAP_FAILED); + + for (unsigned layer = 0; layer < image->pimage.layout.array_size; + layer++) { + for (unsigned level = 0; level < image->pimage.layout.nr_slices; + level++) { + void *header = base + image->pimage.data.offset + + (layer * image->pimage.layout.array_stride) + + image->pimage.layout.slices[level].offset; + memset(header, 0, + image->pimage.layout.slices[level].afbc.header_size); + } + } + + ASSERTED int ret = os_munmap(base, pan_kmod_bo_size(mem->bo)); + assert(!ret); + } + + pan_kmod_bo_put(old_bo); + } + + return VK_SUCCESS; +} + VKAPI_ATTR void VKAPI_CALL panvk_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) diff --git a/src/panfrost/vulkan/panvk_image.h b/src/panfrost/vulkan/panvk_image.h new file mode 100644 index 00000000000..3789facae38 --- /dev/null +++ b/src/panfrost/vulkan/panvk_image.h @@ -0,0 +1,27 @@ +/* + * Copyright © 2021 Collabora Ltd. + * SPDX-License-Identifier: MIT + */ + +#ifndef PANVK_IMAGE_H +#define PANVK_IMAGE_H + +#include "vk_image.h" + +#include "pan_texture.h" + +struct panvk_image { + struct vk_image vk; + + /* TODO: See if we can rework the synchronization logic so we don't need to + * pass BOs around. + */ + struct pan_kmod_bo *bo; + + struct pan_image pimage; +}; + +VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image, vk.base, VkImage, + VK_OBJECT_TYPE_IMAGE) + +#endif diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index 30008548e31..7c31af846d1 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -932,21 +932,6 @@ struct panvk_pipeline { VkRect2D scissor; }; -#define PANVK_MAX_PLANES 1 - -struct panvk_image { - struct vk_image vk; - - /* TODO: See if we can rework the synchronization logic so we don't need to - * pass BOs around. - */ - struct pan_kmod_bo *bo; - - struct pan_image pimage; -}; - -unsigned panvk_image_get_total_size(const struct panvk_image *image); - #define TEXTURE_DESC_WORDS 8 #define ATTRIB_BUF_DESC_WORDS 4 @@ -1003,8 +988,6 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_descriptor_set_layout, vk.base, VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_device_memory, vk.base, VkDeviceMemory, VK_OBJECT_TYPE_DEVICE_MEMORY) VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_event, base, VkEvent, VK_OBJECT_TYPE_EVENT) -VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image, vk.base, VkImage, - VK_OBJECT_TYPE_IMAGE) VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_image_view, vk.base, VkImageView, VK_OBJECT_TYPE_IMAGE_VIEW); VK_DEFINE_NONDISP_HANDLE_CASTS(panvk_pipeline, base, VkPipeline, diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index b5fddbb4377..59d329909fe 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -29,6 +29,7 @@ #include "genxml/gen_macros.h" #include "panvk_cs.h" +#include "panvk_image.h" #include "panvk_private.h" #include "pan_blitter.h" diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 1f6768ea186..ad42ae68b11 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -27,6 +27,7 @@ #include "genxml/gen_macros.h" +#include "panvk_image.h" #include "panvk_private.h" #include diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index 85487db1c32..b6b8bf0ba7f 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -31,6 +31,7 @@ #include "decode.h" #include "panvk_cs.h" +#include "panvk_image.h" #include "panvk_private.h" #include "vk_drm_syncobj.h" diff --git a/src/panfrost/vulkan/panvk_vX_image.c b/src/panfrost/vulkan/panvk_vX_image.c index 68f1b84a83d..cd3610f8c23 100644 --- a/src/panfrost/vulkan/panvk_vX_image.c +++ b/src/panfrost/vulkan/panvk_vX_image.c @@ -27,6 +27,8 @@ */ #include "genxml/gen_macros.h" + +#include "panvk_image.h" #include "panvk_private.h" #include "drm-uapi/drm_fourcc.h" diff --git a/src/panfrost/vulkan/panvk_vX_meta_blit.c b/src/panfrost/vulkan/panvk_vX_meta_blit.c index 63ea5f2b30c..42c1539e0a7 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_blit.c +++ b/src/panfrost/vulkan/panvk_vX_meta_blit.c @@ -26,6 +26,7 @@ #include "pan_blitter.h" #include "pan_props.h" +#include "panvk_image.h" #include "panvk_private.h" static void diff --git a/src/panfrost/vulkan/panvk_vX_meta_clear.c b/src/panfrost/vulkan/panvk_vX_meta_clear.c index 9f010190935..93ee5067b54 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_clear.c +++ b/src/panfrost/vulkan/panvk_vX_meta_clear.c @@ -27,6 +27,7 @@ #include "pan_props.h" #include "pan_shader.h" +#include "panvk_image.h" #include "panvk_private.h" #include "panvk_vX_meta.h" diff --git a/src/panfrost/vulkan/panvk_vX_meta_copy.c b/src/panfrost/vulkan/panvk_vX_meta_copy.c index c38af52e9ad..57afb24a060 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_copy.c +++ b/src/panfrost/vulkan/panvk_vX_meta_copy.c @@ -28,6 +28,7 @@ #include "pan_props.h" #include "pan_shader.h" +#include "panvk_image.h" #include "panvk_private.h" static mali_ptr