summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-14 19:21:35 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-14 19:21:35 -0400
commitd7ce568e2baacc68424eae4adbb98ac5b126af21 (patch)
tree854851ef1e5382f28c4943153a20deacf5bd7a00
parent7a81e1a2c5344252319fad13adffcf3e68518e6e (diff)
expose TransferBuffer helpers
-rw-r--r--src/window.cpp32
-rw-r--r--src/window.hpp2
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 */