diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-01-16 13:09:05 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-01-16 14:55:12 -0500 |
| commit | 727c5e90798455703b88834aa864df94837e8956 (patch) | |
| tree | 7e6b295c6a8242103cbbc8ff458b9aea777522ea /src/window.cpp | |
| parent | b4a4bf7e4211e3ee38659b498adb506ddabf5ab7 (diff) | |
chkpt: 2d overlay incomplete scaffolding
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 117 |
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); |
