About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/frygon/vulkan/fgvk_buffer.c
diff options
context:
space:
mode:
authorLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2025-11-24 19:39:30 -0500
committerLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2025-11-24 19:39:30 -0500
commitb5f3587df4048d2ba807721ff2faea8c8a43a93f (patch)
tree6913f730a41822b98fecd5e82b7cae46164fd9c0 /src/frygon/vulkan/fgvk_buffer.c
parent41c700fdbf1d79dfb571105ee93bfa46da6c8428 (diff)
Diffstat (limited to 'src/frygon/vulkan/fgvk_buffer.c')
-rw-r--r--src/frygon/vulkan/fgvk_buffer.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/frygon/vulkan/fgvk_buffer.c b/src/frygon/vulkan/fgvk_buffer.c
new file mode 100644
index 00000000000..f5b8f70758b
--- /dev/null
+++ b/src/frygon/vulkan/fgvk_buffer.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright © 2025 Lucas Francisco Fryzek
+ * SPDX-License-Identifier: MIT
+ */
+#include "fgvk_buffer.h"
+
+#include "fgvk_device.h"
+#include "fgvk_device_memory.h"
+
+VKAPI_ATTR VkResult VKAPI_CALL
+fgvk_CreateBuffer(VkDevice device,
+ const VkBufferCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkBuffer *pBuffer)
+{
+ VK_FROM_HANDLE(fgvk_device, dev, device);
+ struct fgvk_buffer *buffer;
+
+ buffer = vk_buffer_create(&dev->vk, pCreateInfo, pAllocator,
+ sizeof(*buffer));
+
+ if (!buffer)
+ return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
+
+ *pBuffer = fgvk_buffer_to_handle(buffer);
+
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL
+fgvk_DestroyBuffer(VkDevice device,
+ VkBuffer _buffer,
+ const VkAllocationCallbacks *pAllocator)
+{
+ VK_FROM_HANDLE(fgvk_device, dev, device);
+ VK_FROM_HANDLE(fgvk_buffer, buffer, _buffer);
+
+ if (!buffer)
+ return;
+
+ vk_buffer_destroy(&dev->vk, pAllocator, &buffer->vk);
+}
+
+VKAPI_ATTR void VKAPI_CALL
+fgvk_GetDeviceBufferMemoryRequirements(
+ VkDevice device,
+ const VkDeviceBufferMemoryRequirements *pInfo,
+ VkMemoryRequirements2 *pMemoryRequirements)
+{
+ pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
+ .size = align64(pInfo->pCreateInfo->size, 8),
+ .alignment = 8,
+ .memoryTypeBits = 1,
+ };
+}
+
+static VkResult
+fgvk_bind_buffer_memory(struct fgvk_device *dev,
+ const VkBindBufferMemoryInfo *info)
+{
+ VK_FROM_HANDLE(fgvk_device_memory, mem, info->memory);
+ VK_FROM_HANDLE(fgvk_buffer, buffer, info->buffer);
+ VkResult result = VK_SUCCESS;
+
+ return result;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+fgvk_BindBufferMemory2(VkDevice device,
+ uint32_t bindInfoCount,
+ const VkBindBufferMemoryInfo *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_buffer_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 = result;
+
+ if (first_error_or_success == VK_SUCCESS)
+ first_error_or_success = result;
+ }
+
+ return first_error_or_success;
+}