About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/frygon/vulkan/fgvk_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/frygon/vulkan/fgvk_image.c')
-rw-r--r--src/frygon/vulkan/fgvk_image.c113
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);
+}