diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-05 10:54:46 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-05 10:54:46 -0500 |
| commit | 6b0f3cb77bf46ebc4d4e6f538c53fadba8f56f90 (patch) | |
| tree | bbbed5ecb1789dd1bda91db7304d1c38b637e3bb /src/window.cpp | |
| parent | 78ca2865441df428228d158796c346e1df75d302 (diff) | |
pke: refactor ui buffer creation
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 132 |
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) { |
