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/static-ui.cpp | |
| parent | 78ca2865441df428228d158796c346e1df75d302 (diff) | |
pke: refactor ui buffer creation
Diffstat (limited to 'src/static-ui.cpp')
| -rw-r--r-- | src/static-ui.cpp | 241 |
1 files changed, 33 insertions, 208 deletions
diff --git a/src/static-ui.cpp b/src/static-ui.cpp index 7f930b4..8c8f920 100644 --- a/src/static-ui.cpp +++ b/src/static-ui.cpp @@ -39,214 +39,39 @@ void pke_ui_init() { } void pke_ui_init_bindings() { - PKVK_TmpBufferDetails tmpBufferDetails{}; - 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); - pk_arr arr_inst_mem_reqs(arr_vert_mem_reqs); - VkDeviceSize index; - constexpr VkDeviceSize expectedBufferCount = 3; - constexpr VkDeviceSize starting_ui_box_count = 4; - - VkMemoryRequirements combined_vert_mem_reqs; - - /* - * vulkan setup - */ - VkBuffer buffer; - 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; - - /* - * Vulkan resource setup - */ - // vertex - { - for (uint64_t idx = 0; idx < expectedBufferCount; ++idx) { - if (idx == 0) { - // vertex - bufferCI.size = sizeof(glm::vec2) * 4; - } else if (idx == 1) { - // uv - bufferCI.size = sizeof(glm::vec2) * 4; - } else if (idx == 2) { - // index - bufferCI.size = sizeof(uint16_t) * 6; - } - if (idx == 2) { - bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT; - } else { - bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; - } - vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &buffer); - VkMemoryRequirements tmp; - vkGetBufferMemoryRequirements(vkDevice, buffer, &tmp); - pk_arr_append(&arr_vert_mem_reqs, &tmp); - vkDestroyBuffer(vkDevice, buffer, vkAllocator); - } - } - // instance - { - bufferCI.size = 0; - bufferCI.size += sizeof(glm::vec2); // pos_scale - bufferCI.size += sizeof(glm::vec2); // px_scale - bufferCI.size += sizeof(float); // width - bufferCI.size += (sizeof(float) * 1); // padding - bufferCI.size *= starting_ui_box_count; - bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; - vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &buffer); - VkMemoryRequirements tmp; - vkGetBufferMemoryRequirements(vkDevice, buffer, &tmp); - pk_arr_append(&arr_inst_mem_reqs, &tmp); - vkDestroyBuffer(vkDevice, buffer, vkAllocator); - } - - /* - * Vulkan memory allocation - */ - - VkMemoryAllocateInfo vkMemoryAllocateInfo; - vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - vkMemoryAllocateInfo.pNext = nullptr; - - // verts - CalculateCombinedMemReqs(arr_vert_mem_reqs.next, (VkMemoryRequirements*)arr_vert_mem_reqs.data, combined_vert_mem_reqs); - vkMemoryAllocateInfo.allocationSize = combined_vert_mem_reqs.size; - vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(combined_vert_mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &pke_ui_master.bindings.deviceMemoryVert); - - /* - * Vulkan data transfer - */ - VkDeviceSize runningOffset = 0; - VkDeviceSize alignmentPadding = 0; - // vert - PKVK_BeginBuffer(transferFamilyIndex, combined_vert_mem_reqs.size, tmpBufferDetails); - { - index = 0; - runningOffset = 0; - - uint32_t offsetVert = runningOffset; - uint32_t sizeVert = sizeof(pkeIntrinsicsPlane.vert[0]) * 4; - pke_ui_master.bindings.bd_vertex.firstBinding = index; - pke_ui_master.bindings.bd_vertex.bindingCount = 1; - alignmentPadding = sizeVert % combined_vert_mem_reqs.alignment; - alignmentPadding = alignmentPadding == 0 ? 0 : combined_vert_mem_reqs.alignment - alignmentPadding; - sizeVert += alignmentPadding; - bufferCI.size = sizeVert; - bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; - vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &pke_ui_master.bindings.bd_vertex.buffer); - vkBindBufferMemory(vkDevice, pke_ui_master.bindings.bd_vertex.buffer, pke_ui_master.bindings.deviceMemoryVert, offsetVert); - runningOffset += sizeVert; - index += 1; - - // uv - uint32_t offsetUV = runningOffset; - uint32_t sizeUV = sizeof(pkeIntrinsicsPlane.uv[0]) * 4; - pke_ui_master.bindings.bd_uv.firstBinding = index; - pke_ui_master.bindings.bd_uv.bindingCount = 1; - alignmentPadding = sizeUV % combined_vert_mem_reqs.alignment; - alignmentPadding = alignmentPadding == 0 ? 0 : combined_vert_mem_reqs.alignment - alignmentPadding; - sizeUV += alignmentPadding; - bufferCI.size = sizeUV; - vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &pke_ui_master.bindings.bd_uv.buffer); - vkBindBufferMemory(vkDevice, pke_ui_master.bindings.bd_uv.buffer, pke_ui_master.bindings.deviceMemoryVert, offsetUV); - runningOffset += sizeUV; - index += 1; - - // 2023-09-27 - JCB - // I don't know where else to put this - pke_ui_master.bindings.bd_instance.firstBinding = index; - pke_ui_master.bindings.bd_instance.bindingCount = 1; - // no index += 1 because index just happens to be the right value here for - // the binding index, whereas binding the IndexBuffer doesn't need a binding index. - - // index - uint32_t offsetIndex = runningOffset; - uint32_t sizeIndex = sizeof(pkeIntrinsicsPlane.index[0]) * 6; - pke_ui_master.bindings.bd_index.bindingCount = 1; - pke_ui_master.bindings.index_count = 6; - alignmentPadding = sizeIndex % combined_vert_mem_reqs.alignment; - alignmentPadding = alignmentPadding == 0 ? 0 : combined_vert_mem_reqs.alignment - alignmentPadding; - sizeIndex += alignmentPadding; - bufferCI.size = sizeIndex; - bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT; - vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &pke_ui_master.bindings.bd_index.buffer); - vkBindBufferMemory(vkDevice, pke_ui_master.bindings.bd_index.buffer, pke_ui_master.bindings.deviceMemoryVert, offsetIndex); - runningOffset += sizeIndex; - // index += 1; - - assert(runningOffset == combined_vert_mem_reqs.size); - - runningOffset = 0; - - char *dstPtr = nullptr; - char *srcPtr = nullptr; - - dstPtr = static_cast<char *>(tmpBufferDetails.deviceData) + runningOffset; - srcPtr = reinterpret_cast<char *>(pkeIntrinsicsPlane.vert); - memcpy(dstPtr, srcPtr, sizeVert); - runningOffset += sizeVert; - - dstPtr = static_cast<char *>(tmpBufferDetails.deviceData) + runningOffset; - srcPtr = reinterpret_cast<char *>(pkeIntrinsicsPlane.uv); - memcpy(dstPtr, srcPtr, sizeUV); - runningOffset += sizeUV; - - dstPtr = static_cast<char *>(tmpBufferDetails.deviceData) + runningOffset; - srcPtr = reinterpret_cast<char *>(pkeIntrinsicsPlane.index); - memcpy(dstPtr, srcPtr, sizeIndex); - // runningOffset += sizeIndex; - - 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); - VkBufferCopy bufferCopys[expectedBufferCount]; - for (VkDeviceSize i = 0; i < expectedBufferCount; ++i) { - bufferCopys[i].dstOffset = 0; - } - index = 0; - bufferCopys[index].srcOffset = offsetVert; - bufferCopys[index].size = sizeVert; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, pke_ui_master.bindings.bd_vertex.buffer, 1, &bufferCopys[index]); - index+=1; - - bufferCopys[index].srcOffset = offsetUV; - bufferCopys[index].size = sizeUV; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, pke_ui_master.bindings.bd_uv.buffer, 1, &bufferCopys[index]); - index+=1; - - bufferCopys[index].srcOffset = offsetIndex; - bufferCopys[index].size = sizeIndex; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, pke_ui_master.bindings.bd_index.buffer, 1, &bufferCopys[index]); - // index+=1; - - vkEndCommandBuffer(tmpBufferDetails.cmdBuffer); - - VkSubmitInfo submitInfo; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.pNext = nullptr; - submitInfo.waitSemaphoreCount = 0; - submitInfo.pWaitSemaphores = nullptr; - submitInfo.pWaitDstStageMask = nullptr; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &tmpBufferDetails.cmdBuffer; - submitInfo.signalSemaphoreCount = 0; - submitInfo.pSignalSemaphores = nullptr; - vkQueueSubmit(tmpBufferDetails.queue, 1, &submitInfo, nullptr); - vkQueueWaitIdle(tmpBufferDetails.queue); - } - PKVK_EndBuffer(tmpBufferDetails); + pkvk_buffer_create_data create_data{}; + create_data.buffer_byte_length[0] = sizeof(pkeIntrinsicsPlane.vert[0]) * 4; + create_data.buffer_byte_length[1] = sizeof(pkeIntrinsicsPlane.uv[0]) * 4; + create_data.buffer_byte_length[2] = sizeof(pkeIntrinsicsPlane.index[0]) * 6; + create_data.buffer_byte_length[3] = sizeof(pke_ui_box_instance_buffer_item); + create_data.src_data[0] = &pkeIntrinsicsPlane.vert; + create_data.src_data[1] = &pkeIntrinsicsPlane.uv; + create_data.src_data[2] = &pkeIntrinsicsPlane.index; + create_data.src_data[3] = nullptr; + create_data.n_buffers = 4; + create_data.index_index = 2; + create_data.index_instance = 3; + + pkvk_buffer_create_data_out out{}; + pkvk_buffer_create(&create_data, &out); + + pke_ui_master.bindings.bd_vertex.buffer = out.buffers[0]; + pke_ui_master.bindings.bd_vertex.firstBinding = 0; + pke_ui_master.bindings.bd_vertex.bindingCount = 1; + pke_ui_master.bindings.bd_uv.buffer = out.buffers[1]; + pke_ui_master.bindings.bd_uv.firstBinding = 1; + pke_ui_master.bindings.bd_uv.bindingCount = 1; + pke_ui_master.bindings.bd_index.buffer = out.buffers[2]; + pke_ui_master.bindings.bd_index.firstBinding = 0; + pke_ui_master.bindings.bd_index.bindingCount = 1; + pke_ui_master.bindings.index_count = 6; + pke_ui_master.bindings.bd_instance.buffer = out.buffers[3]; + pke_ui_master.bindings.bd_instance.firstBinding = 2; + pke_ui_master.bindings.bd_instance.bindingCount = 1; + pke_ui_master.bindings.deviceMemoryVert = out.device_memory_vertex; + pke_ui_master.bindings.deviceMemoryInst = out.device_memory_instance; + + pke_ui_master.bindings.instance_buffer_max_count = out.memory_requirements_instance.size / sizeof(pke_ui_box_instance_buffer_item); } /* UI layout notes |
