diff options
Diffstat (limited to 'src/frygon/vulkan/fgvk_image.c')
| -rw-r--r-- | src/frygon/vulkan/fgvk_image.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/frygon/vulkan/fgvk_image.c b/src/frygon/vulkan/fgvk_image.c new file mode 100644 index 00000000000..39129a31d48 --- /dev/null +++ b/src/frygon/vulkan/fgvk_image.c @@ -0,0 +1,113 @@ +/* + * Copyright © 2025 Lucas Francisco Fryzek + * SPDX-License-Identifier: MIT + */ +#include "fgvk_image.h" + +#include "fgvk_device.h" + +VKAPI_ATTR VkResult VKAPI_CALL +fgvk_CreateImage(VkDevice _device, + const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkImage *pImage) +{ + VK_FROM_HANDLE(fgvk_device, dev, _device); + struct fgvk_image *image; + + image = vk_zalloc2(&dev->vk.alloc, pAllocator, sizeof(*image), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!image) + return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); + + vk_image_init(&dev->vk, &image->vk, pCreateInfo); + + *pImage = fgvk_image_to_handle(image); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +fgvk_DestroyImage(VkDevice device, + VkImage _image, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(fgvk_device, dev, device); + VK_FROM_HANDLE(fgvk_image, image, _image); + + if (!image) + return; + + vk_free2(&dev->vk.alloc, pAllocator, image); +} + +VKAPI_ATTR void VKAPI_CALL +fgvk_GetImageMemoryRequirements2(VkDevice device, + const VkImageMemoryRequirementsInfo2 *pInfo, + VkMemoryRequirements2 *pMemoryRequirements) +{ + VK_FROM_HANDLE(fgvk_device, dev, device); + VK_FROM_HANDLE(fgvk_image, image, pInfo->image); + + pMemoryRequirements->memoryRequirements.memoryTypeBits = 1; + pMemoryRequirements->memoryRequirements.alignment = 8; + pMemoryRequirements->memoryRequirements.size = 4*1024*1024; +} + +static VkResult +fgvk_bind_image_memory(struct fgvk_device *dev, + const VkBindImageMemoryInfo *info) +{ + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +fgvk_BindImageMemory2(VkDevice device, + uint32_t bindInfoCount, + const VkBindImageMemoryInfo *pBindInfos) +{ + VK_FROM_HANDLE(fgvk_device, dev, device); + VkResult first_error_or_success = VK_SUCCESS; + + for (uint32_t i = 0; i < bindInfoCount; ++i) { + VkResult result = fgvk_bind_image_memory(dev, &pBindInfos[i]); + + const VkBindMemoryStatusKHR *status = + vk_find_struct_const(pBindInfos[i].pNext, BIND_MEMORY_STATUS_KHR); + if (status != NULL && status->pResult != NULL) + *status->pResult = VK_SUCCESS; + + if (first_error_or_success == VK_SUCCESS) + first_error_or_success = result; + } + + return first_error_or_success; +} + +static void +fgvk_get_image_subresource_layout(struct fgvk_device *dev, + struct fgvk_image *image, + const VkImageSubresource2KHR *pSubresource, + VkSubresourceLayout2KHR *pLayout) +{ + const VkImageSubresource *isr = &pSubresource->imageSubresource; + pLayout->subresourceLayout = (VkSubresourceLayout) { + .offset = 0, + .size = image->vk.extent.width * image->vk.extent.height * 4, + .rowPitch = image->vk.extent.width * 4, + .arrayPitch = image->vk.extent.width * image->vk.extent.height * 4, + .depthPitch = 0, + }; +} + +VKAPI_ATTR void VKAPI_CALL +fgvk_GetImageSubresourceLayout2KHR(VkDevice device, + VkImage _image, + const VkImageSubresource2KHR *pSubresource, + VkSubresourceLayout2KHR *pLayout) +{ + VK_FROM_HANDLE(fgvk_device, dev, device); + VK_FROM_HANDLE(fgvk_image, image, _image); + + fgvk_get_image_subresource_layout(dev, image, pSubresource, pLayout); +} |