From da6b23cb070f83d39ef46ccaa37d41f99037d552 Mon Sep 17 00:00:00 2001 From: antopilo Date: Fri, 10 Jan 2025 19:44:37 -0500 Subject: [PATCH] work --- Editor/src/Windows/EditorInterface.cpp | 2 +- Nuake/src/Rendering/Camera.h | 5 +- .../Vulkan/Pipeline/RenderPipeline.cpp | 114 +++++++++--------- .../Vulkan/VulkanImage/VulkanImage.cpp | 5 + Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp | 45 +------ Nuake/src/Rendering/Vulkan/VulkanRenderer.h | 4 +- .../src/Rendering/Vulkan/VulkanResources.cpp | 2 - .../Rendering/Vulkan/VulkanSceneRenderer.cpp | 9 +- .../Rendering/Vulkan/VulkanSceneRenderer.h | 2 +- Nuake/src/Window.cpp | 2 +- 10 files changed, 77 insertions(+), 113 deletions(-) diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index 40aebf9a..b616c7f2 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -627,7 +627,7 @@ namespace Nuake { Ref texture = framebuffer->GetTexture(); auto& pipeline = VkRenderer::Get().GetRenderPipeline(); - VkDescriptorSet textureDesc = pipeline.GetRenderPass("Shading").GetAttachment("Output").Image->GetImGuiDescriptorSet(); + VkDescriptorSet textureDesc = VkRenderer::Get().DrawImage->GetImGuiDescriptorSet(); if (SelectedViewport == 1) { diff --git a/Nuake/src/Rendering/Camera.h b/Nuake/src/Rendering/Camera.h index 7b275419..3fc5164e 100644 --- a/Nuake/src/Rendering/Camera.h +++ b/Nuake/src/Rendering/Camera.h @@ -4,6 +4,8 @@ #include "src/Resource/Serializable.h" #include "Frustum.h" #include +#include "src/Resource/UUID.h" + namespace Nuake { @@ -27,7 +29,6 @@ namespace Nuake Matrix4 m_Perspective; Matrix4 m_View; - public: float Near = 200.0f; float Far = 0.01f; @@ -41,7 +42,7 @@ namespace Nuake float Exposure = 1.0f; float Gamma = 2.2f; float Speed = 1.0f; - + UUID ID; Camera(); Camera(CAMERA_TYPE type, Vector3 position); diff --git a/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp b/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp index 13f89fc9..e8d6d7bc 100644 --- a/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp +++ b/Nuake/src/Rendering/Vulkan/Pipeline/RenderPipeline.cpp @@ -393,62 +393,64 @@ void RenderPipeline::Execute(PassRenderContext& ctx) { for (auto& input : pass.GetInputAttachments()) { - VkImageMemoryBarrier barrier{}; - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - - // Handle old and new layouts based on attachment type - barrier.oldLayout = input.Format != ImageFormat::D32F ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - - input.Image->SetLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - - // Access masks for color or depth-stencil attachments - if (input.Format != ImageFormat::D32F) { - barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - } - else { - barrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - - // Include stencil aspect if applicable - //if (input.HasStencilComponent()) { - // barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; - //} - } - - // Destination access mask is always for shaders reading - barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - - // No queue family ownership transfer in this case - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - - // Set the image and subresource range - barrier.image = input.Image->GetImage(); - barrier.subresourceRange.baseMipLevel = 0; - barrier.subresourceRange.levelCount = 1; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = 1; - - // Choose appropriate source pipeline stage for color or depth-stencil - VkPipelineStageFlags srcStage = (input.Format != ImageFormat::D32F) - ? VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT - : (VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT); - - // Insert the pipeline barrier - vkCmdPipelineBarrier( - ctx.commandBuffer, - srcStage, // Source stage - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // Destination stage - 0, - 0, nullptr, - 0, nullptr, - 1, &barrier - ); - - transitionedInputs.push_back(input); + input.Image->TransitionLayout(ctx.commandBuffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } + // //VkImageMemoryBarrier barrier{}; + // //barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + // + // //// Handle old and new layouts based on attachment type + // //barrier.oldLayout = input.Format != ImageFormat::D32F ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + // //barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + // + // //input.Image->SetLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + // + // //// Access masks for color or depth-stencil attachments + // //if (input.Format != ImageFormat::D32F) { + // // barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + // // barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + // //} + // //else { + // // barrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + // // barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + // + // // // Include stencil aspect if applicable + // // //if (input.HasStencilComponent()) { + // // // barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + // // //} + // //} + // + // //// Destination access mask is always for shaders reading + // //barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + // + // //// No queue family ownership transfer in this case + // //barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + // //barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + // + // //// Set the image and subresource range + // //barrier.image = input.Image->GetImage(); + // //barrier.subresourceRange.baseMipLevel = 0; + // //barrier.subresourceRange.levelCount = 1; + // //barrier.subresourceRange.baseArrayLayer = 0; + // //barrier.subresourceRange.layerCount = 1; + // + // //// Choose appropriate source pipeline stage for color or depth-stencil + // //VkPipelineStageFlags srcStage = (input.Format != ImageFormat::D32F) + // // ? VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT + // // : (VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT); + // + // //// Insert the pipeline barrier + // //vkCmdPipelineBarrier( + // // ctx.commandBuffer, + // // srcStage, // Source stage + // // VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // Destination stage + // // 0, + // // 0, nullptr, + // // 0, nullptr, + // // 1, &barrier + // //); + // + // transitionedInputs.push_back(input); + //} pass.ClearAttachments(ctx); pass.TransitionAttachments(ctx); @@ -469,7 +471,7 @@ void RenderPipeline::Execute(PassRenderContext& ctx) else { //VulkanUtil::TransitionImage(ctx.commandBuffer, transitionedOutputs.Image->GetImage(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL); - transitionedOutputs.Image->TransitionLayout(ctx.commandBuffer, VK_IMAGE_LAYOUT_GENERAL); + //transitionedOutputs.Image->TransitionLayout(ctx.commandBuffer, VK_IMAGE_LAYOUT_GENERAL); } } diff --git a/Nuake/src/Rendering/Vulkan/VulkanImage/VulkanImage.cpp b/Nuake/src/Rendering/Vulkan/VulkanImage/VulkanImage.cpp index b6d80bab..12e10fc9 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanImage/VulkanImage.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanImage/VulkanImage.cpp @@ -281,6 +281,11 @@ VulkanImage::~VulkanImage() void VulkanImage::TransitionLayout(VkCommandBuffer cmd, VkImageLayout layout) { + if (Layout == layout) + { + return; + } + if(!IsLayoutTransitionValid(Layout, layout)) { throw std::runtime_error("Invalid layout transition!"); diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp index 9d1c85e9..62e329ae 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp @@ -311,6 +311,7 @@ void VkRenderer::InitCommands() Frames[i].ModelStagingBuffer = resources.CreateBuffer(sizeof(Matrix4) * MAX_MODEL_MATRIX, BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY, "TransformStaging" + std::to_string(i)); Frames[i].MaterialStagingBuffer = resources.CreateBuffer(sizeof(MaterialBufferStruct) * MAX_MATERIAL, BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY, "MaterialStaging" + std::to_string(i)); Frames[i].LightStagingBuffer = resources.CreateBuffer(sizeof(LightData) * MAX_LIGHTS, BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY, "LightStaging" + std::to_string(i)); + Frames[i].CamerasStagingBuffer = resources.CreateBuffer(sizeof(CameraView) * MAX_CAMERAS, BufferUsage::TRANSFER_SRC, MemoryUsage::CPU_ONLY, "CamerasStaging" + std::to_string(i)); } VK_CALL(vkCreateCommandPool(Device, &cmdPoolInfo, nullptr, &ImguiCommandPool)); @@ -409,38 +410,6 @@ void VkRenderer::UpdateDescriptorSets() drawImageWrite.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; drawImageWrite.pImageInfo = &imgInfo; vkUpdateDescriptorSets(Device, 1, &drawImageWrite, 0, nullptr); - - // Update descriptor set for cameras - //VkDescriptorBufferInfo camBufferInfo{}; - //camBufferInfo.buffer = CameraBuffer->GetBuffer(); - //camBufferInfo.offset = 0; - //camBufferInfo.range = VK_WHOLE_SIZE; - // - //VkWriteDescriptorSet bufferWriteCam = {}; - //bufferWriteCam.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - //bufferWriteCam.pNext = nullptr; - //bufferWriteCam.dstBinding = 0; - //bufferWriteCam.dstSet = CameraBufferDescriptors; - //bufferWriteCam.descriptorCount = 1; - //bufferWriteCam.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - //bufferWriteCam.pBufferInfo = &camBufferInfo; - //vkUpdateDescriptorSets(Device, 1, &bufferWriteCam, 0, nullptr); - // - //// Update descriptor set for TriangleBufferDescriptors - //VkDescriptorBufferInfo bufferInfo{}; - //bufferInfo.buffer = rectangle->GetVertexBuffer()->GetBuffer(); - //bufferInfo.offset = 0; - //bufferInfo.range = VK_WHOLE_SIZE; - // - //VkWriteDescriptorSet bufferWrite = {}; - //bufferWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - //bufferWrite.pNext = nullptr; - //bufferWrite.dstBinding = 0; - //bufferWrite.dstSet = TriangleBufferDescriptors; - //bufferWrite.descriptorCount = 1; - //bufferWrite.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - //bufferWrite.pBufferInfo = &bufferInfo; - //vkUpdateDescriptorSets(Device, 1, &bufferWrite, 0, nullptr); } void VkRenderer::InitPipeline() @@ -554,8 +523,6 @@ void VkRenderer::DrawGeometry(VkCommandBuffer cmd) vkCmdSetScissor(cmd, 0, 1, &scissor); - - vkCmdBindIndexBuffer(cmd, rectangle->GetIndexBuffer()->GetBuffer(), 0, VK_INDEX_TYPE_UINT32); vkCmdDrawIndexed(cmd, 6, 1, 0, 0, 0); @@ -727,16 +694,11 @@ void VkRenderer::InitImgui() }); } -void VkRenderer::BeginScene(const Matrix4& view, const Matrix4& projection) +void VkRenderer::BeginScene(const UUID& camera) { - Matrix4 proj = projection; - //proj[1][1] *= -1.0f; - CameraData newData = { view, projection, glm::inverse(view), glm::inverse(proj)}; - //UploadCameraData(newData); - SceneRenderer->UpdateCameraData(newData); + SceneRenderer->CurrentCamera = camera; } - bool VkRenderer::Draw() { VK_CALL(vkWaitForFences(Device, 1, &GetCurrentFrame().RenderFence, true, 1000000000)); @@ -807,6 +769,7 @@ void VkRenderer::EndDraw() // Transition the swapchain image to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR for presentation VulkanUtil::TransitionImage(cmd, SwapchainImages[swapchainImageIndex], VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + DrawImage->TransitionLayout(cmd, VK_IMAGE_LAYOUT_GENERAL); VK_CALL(vkEndCommandBuffer(cmd)); VkCommandBufferSubmitInfo cmdinfo = VulkanInit::CommandBufferSubmitInfo(cmd); diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h index 19a3abea..4f637803 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h @@ -87,7 +87,7 @@ namespace Nuake Ref ModelStagingBuffer; // Matrices Ref MaterialStagingBuffer; // Materials Ref LightStagingBuffer; // Lights - + Ref CamerasStagingBuffer; // Draw image // Semaphore are for GPU -> GPU sync // Fence are for CPU -> GPU // Two, one for window, other for rendering @@ -240,7 +240,7 @@ namespace Nuake void DrawGeometry(VkCommandBuffer cmd); void InitImgui(); - void BeginScene(const Matrix4& view, const Matrix4& projection); + void BeginScene(const UUID& camera); bool Draw(); diff --git a/Nuake/src/Rendering/Vulkan/VulkanResources.cpp b/Nuake/src/Rendering/Vulkan/VulkanResources.cpp index 6d62cd25..e68e75be 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanResources.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanResources.cpp @@ -214,8 +214,6 @@ void GPUResources::CreateBindlessLayout() CamerasDescriptorLayout = builder.Build(device, VK_SHADER_STAGE_ALL_GRAPHICS); } - auto& vk = VkRenderer::Get(); - auto device = vk.GetDevice(); auto allocator = vk.GetDescriptorAllocator(); TextureDescriptor = allocator.Allocate(device, TexturesDescriptorLayout); CamerasDescriptor = allocator.Allocate(device, CamerasDescriptorLayout); diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp index 4321388b..870c62ae 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.cpp @@ -105,10 +105,9 @@ void VkSceneRenderer::BeginScene(RenderContext inContext) for (auto e : view) { auto [transform, light] = view.get(e); - light.CalculateViewProjection() + light.CalculateViewProjection(); } } - // Execute light PassRenderContext passCtx = { }; @@ -133,13 +132,9 @@ void VkSceneRenderer::EndScene() auto& selectedOutput = shading; selectedOutput.Image->TransitionLayout(cmd, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); vk.DrawImage->TransitionLayout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - //VulkanUtil::TransitionImage(cmd, selectedOutput.Image->GetImage(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - //VulkanUtil::TransitionImage(cmd, vk.DrawImage->GetImage(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VulkanUtil::CopyImageToImage(cmd, selectedOutput.Image->GetImage(), vk.GetDrawImage()->GetImage(), selectedOutput.Image->GetSize(), vk.DrawImage->GetSize()); vk.DrawImage->TransitionLayout(cmd, VK_IMAGE_LAYOUT_GENERAL); selectedOutput.Image->TransitionLayout(cmd, VK_IMAGE_LAYOUT_GENERAL); - //VulkanUtil::TransitionImage(cmd, vk.DrawImage->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL); - //VulkanUtil::TransitionImage(cmd, selectedOutput.Image->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL); } void VkSceneRenderer::CreateBuffers() @@ -621,7 +616,7 @@ void VkSceneRenderer::SetGBufferSize(const Vector2& size) Context.Size = size; } -void VkSceneRenderer::UpdateCameraData(const CameraData& data) +void VkSceneRenderer::UpdateCameraData(const camera& data) { CameraData adjustedData = data; adjustedData.View = data.View; diff --git a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h index e21c98ce..ce5f729b 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanSceneRenderer.h @@ -133,9 +133,9 @@ namespace Nuake RenderPipeline GBufferPipeline; RenderPipeline ShadowPipeline; - UUID CurrentCamera; public: + UUID CurrentCamera; VkSceneRenderer(); ~VkSceneRenderer(); diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index 0a009d7f..80aef8ac 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -213,7 +213,7 @@ void Window::Draw() ZoneScopedN("Non-playmode Draw"); float resolutionScale = glm::clamp(Engine::GetProject()->Settings.ResolutionScale, 0.5f, 2.0f); this->scene->m_EditorCamera->OnWindowResize(size.x * resolutionScale, size.y * resolutionScale); - VkRenderer::Get().BeginScene(scene->m_EditorCamera->GetTransform(), scene->m_EditorCamera->GetPerspective()); + VkRenderer::Get().BeginScene(scene->m_EditorCamera->ID); this->scene->Draw(*this->framebuffer.get(), this->scene->m_EditorCamera->GetPerspective(), this->scene->m_EditorCamera->GetTransform()); }