summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-06-10 15:25:21 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-06-10 15:25:21 -0400
commite478bae42cf886a12433331937887de4c4e85ce2 (patch)
treed30dc725f17c7348de6a1974919632aaf60ada40 /src
parent2506c1af519ed14836986ecf2674636fa8b37947 (diff)
pke: separate 2d and glyph passes
Diffstat (limited to 'src')
-rw-r--r--src/window.cpp140
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);