diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-06-10 15:25:21 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-06-10 15:25:21 -0400 |
| commit | e478bae42cf886a12433331937887de4c4e85ce2 (patch) | |
| tree | d30dc725f17c7348de6a1974919632aaf60ada40 /src/window.cpp | |
| parent | 2506c1af519ed14836986ecf2674636fa8b37947 (diff) | |
pke: separate 2d and glyph passes
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 140 |
1 files changed, 124 insertions, 16 deletions
diff --git a/src/window.cpp b/src/window.cpp index 4cab2b4..1211476 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -135,6 +135,15 @@ struct PKVK_2D { VkDeviceMemory images_memory_color_resolve; } pkvk_2d; +struct PKVK_Glyph { + VkImage *images = nullptr; + VkImageView *image_views = nullptr; + VkDeviceMemory images_memory; + VkImage *images_color_resolve = nullptr; + VkImageView *image_views_color_resolve = nullptr; + VkDeviceMemory images_memory_color_resolve; +} pkvk_glyph; + UniformBufferObject UBO{ .model = glm::mat4(1), .view = glm::lookAt(glm::vec3(0), glm::vec3(2, 2, 0), glm::vec3(0, 1, 0)), @@ -1244,6 +1253,10 @@ void CreateSwapchain() { assert(pkvk_2d.image_views == nullptr || pkvk_2d.image_views == CAFE_BABE(VkImageView)); assert(pkvk_2d.images_color_resolve == nullptr || pkvk_2d.images_color_resolve == CAFE_BABE(VkImage)); assert(pkvk_2d.image_views_color_resolve == nullptr || pkvk_2d.image_views_color_resolve == CAFE_BABE(VkImageView)); + assert(pkvk_glyph.images == nullptr || pkvk_glyph.images == CAFE_BABE(VkImage)); + assert(pkvk_glyph.image_views == nullptr || pkvk_glyph.image_views == CAFE_BABE(VkImageView)); + assert(pkvk_glyph.images_color_resolve == nullptr || pkvk_glyph.images_color_resolve == CAFE_BABE(VkImage)); + assert(pkvk_glyph.image_views_color_resolve == nullptr || pkvk_glyph.image_views_color_resolve == CAFE_BABE(VkImageView)); prevSwapchainLength = swapchainLength; vkResult = vkGetSwapchainImagesKHR(vkDevice, vkSwapchainKHR, &swapchainLength, nullptr); @@ -1313,6 +1326,11 @@ void CreateSwapchain() { pkvk_2d.image_views = pk_new<VkImageView>(swapchainLength, MemBkt_Vulkan); CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, pkvk_2d.images, pkvk_2d.image_views, &pkvk_2d.images_memory); + // 2d glyph color (fragment) images + pkvk_glyph.images = pk_new<VkImage>(swapchainLength, MemBkt_Vulkan); + pkvk_glyph.image_views = pk_new<VkImageView>(swapchainLength, MemBkt_Vulkan); + CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, pkvk_glyph.images, pkvk_glyph.image_views, &pkvk_glyph.images_memory); + // resolve settings renderTargetImageCI.samples = VK_SAMPLE_COUNT_1_BIT; renderTargetImageCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; @@ -1327,6 +1345,11 @@ void CreateSwapchain() { pkvk_2d.image_views_color_resolve = pk_new<VkImageView>(swapchainLength, MemBkt_Vulkan); CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, pkvk_2d.images_color_resolve, pkvk_2d.image_views_color_resolve, &pkvk_2d.images_memory_color_resolve); + // 2d glyph color (resolve) + pkvk_glyph.images_color_resolve = pk_new<VkImage>(swapchainLength, MemBkt_Vulkan); + pkvk_glyph.image_views_color_resolve = pk_new<VkImageView>(swapchainLength, MemBkt_Vulkan); + CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, pkvk_glyph.images_color_resolve, pkvk_glyph.image_views_color_resolve, &pkvk_glyph.images_memory_color_resolve); + // depth settings renderTargetImageCI.samples = global_sample_count; renderTargetImageCI.format = depthFormat; @@ -1341,9 +1364,10 @@ void CreateSwapchain() { } void UpdatePresentDescriptorSets() { - VkWriteDescriptorSet *writeDescriptorSets = pk_new<VkWriteDescriptorSet>(swapchainLength * 2, pkeSettings.mem_bkt.game_transient); - VkDescriptorImageInfo *descriptorImageInfo = pk_new<VkDescriptorImageInfo>(swapchainLength * 2, pkeSettings.mem_bkt.game_transient); - for (long i = 0; i < swapchainLength * 2; ++i) { + const unsigned int sub_pass_count = 3; + VkWriteDescriptorSet *writeDescriptorSets = pk_new<VkWriteDescriptorSet>(swapchainLength * sub_pass_count, pkeSettings.mem_bkt.game_transient); + VkDescriptorImageInfo *descriptorImageInfo = pk_new<VkDescriptorImageInfo>(swapchainLength * sub_pass_count, pkeSettings.mem_bkt.game_transient); + for (long i = 0; i < swapchainLength * sub_pass_count; ++i) { writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeDescriptorSets[i].pNext = nullptr; writeDescriptorSets[i].dstBinding = 0U; @@ -1358,11 +1382,12 @@ void UpdatePresentDescriptorSets() { writeDescriptorSets[i].pImageInfo = &descriptorImageInfo[i]; } for (long i = 0; i < swapchainLength; ++i) { - descriptorImageInfo[(i * 2)].imageView = pkvk_3d.image_views_color_resolve[i]; - descriptorImageInfo[(i * 2) + 1].imageView = pkvk_2d.image_views_color_resolve[i]; + descriptorImageInfo[(i * sub_pass_count) + 0].imageView = pkvk_3d.image_views_color_resolve[i]; + descriptorImageInfo[(i * sub_pass_count) + 1].imageView = pkvk_2d.image_views_color_resolve[i]; + descriptorImageInfo[(i * sub_pass_count) + 2].imageView = pkvk_glyph.image_views_color_resolve[i]; } - vkUpdateDescriptorSets(vkDevice, swapchainLength * 2, writeDescriptorSets, 0, nullptr); + vkUpdateDescriptorSets(vkDevice, swapchainLength * sub_pass_count, writeDescriptorSets, 0, nullptr); } void UpdateCamera() { @@ -1573,31 +1598,31 @@ void CreatePresentPipeline() { VkDescriptorPoolSize vkDescriptorPoolSize; vkDescriptorPoolSize.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - vkDescriptorPoolSize.descriptorCount = swapchainLength * 2; + vkDescriptorPoolSize.descriptorCount = swapchainLength * 3; VkDescriptorPoolCreateInfo descriptorPoolCreateInfo; descriptorPoolCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; descriptorPoolCreateInfo.pNext = nullptr; descriptorPoolCreateInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - descriptorPoolCreateInfo.maxSets = swapchainLength * 2; + descriptorPoolCreateInfo.maxSets = swapchainLength * 3; descriptorPoolCreateInfo.poolSizeCount = 1; descriptorPoolCreateInfo.pPoolSizes = &vkDescriptorPoolSize; vkResult = vkCreateDescriptorPool(vkDevice, &descriptorPoolCreateInfo, vkAllocator, &pkvk_present.descriptor_pool); assert(vkResult == VK_SUCCESS); - VkDescriptorSetLayout *setLayouts = pk_new<VkDescriptorSetLayout>(swapchainLength * 2, pkeSettings.mem_bkt.game_transient); - for (long i = 0; i < swapchainLength * 2; ++i) { + VkDescriptorSetLayout *setLayouts = pk_new<VkDescriptorSetLayout>(swapchainLength * 3, pkeSettings.mem_bkt.game_transient); + for (long i = 0; i < swapchainLength * 3; ++i) { setLayouts[i] = pkvk_present.descriptor_set_layout; } VkDescriptorSetAllocateInfo allocInfo; allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; allocInfo.pNext = nullptr; allocInfo.descriptorPool = pkvk_present.descriptor_pool; - allocInfo.descriptorSetCount = swapchainLength * 2; + allocInfo.descriptorSetCount = swapchainLength * 3; allocInfo.pSetLayouts = setLayouts; - pkvk_present.descriptor_sets = pk_new<VkDescriptorSet>(swapchainLength * 2, MemBkt_Vulkan); + pkvk_present.descriptor_sets = pk_new<VkDescriptorSet>(swapchainLength * 3, MemBkt_Vulkan); vkResult = vkAllocateDescriptorSets(vkDevice, &allocInfo, pkvk_present.descriptor_sets); // setLayouts = CAFE_BABE(VkDescriptorSetLayout); if (vkResult != VK_SUCCESS) { @@ -3220,6 +3245,51 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { vkCmdDrawIndexed(commandBuffer, ui_gr->index_count, ui_gr->instance_counter, 0, 0, 0); } + vkCmdEndRendering(commandBuffer); + } + + // 2d glyph + { + // color + pkvk_transition_image_layout( + commandBuffer, pkvk_glyph.images[imageIndex], + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + range + ); + // color resolve + pkvk_transition_image_layout( + commandBuffer, pkvk_glyph.images_color_resolve[imageIndex], + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + range + ); + + color_attachments[1].imageView = pkvk_glyph.image_views[imageIndex]; + color_attachments[1].clearValue = clearTransparent; + color_attachments[1].resolveMode = VK_RESOLVE_MODE_AVERAGE_BIT; // TODO verify + color_attachments[1].resolveImageView = pkvk_glyph.image_views_color_resolve[imageIndex]; + color_attachments[1].resolveImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + // skip [0], since we have a resolve on this pass + renderingInfo.colorAttachmentCount = 1; + renderingInfo.pColorAttachments = &color_attachments.at(1); + renderingInfo.pDepthAttachment = VK_NULL_HANDLE; + renderingInfo.pStencilAttachment = VK_NULL_HANDLE; + + vkCmdBeginRendering(commandBuffer, &renderingInfo); + + vkCmdSetViewport(commandBuffer, 0, 1, &viewport); + vkCmdSetScissor(commandBuffer, 0, 1, &scissor); + // 2d - font glyphs FontTypeIndex count; FontType *fts = FontType_GetFonts(count); @@ -3282,6 +3352,18 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { range ); + // 2d glyph color + pkvk_transition_image_layout( + commandBuffer, pkvk_glyph.images_color_resolve[imageIndex], + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + range + ); + color_attachments[0].imageView = pkvk_present.image_views[imageIndex]; color_attachments[0].clearValue = clearBlack; @@ -3300,11 +3382,15 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { // reminder that present.vert is a triangle // 3d - vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkvk_present.pipeline_layout, 0, 1, &pkvk_present.descriptor_sets[(imageIndex * 2)], 0, nullptr); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkvk_present.pipeline_layout, 0, 1, &pkvk_present.descriptor_sets[(imageIndex * 3)], 0, nullptr); vkCmdDraw(commandBuffer, 3, 1, 0, 0); // 2d - vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkvk_present.pipeline_layout, 0, 1, &pkvk_present.descriptor_sets[(imageIndex * 2) + 1], 0, nullptr); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkvk_present.pipeline_layout, 0, 1, &pkvk_present.descriptor_sets[(imageIndex * 3) + 1], 0, nullptr); + vkCmdDraw(commandBuffer, 3, 1, 0, 0); + + // 2d glyph + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkvk_present.pipeline_layout, 0, 1, &pkvk_present.descriptor_sets[(imageIndex * 3) + 2], 0, nullptr); vkCmdDraw(commandBuffer, 3, 1, 0, 0); // ImGui @@ -3389,8 +3475,8 @@ void DestroyPresentPipeline() { } if (pkvk_present.descriptor_sets != nullptr && pkvk_present.descriptor_sets != CAFE_BABE(VkDescriptorSet)) { - vkFreeDescriptorSets(vkDevice, pkvk_present.descriptor_pool, prevSwapchainLength * 2, pkvk_present.descriptor_sets); - pk_delete<VkDescriptorSet>(pkvk_present.descriptor_sets, prevSwapchainLength * 2, MemBkt_Vulkan); + vkFreeDescriptorSets(vkDevice, pkvk_present.descriptor_pool, prevSwapchainLength * 3, pkvk_present.descriptor_sets); + pk_delete<VkDescriptorSet>(pkvk_present.descriptor_sets, prevSwapchainLength * 3, MemBkt_Vulkan); pkvk_present.descriptor_sets = CAFE_BABE(VkDescriptorSet); } @@ -3412,6 +3498,28 @@ void DestroySwapchain() { depthImages = CAFE_BABE(VkImage); vkFreeMemory(vkDevice, depthImagesMemory, vkAllocator); } + if (pkvk_glyph.image_views != nullptr && pkvk_glyph.image_views != CAFE_BABE(VkImageView)) { + for (long i = 0; i < swapchainLength; ++i) { + vkDestroyImageView(vkDevice, pkvk_glyph.image_views[i], vkAllocator); + vkDestroyImage(vkDevice, pkvk_glyph.images[i], vkAllocator); + } + pk_delete<VkImageView>(pkvk_glyph.image_views, swapchainLength, MemBkt_Vulkan); + pkvk_glyph.image_views = CAFE_BABE(VkImageView); + pk_delete<VkImage>(pkvk_glyph.images, swapchainLength, MemBkt_Vulkan); + pkvk_glyph.images = CAFE_BABE(VkImage); + vkFreeMemory(vkDevice, pkvk_glyph.images_memory, vkAllocator); + } + if (pkvk_glyph.image_views_color_resolve != nullptr && pkvk_glyph.image_views_color_resolve != CAFE_BABE(VkImageView)) { + for (long i = 0; i < swapchainLength; ++i) { + vkDestroyImageView(vkDevice, pkvk_glyph.image_views_color_resolve[i], vkAllocator); + vkDestroyImage(vkDevice, pkvk_glyph.images_color_resolve[i], vkAllocator); + } + pk_delete<VkImageView>(pkvk_glyph.image_views_color_resolve, swapchainLength, MemBkt_Vulkan); + pkvk_glyph.image_views_color_resolve = CAFE_BABE(VkImageView); + pk_delete<VkImage>(pkvk_glyph.images_color_resolve, swapchainLength, MemBkt_Vulkan); + pkvk_glyph.images_color_resolve = CAFE_BABE(VkImage); + vkFreeMemory(vkDevice, pkvk_glyph.images_memory_color_resolve, vkAllocator); + } if (pkvk_2d.image_views != nullptr && pkvk_2d.image_views != CAFE_BABE(VkImageView)) { for (long i = 0; i < swapchainLength; ++i) { vkDestroyImageView(vkDevice, pkvk_2d.image_views[i], vkAllocator); |
