summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-05 10:54:46 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-03-05 10:54:46 -0500
commit6b0f3cb77bf46ebc4d4e6f538c53fadba8f56f90 (patch)
treebbbed5ecb1789dd1bda91db7304d1c38b637e3bb /src/window.cpp
parent78ca2865441df428228d158796c346e1df75d302 (diff)
pke: refactor ui buffer creation
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp
index ea1deb5..c0b72da 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -284,6 +284,138 @@ void PKVK_EndBuffer(PKVK_TmpBufferDetails &tmpBufferDetails, PKVK_TmpBufferFlags
tmpBufferDetails = {};
}
+void pkvk_buffer_create(pkvk_buffer_create_data *data, pkvk_buffer_create_data_out *out) {
+ pk_arr arr_vert_mem_reqs;
+ memset(&arr_vert_mem_reqs, 0, sizeof(pk_arr));
+ arr_vert_mem_reqs.alignment = alignof(VkMemoryRequirements);
+ arr_vert_mem_reqs.stride = sizeof(VkMemoryRequirements);
+ arr_vert_mem_reqs.bkt = pkeSettings.mem.bkt;
+
+ /*
+ * buffer setup
+ */
+ VkBuffer tmpBuffer;
+ VkBufferCreateInfo bufferCI;
+ bufferCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ bufferCI.pNext = nullptr;
+ bufferCI.flags = {};
+ bufferCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ bufferCI.queueFamilyIndexCount = 1;
+ bufferCI.pQueueFamilyIndices = &graphicsFamilyIndex;
+
+ for (uint8_t i = 0; i < data->n_buffers; ++i) {
+ bufferCI.size = data->buffer_byte_length[i];
+ if (i == data->index_index) {
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
+ } else if (i == data->index_instance) {
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ } else {
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ }
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &tmpBuffer);
+ VkMemoryRequirements tmp;
+ vkGetBufferMemoryRequirements(vkDevice, tmpBuffer, &tmp);
+ if (i == data->index_instance) {
+ out->memory_requirements_instance = tmp;
+ } else {
+ pk_arr_append(&arr_vert_mem_reqs, &tmp);
+ }
+ vkDestroyBuffer(vkDevice, tmpBuffer, vkAllocator);
+ }
+ CalculateCombinedMemReqs(arr_vert_mem_reqs.next, (VkMemoryRequirements*)arr_vert_mem_reqs.data, out->memory_requirements_vertex);
+
+ /*
+ * memory allocation
+ */
+
+ VkMemoryAllocateInfo vkMemoryAllocateInfo;
+ vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ vkMemoryAllocateInfo.pNext = nullptr;
+
+ // verts
+ vkMemoryAllocateInfo.allocationSize = out->memory_requirements_vertex.size;
+ vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(out->memory_requirements_vertex.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &out->device_memory_vertex);
+
+ // inst
+ vkMemoryAllocateInfo.allocationSize = out->memory_requirements_instance.size;
+ vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(out->memory_requirements_instance.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &out->device_memory_instance);
+
+ // data transfer
+ PKVK_TmpBufferDetails tmpBufferDetails{};
+ VkDeviceSize size = 0;
+ VkDeviceSize running_offset = 0;
+ VkDeviceSize alignment_padding = 0;
+ VkBufferCopy buffer_copy{};
+ buffer_copy.dstOffset = 0;
+
+ // vert
+ PKVK_BeginBuffer(transferFamilyIndex, out->memory_requirements_vertex.size, tmpBufferDetails);
+
+ VkCommandBufferBeginInfo vkCommandBufferBeginInfo;
+ vkCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ vkCommandBufferBeginInfo.pNext = nullptr;
+ // TODO consider single-use?
+ vkCommandBufferBeginInfo.flags = 0;
+ vkCommandBufferBeginInfo.pInheritanceInfo = nullptr;
+ vkBeginCommandBuffer(tmpBufferDetails.cmdBuffer, &vkCommandBufferBeginInfo);
+
+ for (uint8_t i = 0; i < data->n_buffers; ++i) {
+ size = data->buffer_byte_length[i];
+ if (i == data->index_instance) {
+ alignment_padding = size % out->memory_requirements_instance.alignment;
+ alignment_padding = alignment_padding == 0 ? 0 : out->memory_requirements_instance.alignment - alignment_padding;
+ } else {
+ alignment_padding = size % out->memory_requirements_vertex.alignment;
+ alignment_padding = alignment_padding == 0 ? 0 : out->memory_requirements_vertex.alignment - alignment_padding;
+ }
+ size += alignment_padding;
+
+ bufferCI.size = size;
+ if (i == data->index_index) {
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
+ } else if (i == data->index_instance) {
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ } else {
+ bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ }
+
+ vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &out->buffers[i]);
+ if (i == data->index_instance) {
+ vkBindBufferMemory(vkDevice, out->buffers[i], out->device_memory_instance, 0);
+ } else {
+ vkBindBufferMemory(vkDevice, out->buffers[i], out->device_memory_vertex, running_offset);
+ }
+
+ if (data->src_data[i] != nullptr) {
+ assert(tmpBufferDetails.deviceData != nullptr);
+ memcpy((char *)tmpBufferDetails.deviceData + running_offset, data->src_data[i], data->buffer_byte_length[i]);
+ buffer_copy.srcOffset = running_offset;
+ buffer_copy.size = data->buffer_byte_length[i];
+ running_offset += size;
+ vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, out->buffers[i], 1, &buffer_copy);
+ }
+ }
+
+ vkEndCommandBuffer(tmpBufferDetails.cmdBuffer);
+
+ VkSubmitInfo submit_info;
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.pNext = nullptr;
+ submit_info.waitSemaphoreCount = 0;
+ submit_info.pWaitSemaphores = nullptr;
+ submit_info.pWaitDstStageMask = nullptr;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &tmpBufferDetails.cmdBuffer;
+ submit_info.signalSemaphoreCount = 0;
+ submit_info.pSignalSemaphores = nullptr;
+ vkQueueSubmit(tmpBufferDetails.queue, 1, &submit_info, nullptr);
+ vkQueueWaitIdle(tmpBufferDetails.queue);
+
+ PKVK_EndBuffer(tmpBufferDetails);
+}
+
unsigned int FindQueueFamilyIndex(VkPhysicalDevice device, char hasPresentSupport = -1, VkQueueFlagBits includeBits = (VkQueueFlagBits)0U, VkQueueFlagBits excludeBits = (VkQueueFlagBits)0U) {
if (hasPresentSupport == -1 && includeBits == 0 && excludeBits == 0) {