diff options
| -rw-r--r-- | src/window.cpp | 32 | ||||
| -rw-r--r-- | src/window.hpp | 2 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp index e806d02..084f5c2 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -110,6 +110,38 @@ unsigned int FindMemoryTypeIndex(uint32_t typeFilter, VkMemoryPropertyFlags memP return 0; } +void BeginTransferBuffer(VkDeviceSize requestedMemorySize, VkBuffer &buffer, VkDeviceMemory &deviceMemory, void *&deviceData) { + VkBufferCreateInfo transferBufferCI; + transferBufferCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + transferBufferCI.pNext = nullptr; + transferBufferCI.flags = 0; + transferBufferCI.size = requestedMemorySize; + transferBufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + transferBufferCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + transferBufferCI.queueFamilyIndexCount = 1; + transferBufferCI.pQueueFamilyIndices = &transferFamilyIndex; + vkCreateBuffer(vkDevice, &transferBufferCI, vkAllocator, &buffer); + + VkMemoryRequirements memoryRequirements; + vkGetBufferMemoryRequirements(vkDevice, buffer, &memoryRequirements); + + VkMemoryAllocateInfo transferMemAllocInfo; + transferMemAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + transferMemAllocInfo.pNext = nullptr; + transferMemAllocInfo.allocationSize = memoryRequirements.size; + transferMemAllocInfo.memoryTypeIndex = FindMemoryTypeIndex(memoryRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + vkAllocateMemory(vkDevice, &transferMemAllocInfo, vkAllocator, &deviceMemory); + + vkBindBufferMemory(vkDevice, buffer, deviceMemory, 0); + vkMapMemory(vkDevice, deviceMemory, 0, transferMemAllocInfo.allocationSize, 0, &deviceData); +} + +void EndTransferBuffer(VkBuffer &buffer, VkDeviceMemory &deviceMemory) { + vkUnmapMemory(vkDevice, deviceMemory); + vkDestroyBuffer(vkDevice, buffer, vkAllocator); + vkFreeMemory(vkDevice, deviceMemory, vkAllocator); +} + unsigned int FindQueueFamilyIndex(VkPhysicalDevice device, short hasPresentSupport = -1, VkQueueFlagBits includeBits = (VkQueueFlagBits)0U, VkQueueFlagBits excludeBits = (VkQueueFlagBits)0U) { if (hasPresentSupport == -1 && includeBits == 0 && excludeBits == 0) { diff --git a/src/window.hpp b/src/window.hpp index ff9e677..ce79dd5 100644 --- a/src/window.hpp +++ b/src/window.hpp @@ -47,5 +47,7 @@ VkShaderModule UploadShader(AssetHandle handle); void Render(); unsigned int FindMemoryTypeIndex(uint32_t typeFilter, VkMemoryPropertyFlags memPropertyFlags); +void BeginTransferBuffer(VkDeviceSize requestedMemorySize, VkBuffer &buffer, VkDeviceMemory &deviceMemory, void *&deviceData); +void EndTransferBuffer(VkBuffer &buffer, VkDeviceMemory &deviceMemory); #endif /* PKE_WINDOW_HPP */ |
