summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-01-16 13:09:05 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-01-16 14:55:12 -0500
commit727c5e90798455703b88834aa864df94837e8956 (patch)
tree7e6b295c6a8242103cbbc8ff458b9aea777522ea /src/window.cpp
parentb4a4bf7e4211e3ee38659b498adb506ddabf5ab7 (diff)
chkpt: 2d overlay incomplete scaffolding
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp117
1 files changed, 109 insertions, 8 deletions
diff --git a/src/window.cpp b/src/window.cpp
index 20da693..215fd0d 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -77,10 +77,14 @@ VkDeviceMemory colorImagesMemory;
VkImage *depthImages = nullptr;
VkImageView *depthImageViews = nullptr;
VkDeviceMemory depthImagesMemory;
+VkImage *d2OverlayImages = nullptr;
+VkImageView *d2OverlayImageViews = nullptr;
+VkDeviceMemory d2OverlayImagesMemory;
VkSampler presentSampler;
VkSampleCountFlagBits renderSampleCount;
VkRenderPass presentRenderPass;
VkRenderPass renderRenderPass;
+VkRenderPass d2OverlayRenderPass;
VkDescriptorSetLayout vkDescriptorSetLayout;
VkDescriptorPool presentDescriptorPool;
VkDescriptorSet presentDescriptorSets[MAX_FRAMES_IN_FLIGHT];
@@ -88,6 +92,7 @@ VkPipelineLayout pipelineLayout;
VkPipeline graphicsPipeline;
VkFramebuffer *swapchainFramebuffers = nullptr;
VkFramebuffer *renderImageFramebuffers = nullptr;
+VkFramebuffer *d2OverlayImageFramebuffers = nullptr;
VkCommandPool transferCommandPool;
VkCommandBuffer transferCommandBuffer;
VkCommandPool graphicsCommandPool;
@@ -840,6 +845,8 @@ void CreateSwapchain() {
assert(colorImageViews == nullptr || colorImageViews == CAFE_BABE(VkImageView));
assert(depthImages == nullptr || depthImages == CAFE_BABE(VkImage));
assert(depthImageViews == nullptr || depthImageViews == CAFE_BABE(VkImageView));
+ assert(d2OverlayImages == nullptr || d2OverlayImages == CAFE_BABE(VkImage));
+ assert(d2OverlayImageViews == nullptr || d2OverlayImageViews == CAFE_BABE(VkImageView));
vkResult = vkGetSwapchainImagesKHR(vkDevice, vkSwapchainKHR, &swapchainLength, nullptr);
assert(vkResult == VK_SUCCESS);
@@ -886,6 +893,11 @@ void CreateSwapchain() {
renderTargetImageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, colorImages, colorImageViews, &colorImagesMemory);
+ // 2d overlay images
+ d2OverlayImages = pk_new<VkImage>(MAX_FRAMES_IN_FLIGHT);
+ d2OverlayImageViews = pk_new<VkImageView>(MAX_FRAMES_IN_FLIGHT);
+ CreateImageResources_Inner(&renderTargetImageCI, &vkImageViewCreateInfo, VkBufferUsageFlagBits(0), nullptr, d2OverlayImages, d2OverlayImageViews, &d2OverlayImagesMemory);
+
// depth images
depthImages = pk_new<VkImage>(MAX_FRAMES_IN_FLIGHT);
depthImageViews = pk_new<VkImageView>(MAX_FRAMES_IN_FLIGHT);
@@ -1028,6 +1040,45 @@ void CreateRenderPass() {
colorAttachment.samples = renderSampleCount;
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ VkAttachmentDescription colorAttachmentResolve{colorAttachment};
+ colorAttachmentResolve.samples = VK_SAMPLE_COUNT_1_BIT;
+ colorAttachmentResolve.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ colorAttachmentResolve.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ colorAttachmentResolve.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+
+ VkAttachmentReference colorAttachmentReseolveRef;
+ colorAttachmentReseolveRef.attachment = 1;
+ colorAttachmentReseolveRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
+ subpass.pColorAttachments = &colorAttachmentRef;
+ subpass.pResolveAttachments = &colorAttachmentReseolveRef;
+
+ subpassDependencies[0].srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
+ subpassDependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ subpassDependencies[0].srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
+ subpassDependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+
+ subpassDependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ subpassDependencies[1].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
+ subpassDependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ subpassDependencies[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
+
+ VkAttachmentDescription d2o_attachments[2] = {
+ colorAttachment, colorAttachmentResolve
+ };
+
+ renderPassInfo.attachmentCount = 2;
+ renderPassInfo.pAttachments = d2o_attachments;
+ renderPassInfo.dependencyCount = 2;
+ renderPassInfo.pDependencies = subpassDependencies;
+
+ if (vkCreateRenderPass(vkDevice, &renderPassInfo, vkAllocator, &d2OverlayRenderPass) != VK_SUCCESS) {
+ throw "failed to create render pass!";
+ }
+
+ colorAttachment.samples = renderSampleCount;
+ colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
VkAttachmentDescription depthAttachment;
depthAttachment.flags = 0;
depthAttachment.format = depthFormat;
@@ -1039,7 +1090,6 @@ void CreateRenderPass() {
depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
- VkAttachmentDescription colorAttachmentResolve{colorAttachment};
colorAttachmentResolve.samples = VK_SAMPLE_COUNT_1_BIT;
colorAttachmentResolve.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachmentResolve.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
@@ -1049,7 +1099,6 @@ void CreateRenderPass() {
depthAttachmentRef.attachment = 1;
depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
- VkAttachmentReference colorAttachmentReseolveRef;
colorAttachmentReseolveRef.attachment = 2;
colorAttachmentReseolveRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
@@ -1326,8 +1375,10 @@ void CreatePresentPipeline() {
void CreateFramebuffers() {
assert(swapchainFramebuffers == nullptr || swapchainFramebuffers == CAFE_BABE(VkFramebuffer));
assert(renderImageFramebuffers == nullptr || renderImageFramebuffers == CAFE_BABE(VkFramebuffer));
+ assert(d2OverlayImageFramebuffers == nullptr || d2OverlayImageFramebuffers == CAFE_BABE(VkFramebuffer));
swapchainFramebuffers = pk_new<VkFramebuffer>(swapchainLength);
renderImageFramebuffers = pk_new<VkFramebuffer>(swapchainLength);
+ d2OverlayImageFramebuffers = pk_new<VkFramebuffer>(swapchainLength);
VkFramebufferCreateInfo framebufferInfo;
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
@@ -1347,7 +1398,21 @@ void CreateFramebuffers() {
framebufferInfo.pAttachments = attachments;
auto result = vkCreateFramebuffer(vkDevice, &framebufferInfo, vkAllocator, &swapchainFramebuffers[i]);
if (result != VK_SUCCESS) {
- throw "failed to create framebuffer";
+ throw "failed to create present framebuffer";
+ }
+ }
+
+ framebufferInfo.attachmentCount = 2;
+ framebufferInfo.renderPass = d2OverlayRenderPass;
+ for (long i = 0; i < swapchainLength; ++i) {
+ VkImageView attachments[] = {
+ colorImageViews[i],
+ renderImageViews[i],
+ };
+ framebufferInfo.pAttachments = attachments;
+ auto result = vkCreateFramebuffer(vkDevice, &framebufferInfo, vkAllocator, &d2OverlayImageFramebuffers[i]);
+ if (result != VK_SUCCESS) {
+ throw "failed to create 2d overlay framebuffer";
}
}
@@ -1362,7 +1427,7 @@ void CreateFramebuffers() {
framebufferInfo.pAttachments = attachments;
auto result = vkCreateFramebuffer(vkDevice, &framebufferInfo, vkAllocator, &renderImageFramebuffers[i]);
if (result != VK_SUCCESS) {
- throw "failed to create framebuffer";
+ throw "failed to create render framebuffer";
}
}
}
@@ -2349,12 +2414,13 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
throw "failed to begin recording command buffer";
}
- VkClearColorValue clearColor = {{0.0f, 0.0f, 0.0f, 1.0f}};
+ // VkClearColorValue clearColorTransparent = {{0.0f, 0.0f, 0.0f, 0.0f}};
+ VkClearColorValue clearColorBlack = {{0.0f, 0.0f, 0.0f, 1.0f}};
VkClearDepthStencilValue clearDepth;
clearDepth.depth = 1.0;
clearDepth.stencil = 0;
VkClearValue clearValues[2] = {
- VkClearValue { .color = clearColor },
+ VkClearValue { .color = clearColorBlack },
VkClearValue { .depthStencil = clearDepth },
};
@@ -2369,7 +2435,6 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
renderPassInfo.pNext = VK_NULL_HANDLE;
vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
- vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
VkViewport viewport;
viewport.x = 0.0f;
@@ -2442,12 +2507,32 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
vkCmdDrawIndexed(commandBuffer, pkeDebugHitbox.indexCount, pkeDebugHitbox.instanceCount, 0, 0, pkeDebugHitbox.instanceStartingIndex);
}
- // present pass
vkCmdEndRenderPass(commandBuffer);
+ /*
+ // 2d overlay pass
+ renderPassInfo.renderPass = d2OverlayRenderPass;
+ renderPassInfo.framebuffer = d2OverlayImageFramebuffers[imageIndex];
+ renderPassInfo.clearValueCount = 1;
+ clearValues[0].color = clearColorTransparent;
+
+ vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
+ vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
+ vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
+
+ // TODO 2d overlay grbinds
+ {
+
+ }
+
+ vkCmdEndRenderPass(commandBuffer);
+ */
+
+ // present pass
renderPassInfo.renderPass = presentRenderPass;
renderPassInfo.framebuffer = swapchainFramebuffers[imageIndex];
renderPassInfo.clearValueCount = 1;
+ clearValues[0].color = clearColorBlack;
vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &presentDescriptorSets[imageIndex], 0, nullptr);
@@ -2493,6 +2578,13 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
}
void DestroySwapchain() {
+ if (d2OverlayImageFramebuffers != nullptr && d2OverlayImageFramebuffers != CAFE_BABE(VkFramebuffer)) {
+ for (long i = 0; i < swapchainLength; ++i) {
+ vkDestroyFramebuffer(vkDevice, d2OverlayImageFramebuffers[i], vkAllocator);
+ }
+ pk_delete<VkFramebuffer>(d2OverlayImageFramebuffers, swapchainLength);
+ d2OverlayImageFramebuffers = CAFE_BABE(VkFramebuffer);
+ }
if (renderImageFramebuffers != nullptr && renderImageFramebuffers != CAFE_BABE(VkFramebuffer)) {
for (long i = 0; i < swapchainLength; ++i) {
vkDestroyFramebuffer(vkDevice, renderImageFramebuffers[i], vkAllocator);
@@ -2512,6 +2604,9 @@ void DestroySwapchain() {
vkDestroyImageView(vkDevice, depthImageViews[i], vkAllocator);
vkDestroyImage(vkDevice, depthImages[i], vkAllocator);
+ vkDestroyImageView(vkDevice, d2OverlayImageViews[i], vkAllocator);
+ vkDestroyImage(vkDevice, d2OverlayImages[i], vkAllocator);
+
vkDestroyImageView(vkDevice, colorImageViews[i], vkAllocator);
vkDestroyImage(vkDevice, colorImages[i], vkAllocator);
@@ -2522,6 +2617,10 @@ void DestroySwapchain() {
depthImageViews = CAFE_BABE(VkImageView);
pk_delete<VkImage>(depthImages, swapchainLength);
depthImages = CAFE_BABE(VkImage);
+ pk_delete<VkImageView>(d2OverlayImageViews, swapchainLength);
+ d2OverlayImageViews = CAFE_BABE(VkImageView);
+ pk_delete<VkImage>(d2OverlayImages, swapchainLength);
+ d2OverlayImages = CAFE_BABE(VkImage);
pk_delete<VkImageView>(colorImageViews, swapchainLength);
colorImageViews = CAFE_BABE(VkImageView);
pk_delete<VkImage>(colorImages, swapchainLength);
@@ -2530,6 +2629,7 @@ void DestroySwapchain() {
renderImageViews = CAFE_BABE(VkImageView);
pk_delete<VkImage>(renderImages, swapchainLength);
renderImages = CAFE_BABE(VkImage);
+ vkFreeMemory(vkDevice, d2OverlayImagesMemory, vkAllocator);
vkFreeMemory(vkDevice, depthImagesMemory, vkAllocator);
vkFreeMemory(vkDevice, colorImagesMemory, vkAllocator);
vkFreeMemory(vkDevice, renderImagesMemory, vkAllocator);
@@ -2666,6 +2766,7 @@ void DestroyWindow() {
vkDestroyDescriptorPool(vkDevice, presentDescriptorPool, vkAllocator);
vkDestroyDescriptorPool(vkDevice, imGuiDescriptorPool, vkAllocator);
vkDestroyDescriptorSetLayout(vkDevice, vkDescriptorSetLayout, vkAllocator);
+ vkDestroyRenderPass(vkDevice, d2OverlayRenderPass, vkAllocator);
vkDestroyRenderPass(vkDevice, renderRenderPass, vkAllocator);
vkDestroyRenderPass(vkDevice, presentRenderPass, vkAllocator);
vkDestroySurfaceKHR(vkInstance, vkSurfaceKHR, vkAllocator);