summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-05 11:43:32 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-03-05 11:43:32 -0500
commit2204437ea7a4b00c13d24e2221378b9f44366861 (patch)
treed234f9046ce45964b4a91101bbb09b2261abe137 /src
parent6b0f3cb77bf46ebc4d4e6f538c53fadba8f56f90 (diff)
pke: refactor font buffer creation
Diffstat (limited to 'src')
-rw-r--r--src/font.cpp378
-rw-r--r--src/font.hpp16
-rw-r--r--src/window.cpp15
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);