diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-05 11:43:32 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-05 11:43:32 -0500 |
| commit | 2204437ea7a4b00c13d24e2221378b9f44366861 (patch) | |
| tree | d234f9046ce45964b4a91101bbb09b2261abe137 /src | |
| parent | 6b0f3cb77bf46ebc4d4e6f538c53fadba8f56f90 (diff) | |
pke: refactor font buffer creation
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.cpp | 378 | ||||
| -rw-r--r-- | src/font.hpp | 16 | ||||
| -rw-r--r-- | src/window.cpp | 15 |
3 files changed, 116 insertions, 293 deletions
diff --git a/src/font.cpp b/src/font.cpp index 62b39f7..cc4a897 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -257,12 +257,12 @@ void FontType_Tick(double delta) { if (pkeSettings.rt.was_framebuffer_resized == false && ft->gr.should_update_instance_buffer == false) { continue; } - if (ft->bindings.instanceCounter == 0) + if (ft->bindings.instance_counter == 0) continue; ft->gr.should_update_instance_buffer = false; // TODO specific bucket - fibis = pk_new<FontInstanceBufferItem>(ft->bindings.instanceCounter); + fibis = pk_new<FontInstanceBufferItem>(ft->bindings.instance_counter); for (FontRenderIndex_T k = 0; k < (FontRenderIndex_T)ft->h_render; ++k) { fr = &ft->renders[k]; FontType_Inner_CalcTransforms(ft, fr, &fibis[index]); @@ -270,7 +270,7 @@ void FontType_Tick(double delta) { } PKVK_TmpBufferDetails tmpBufferDetails{}; - PKVK_BeginBuffer(graphicsFamilyIndex, sizeof(FontInstanceBufferItem) * ft->bindings.instanceCounter, tmpBufferDetails); + PKVK_BeginBuffer(graphicsFamilyIndex, sizeof(FontInstanceBufferItem) * ft->bindings.instance_counter, tmpBufferDetails); { VkCommandBufferBeginInfo vkCommandBufferBeginInfo; vkCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; @@ -281,13 +281,13 @@ void FontType_Tick(double delta) { vkResult = vkBeginCommandBuffer(tmpBufferDetails.cmdBuffer, &vkCommandBufferBeginInfo); assert(vkResult == VK_SUCCESS); - memcpy(tmpBufferDetails.deviceData, fibis, sizeof(FontInstanceBufferItem) * ft->bindings.instanceCounter); + memcpy(tmpBufferDetails.deviceData, fibis, sizeof(FontInstanceBufferItem) * ft->bindings.instance_counter); VkBufferCopy vk_buffer_copy{}; vk_buffer_copy.srcOffset = 0; vk_buffer_copy.dstOffset = 0; - vk_buffer_copy.size = sizeof(FontInstanceBufferItem) * ft->bindings.instanceCounter; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.instanceBD.buffer, 1, &vk_buffer_copy); + vk_buffer_copy.size = sizeof(FontInstanceBufferItem) * ft->bindings.instance_counter; + vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.bd_instance.buffer, 1, &vk_buffer_copy); vkResult = vkEndCommandBuffer(tmpBufferDetails.cmdBuffer); assert(vkResult == VK_SUCCESS); @@ -308,7 +308,7 @@ void FontType_Tick(double delta) { assert(vkResult == VK_SUCCESS); } PKVK_EndBuffer(tmpBufferDetails); - pk_delete<FontInstanceBufferItem>(fibis, ft->bindings.instanceCounter); + pk_delete<FontInstanceBufferItem>(fibis, ft->bindings.instance_counter); } } @@ -460,17 +460,13 @@ FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle 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); pk_arr arr_texture_mem_reqs(arr_vert_mem_reqs); - VkDeviceSize index; - constexpr VkDeviceSize expectedBufferCount = 4; constexpr VkDeviceSize startingGlyphCount = 4; assert(fontTextureHandle != AssetHandle_MAX); assert(glyphsHandle != AssetHandle_MAX); assert(msdf_settings != nullptr); assert(spacing != nullptr); - VkMemoryRequirements combined_vert_mem_reqs; VkMemoryRequirements combined_texture_mem_reqs; const Asset *fontTexture = AM_Get(fontTextureHandle); @@ -509,65 +505,50 @@ FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle ft->atlas_size.x = (float)txtr_x; ft->atlas_size.y = (float)txtr_y; - /* - * 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) { - // atlas size - bufferCI.size = sizeof(glm::vec2) * 4; - } else if (idx == 3) { - // index - bufferCI.size = sizeof(uint16_t) * 6; - } - if (idx == 3) { - 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::vec4); // fgColor - bufferCI.size += sizeof(glm::vec4); // bgColor - bufferCI.size += sizeof(glm::vec2); // sprite_region_min - bufferCI.size += sizeof(glm::vec2); // sprite_region_max - bufferCI.size += sizeof(float); // width - bufferCI.size *= startingGlyphCount; - 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); + glm::vec2 atlas_size_buffer[4]; + for (int i = 0; i < 4; ++i) { + atlas_size_buffer[i] = ft->atlas_size; } + + 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(atlas_size_buffer[0]) * 4; + create_data.buffer_byte_length[3] = sizeof(pkeIntrinsicsPlane.index[0]) * 6; + create_data.buffer_byte_length[4] = sizeof(FontInstanceBufferItem); + create_data.src_data[0] = &pkeIntrinsicsPlane.vert; + create_data.src_data[1] = &pkeIntrinsicsPlane.uv; + create_data.src_data[2] = &atlas_size_buffer; + create_data.src_data[3] = &pkeIntrinsicsPlane.index; + create_data.src_data[4] = nullptr; + create_data.n_buffers = 5; + create_data.index_index = 3; + create_data.index_instance = 4; + + pkvk_buffer_create_data_out out{}; + pkvk_buffer_create(&create_data, &out); + + ft->bindings.bd_vertex.buffer = out.buffers[0]; + ft->bindings.bd_vertex.firstBinding = 0; + ft->bindings.bd_vertex.bindingCount = 1; + ft->bindings.bd_uv.buffer = out.buffers[1]; + ft->bindings.bd_uv.firstBinding = 1; + ft->bindings.bd_uv.bindingCount = 1; + ft->bindings.bd_atlas_size.buffer = out.buffers[2]; + ft->bindings.bd_atlas_size.firstBinding = 2; + ft->bindings.bd_atlas_size.bindingCount = 1; + ft->bindings.bd_index.buffer = out.buffers[3]; + ft->bindings.bd_index.firstBinding = 0; + ft->bindings.bd_index.bindingCount = 1; + ft->bindings.index_count = 6; + ft->bindings.bd_instance.buffer = out.buffers[4]; + ft->bindings.bd_instance.firstBinding = 3; + ft->bindings.bd_instance.bindingCount = 1; + ft->gr.deviceMemoryVert = out.device_memory_vertex; + ft->gr.deviceMemoryInst = out.device_memory_instance; + + ft->bindings.instance_buffer_max_count = out.memory_requirements_instance.size / sizeof(FontInstanceBufferItem); + // texture VkImageCreateInfo imageCreateInfo{}; VkImageSubresourceRange vkImageSubresourceRange; @@ -616,12 +597,6 @@ FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle 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, &ft->gr.deviceMemoryVert); - // texture CalculateCombinedMemReqs(arr_texture_mem_reqs.next, (VkMemoryRequirements*)arr_texture_mem_reqs.data, combined_texture_mem_reqs); // assert(combined_texture_mem_reqs.size == fontTexture->size && "Size of image texture shouldn't change?"); @@ -632,160 +607,6 @@ FontTypeIndex FontType_RegisterFont(pk_cstr title, AssetHandle fontTextureHandle } vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &ft->gr.deviceMemoryTexture); - /* - * 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; - ft->bindings.vertexBD.firstBinding = index; - ft->bindings.vertexBD.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, &ft->bindings.vertexBD.buffer); - vkBindBufferMemory(vkDevice, ft->bindings.vertexBD.buffer, ft->gr.deviceMemoryVert, offsetVert); - runningOffset += sizeVert; - index += 1; - - // uv - uint32_t offsetUV = runningOffset; - uint32_t sizeUV = sizeof(pkeIntrinsicsPlane.uv[0]) * 4; - ft->bindings.uvBD.firstBinding = index; - ft->bindings.uvBD.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, &ft->bindings.uvBD.buffer); - vkBindBufferMemory(vkDevice, ft->bindings.uvBD.buffer, ft->gr.deviceMemoryVert, offsetUV); - runningOffset += sizeUV; - index += 1; - - // atlas_size - uint32_t offsetAtlasSize = runningOffset; - uint32_t sizeAtlasSize = sizeof(ft->atlas_size) * 4; - ft->bindings.atlasSizeBD.firstBinding = index; - ft->bindings.atlasSizeBD.bindingCount = 1; - alignmentPadding = sizeAtlasSize % combined_vert_mem_reqs.alignment; - alignmentPadding = alignmentPadding == 0 ? 0 : combined_vert_mem_reqs.alignment - alignmentPadding; - sizeAtlasSize += alignmentPadding; - bufferCI.size = sizeAtlasSize; - vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &ft->bindings.atlasSizeBD.buffer); - vkBindBufferMemory(vkDevice, ft->bindings.atlasSizeBD.buffer, ft->gr.deviceMemoryVert, offsetAtlasSize); - runningOffset += sizeAtlasSize; - index += 1; - - // 2023-09-27 - JCB - // I don't know where else to put this - ft->bindings.instanceBD.firstBinding = index; - ft->bindings.instanceBD.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; - ft->bindings.indexBD.bindingCount = 1; - ft->bindings.indexCount = 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, &ft->bindings.indexBD.buffer); - vkBindBufferMemory(vkDevice, ft->bindings.indexBD.buffer, ft->gr.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; - - glm::vec2 atlas_size_buffer[4]; - for (int i = 0; i < 4; ++i) { - atlas_size_buffer[i] = ft->atlas_size; - } - dstPtr = static_cast<char *>(tmpBufferDetails.deviceData) + runningOffset; - srcPtr = reinterpret_cast<char *>(atlas_size_buffer); - memcpy(dstPtr, srcPtr, sizeAtlasSize); - runningOffset += sizeAtlasSize; - - 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, ft->bindings.vertexBD.buffer, 1, &bufferCopys[index]); - index+=1; - - bufferCopys[index].srcOffset = offsetUV; - bufferCopys[index].size = sizeUV; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.uvBD.buffer, 1, &bufferCopys[index]); - index+=1; - - bufferCopys[index].srcOffset = offsetAtlasSize; - bufferCopys[index].size = sizeAtlasSize; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.atlasSizeBD.buffer, 1, &bufferCopys[index]); - index+=1; - - bufferCopys[index].srcOffset = offsetIndex; - bufferCopys[index].size = sizeIndex; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.indexBD.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); // texture // transition image layout and copy to buffer tmpBufferDetails = {}; PKVK_BeginBuffer(transferFamilyIndex, combined_texture_mem_reqs.size, tmpBufferDetails); @@ -1013,42 +834,42 @@ void FontType_Unload(FontTypeIndex idx) { ft->gr.vkDescriptorPool = VK_NULL_HANDLE; } - if (ft->bindings.vertexBD.buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vkDevice, ft->bindings.vertexBD.buffer, vkAllocator); - ft->bindings.vertexBD.buffer = VK_NULL_HANDLE; - ft->bindings.vertexBD.firstBinding = 0; - ft->bindings.vertexBD.bindingCount = 0; - ft->bindings.vertexBD.offsets[0] = 0; - - if (ft->bindings.uvBD.buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vkDevice, ft->bindings.uvBD.buffer, vkAllocator); - ft->bindings.uvBD.buffer = VK_NULL_HANDLE; - ft->bindings.uvBD.firstBinding = 0; - ft->bindings.uvBD.bindingCount = 0; - ft->bindings.uvBD.offsets[0] = 0; - - if (ft->bindings.atlasSizeBD.buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vkDevice, ft->bindings.atlasSizeBD.buffer, vkAllocator); - ft->bindings.atlasSizeBD.buffer = VK_NULL_HANDLE; - ft->bindings.atlasSizeBD.firstBinding = 0; - ft->bindings.atlasSizeBD.bindingCount = 0; - ft->bindings.atlasSizeBD.offsets[0] = 0; - - if (ft->bindings.indexBD.buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vkDevice, ft->bindings.indexBD.buffer, vkAllocator); - ft->bindings.indexBD.buffer = VK_NULL_HANDLE; - ft->bindings.indexBD.bindingCount = 0; - ft->bindings.indexBD.offsets[0] = 0; - ft->bindings.indexCount = 0; - - if (ft->bindings.instanceBD.buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vkDevice, ft->bindings.instanceBD.buffer, vkAllocator); - ft->bindings.instanceBD.buffer = VK_NULL_HANDLE; - ft->bindings.instanceBD.firstBinding = 0; - ft->bindings.instanceBD.bindingCount = 0; - ft->bindings.instanceCounter = 0; - ft->bindings.instanceLength = 0; - ft->bindings.instanceBD.offsets[0] = 0; + if (ft->bindings.bd_vertex.buffer != VK_NULL_HANDLE) + vkDestroyBuffer(vkDevice, ft->bindings.bd_vertex.buffer, vkAllocator); + ft->bindings.bd_vertex.buffer = VK_NULL_HANDLE; + ft->bindings.bd_vertex.firstBinding = 0; + ft->bindings.bd_vertex.bindingCount = 0; + ft->bindings.bd_vertex.offsets[0] = 0; + + if (ft->bindings.bd_uv.buffer != VK_NULL_HANDLE) + vkDestroyBuffer(vkDevice, ft->bindings.bd_uv.buffer, vkAllocator); + ft->bindings.bd_uv.buffer = VK_NULL_HANDLE; + ft->bindings.bd_uv.firstBinding = 0; + ft->bindings.bd_uv.bindingCount = 0; + ft->bindings.bd_uv.offsets[0] = 0; + + if (ft->bindings.bd_atlas_size.buffer != VK_NULL_HANDLE) + vkDestroyBuffer(vkDevice, ft->bindings.bd_atlas_size.buffer, vkAllocator); + ft->bindings.bd_atlas_size.buffer = VK_NULL_HANDLE; + ft->bindings.bd_atlas_size.firstBinding = 0; + ft->bindings.bd_atlas_size.bindingCount = 0; + ft->bindings.bd_atlas_size.offsets[0] = 0; + + if (ft->bindings.bd_index.buffer != VK_NULL_HANDLE) + vkDestroyBuffer(vkDevice, ft->bindings.bd_index.buffer, vkAllocator); + ft->bindings.bd_index.buffer = VK_NULL_HANDLE; + ft->bindings.bd_index.bindingCount = 0; + ft->bindings.bd_index.offsets[0] = 0; + ft->bindings.index_count = 0; + + if (ft->bindings.bd_instance.buffer != VK_NULL_HANDLE) + vkDestroyBuffer(vkDevice, ft->bindings.bd_instance.buffer, vkAllocator); + ft->bindings.bd_instance.buffer = VK_NULL_HANDLE; + ft->bindings.bd_instance.firstBinding = 0; + ft->bindings.bd_instance.bindingCount = 0; + ft->bindings.instance_counter = 0; + ft->bindings.instance_buffer_max_count = 0; + ft->bindings.bd_instance.offsets[0] = 0; if (ft->gr.textureImageView != VK_NULL_HANDLE) vkDestroyImageView(vkDevice, ft->gr.textureImageView, vkAllocator); @@ -1153,12 +974,12 @@ FontRenderHandle FontType_AddStringRender(FontTypeIndex idx_ft, const pk_str str } } - VkDeviceSize item_count_orig = ft->bindings.instanceCounter; - VkDeviceSize item_length_new = PK_MAX(ft->bindings.instanceLength, ft->bindings.instanceCounter + count); + VkDeviceSize item_count_orig = ft->bindings.instance_counter; + VkDeviceSize item_length_new = PK_MAX(ft->bindings.instance_buffer_max_count, ft->bindings.instance_counter + count); // copy existing buffer to new buffer // create new buffer - if (ft->bindings.instanceLength != item_length_new) { + if (ft->bindings.instance_buffer_max_count < item_length_new) { byteCount = sizeof(FontInstanceBufferItem) * item_length_new; VkBuffer newBuffer; VkBufferCreateInfo bufferCI; @@ -1197,7 +1018,7 @@ FontRenderHandle FontType_AddStringRender(FontTypeIndex idx_ft, const pk_str str vkResult = vkBindBufferMemory(vkDevice, newBuffer, new_memory, 0); assert(vkResult == VK_SUCCESS); - if (ft->bindings.instanceBD.buffer != VK_NULL_HANDLE) { + if (ft->bindings.bd_instance.buffer != VK_NULL_HANDLE && ft->bindings.instance_counter > 0) { PKVK_BeginBuffer(transferFamilyIndex, byteCount, tmpBufferDetails, PKVK_TmpBufferFlags_NONE); VkCommandBufferBeginInfo vkCommandBufferBeginInfo; @@ -1212,8 +1033,9 @@ FontRenderHandle FontType_AddStringRender(FontTypeIndex idx_ft, const pk_str str VkBufferCopy vk_buffer_copy{}; vk_buffer_copy.srcOffset = 0; vk_buffer_copy.dstOffset = 0; - vk_buffer_copy.size = sizeof(FontInstanceBufferItem) * ft->bindings.instanceCounter; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, ft->bindings.instanceBD.buffer, newBuffer, 1, &vk_buffer_copy); + vk_buffer_copy.size = sizeof(FontInstanceBufferItem) * ft->bindings.instance_counter; + assert(vk_buffer_copy.size != 0); + vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, ft->bindings.bd_instance.buffer, newBuffer, 1, &vk_buffer_copy); vkResult = vkEndCommandBuffer(tmpBufferDetails.cmdBuffer); assert(vkResult == VK_SUCCESS); @@ -1235,16 +1057,16 @@ FontRenderHandle FontType_AddStringRender(FontTypeIndex idx_ft, const pk_str str PKVK_EndBuffer(tmpBufferDetails, PKVK_TmpBufferFlags_NONE); } - if (ft->bindings.instanceBD.buffer != VK_NULL_HANDLE) - vkDestroyBuffer(vkDevice, ft->bindings.instanceBD.buffer, vkAllocator); + if (ft->bindings.bd_instance.buffer != VK_NULL_HANDLE) + vkDestroyBuffer(vkDevice, ft->bindings.bd_instance.buffer, vkAllocator); if (ft->gr.deviceMemoryInst != VK_NULL_HANDLE) vkFreeMemory(vkDevice, ft->gr.deviceMemoryInst, vkAllocator); ft->gr.deviceMemoryInst = new_memory; - ft->bindings.instanceBD.buffer = newBuffer; + ft->bindings.bd_instance.buffer = newBuffer; } - ft->bindings.instanceLength = item_length_new; - ft->bindings.instanceCounter += count; + ft->bindings.instance_buffer_max_count = item_length_new; + ft->bindings.instance_counter += count; // create tmp local buffer & copy data to graphics card byteCount = sizeof(FontInstanceBufferItem) * count; @@ -1266,7 +1088,7 @@ FontRenderHandle FontType_AddStringRender(FontTypeIndex idx_ft, const pk_str str vk_buffer_copy.srcOffset = 0; vk_buffer_copy.dstOffset = sizeof(FontInstanceBufferItem) * item_count_orig; vk_buffer_copy.size = sizeof(FontInstanceBufferItem) * count; - vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.instanceBD.buffer, 1, &vk_buffer_copy); + vkCmdCopyBuffer(tmpBufferDetails.cmdBuffer, tmpBufferDetails.buffer, ft->bindings.bd_instance.buffer, 1, &vk_buffer_copy); vkResult = vkEndCommandBuffer(tmpBufferDetails.cmdBuffer); assert(vkResult == VK_SUCCESS); @@ -1299,7 +1121,7 @@ void FontType_RemoveStringRender(FontRenderHandle handle) { ft->gr.should_update_instance_buffer = true; fr = &ft->renders[(FontRenderIndex_T)handle.index_fr]; - ft->bindings.instanceCounter -= fr->n_glyphs; + ft->bindings.instance_counter -= fr->n_glyphs; buffer_start_index = fr->buffer_start_index; fr->n_glyphs = 0; for (FontRenderIndex_T i = (FontRenderIndex_T)handle.index_fr + 1; FontRenderIndex{i} < ft->h_render; ++i) { diff --git a/src/font.hpp b/src/font.hpp index 3fff4ed..f935f94 100644 --- a/src/font.hpp +++ b/src/font.hpp @@ -92,14 +92,14 @@ struct FontType : public Entity_Base { bool should_update_instance_buffer; } gr; struct FontTypeBindings { - BufferBindingDetails vertexBD; - BufferBindingDetails uvBD; - BufferBindingDetails atlasSizeBD; - BufferBindingDetails indexBD; - BufferBindingDetails instanceBD; - uint32_t indexCount = 0; - uint32_t instanceCounter = 0; - uint32_t instanceLength = 0; + BufferBindingDetails bd_vertex; + BufferBindingDetails bd_uv; + BufferBindingDetails bd_atlas_size; + BufferBindingDetails bd_index; + BufferBindingDetails bd_instance; + uint32_t index_count = 0; + uint32_t instance_counter = 0; + uint32_t instance_buffer_max_count = 0; } bindings; }; diff --git a/src/window.cpp b/src/window.cpp index c0b72da..0cb9399 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -390,6 +390,7 @@ void pkvk_buffer_create(pkvk_buffer_create_data *data, pkvk_buffer_create_data_o if (data->src_data[i] != nullptr) { assert(tmpBufferDetails.deviceData != nullptr); + assert(data->buffer_byte_length[i] != 0); 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]; @@ -3056,19 +3057,19 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { for (FontTypeIndex i = FontTypeIndex{0}; i < count; ++i) { FontType *ft = &fts[(FontTypeIndex_T)i]; - if (ft->bindings.instanceCounter == 0) + if (ft->bindings.instance_counter == 0) continue; vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkePipelines.pipelines.named.font_glyph); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkePipelines.pipe_layouts.named.txtr, 0, 1, &ft->gr.vkDescriptorSet, 0, {}); - vkCmdBindIndexBuffer(commandBuffer, ft->bindings.indexBD.buffer, ft->bindings.indexBD.offsets[0], VK_INDEX_TYPE_UINT16); + vkCmdBindIndexBuffer(commandBuffer, ft->bindings.bd_index.buffer, ft->bindings.bd_index.offsets[0], VK_INDEX_TYPE_UINT16); - vkCmdBindVertexBuffers(commandBuffer, ft->bindings.vertexBD.firstBinding, ft->bindings.vertexBD.bindingCount, &ft->bindings.vertexBD.buffer, ft->bindings.vertexBD.offsets); - vkCmdBindVertexBuffers(commandBuffer, ft->bindings.uvBD.firstBinding, ft->bindings.uvBD.bindingCount, &ft->bindings.uvBD.buffer, ft->bindings.uvBD.offsets); - vkCmdBindVertexBuffers(commandBuffer, ft->bindings.atlasSizeBD.firstBinding, ft->bindings.atlasSizeBD.bindingCount, &ft->bindings.atlasSizeBD.buffer, ft->bindings.atlasSizeBD.offsets); - vkCmdBindVertexBuffers(commandBuffer, ft->bindings.instanceBD.firstBinding, ft->bindings.instanceBD.bindingCount, &ft->bindings.instanceBD.buffer, ft->bindings.instanceBD.offsets); + vkCmdBindVertexBuffers(commandBuffer, ft->bindings.bd_vertex.firstBinding, ft->bindings.bd_vertex.bindingCount, &ft->bindings.bd_vertex.buffer, ft->bindings.bd_vertex.offsets); + vkCmdBindVertexBuffers(commandBuffer, ft->bindings.bd_uv.firstBinding, ft->bindings.bd_uv.bindingCount, &ft->bindings.bd_uv.buffer, ft->bindings.bd_uv.offsets); + vkCmdBindVertexBuffers(commandBuffer, ft->bindings.bd_atlas_size.firstBinding, ft->bindings.bd_atlas_size.bindingCount, &ft->bindings.bd_atlas_size.buffer, ft->bindings.bd_atlas_size.offsets); + vkCmdBindVertexBuffers(commandBuffer, ft->bindings.bd_instance.firstBinding, ft->bindings.bd_instance.bindingCount, &ft->bindings.bd_instance.buffer, ft->bindings.bd_instance.offsets); - vkCmdDrawIndexed(commandBuffer, ft->bindings.indexCount, ft->bindings.instanceCounter, 0, 0, 0); + vkCmdDrawIndexed(commandBuffer, ft->bindings.index_count, ft->bindings.instance_counter, 0, 0, 0); } vkCmdEndRenderPass(commandBuffer); |
