/* * 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; }