From 8d8cfd2532d4ef5aab9f376abbdec9c5683b4317 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Thu, 10 Apr 2025 01:09:36 -0700 Subject: [PATCH] Moved frame rendering from KRCamera to KRRenderGraph --- kraken/KRPipeline.cpp | 2 +- kraken/KRPipeline.h | 2 +- kraken/KRPipelineManager.cpp | 2 +- kraken/KRPresentationThread.cpp | 9 +- kraken/KRSurface.cpp | 11 -- kraken/KRSurface.h | 5 +- kraken/nodes/KRCamera.cpp | 202 +---------------------------- kraken/nodes/KRCamera.h | 3 +- kraken/resources/scene/KRScene.cpp | 4 +- kraken/resources/scene/KRScene.h | 3 +- 10 files changed, 22 insertions(+), 221 deletions(-) diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index 3efeff4..af864c5 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -111,7 +111,7 @@ const char* KRPipeline::KRENGINE_PUSH_CONSTANT_NAMES[] = { "fade_color", // PushConstant::fade_color }; -KRPipeline::KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, KRRenderPass* renderPass, Vector2i viewport_size, Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector& shaders, uint32_t vertexAttributes, ModelFormat modelFormat) +KRPipeline::KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, const KRRenderPass* renderPass, Vector2i viewport_size, Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector& shaders, uint32_t vertexAttributes, ModelFormat modelFormat) : KRContextObject(context) , m_deviceHandle(deviceHandle) { diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index 3600d85..b2c5996 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -214,7 +214,7 @@ class KRPipeline : public KRContextObject { public: - KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, KRRenderPass* renderPass, hydra::Vector2i viewport_size, hydra::Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector& shaders, uint32_t vertexAttributes, ModelFormat modelFormat); + KRPipeline(KRContext& context, KrDeviceHandle deviceHandle, const KRRenderPass* renderPass, hydra::Vector2i viewport_size, hydra::Vector2i scissor_size, const PipelineInfo& info, const char* szKey, const std::vector& shaders, uint32_t vertexAttributes, ModelFormat modelFormat); virtual ~KRPipeline(); const char* getKey() const; diff --git a/kraken/KRPipelineManager.cpp b/kraken/KRPipelineManager.cpp index 0be8543..a5fe1d7 100644 --- a/kraken/KRPipelineManager.cpp +++ b/kraken/KRPipelineManager.cpp @@ -84,7 +84,7 @@ KRPipeline* KRPipelineManager::getPipeline(KRSurface& surface, const PipelineInf std::vector shaders; shaders.push_back(m_pContext->getShaderManager()->get(*info.shader_name + ".vert", "spv")); shaders.push_back(m_pContext->getShaderManager()->get(*info.shader_name + ".frag", "spv")); - KRPipeline* pipeline = new KRPipeline(*m_pContext, surface.m_deviceHandle, surface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_OPAQUE), surface.getDimensions(), surface.getDimensions(), info, info.shader_name->c_str(), shaders, info.vertexAttributes, info.modelFormat); + KRPipeline* pipeline = new KRPipeline(*m_pContext, surface.m_deviceHandle, info.renderPass, surface.getDimensions(), surface.getDimensions(), info, info.shader_name->c_str(), shaders, info.vertexAttributes, info.modelFormat); m_pipelines[key] = pipeline; diff --git a/kraken/KRPresentationThread.cpp b/kraken/KRPresentationThread.cpp index 993f86b..fa9efbd 100644 --- a/kraken/KRPresentationThread.cpp +++ b/kraken/KRPresentationThread.cpp @@ -32,6 +32,10 @@ #include "KRPresentationThread.h" #include "KRRenderPass.h" #include "KRSwapchain.h" +#include "KRRenderGraph.h" +#include "KRRenderGraphDeferred.h" +#include "KRRenderGraphForward.h" +#include "KRRenderGraphBlackFrame.h" KRPresentationThread::KRPresentationThread(KRContext& context) : KRContextObject(context) @@ -161,9 +165,10 @@ void KRPresentationThread::renderFrame() // TODO - This needs to be moved to the Render thread... float deltaTime = 0.005; // TODO - Replace dummy value if (scene) { - scene->renderFrame(commandBuffer, surface, deltaTime); + KRRenderGraphForward* renderGraph = surface.m_renderGraphForward.get(); + scene->renderFrame(commandBuffer, surface, *renderGraph, deltaTime); } else { - surface.renderBlackFrame(commandBuffer); + surface.m_renderGraphBlackFrame->render(commandBuffer, surface, nullptr); } if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) { diff --git a/kraken/KRSurface.cpp b/kraken/KRSurface.cpp index 09c9d75..061785e 100644 --- a/kraken/KRSurface.cpp +++ b/kraken/KRSurface.cpp @@ -249,22 +249,11 @@ VkFormat KRSurface::getDepthFormat() const return m_swapChain->m_depthFormat; } -KRRenderPass* KRSurface::getRenderPass(RenderPassType type) -{ - return m_renderGraphForward->getRenderPass(type); -} - void KRSurface::endFrame() { m_frameIndex++; } - -void KRSurface::renderBlackFrame(VkCommandBuffer &commandBuffer) -{ - m_renderGraphBlackFrame->render(commandBuffer, *this, nullptr); -} - VkFormat KRSurface::getSurfaceFormat() const { return m_surfaceFormat.format; diff --git a/kraken/KRSurface.h b/kraken/KRSurface.h index ad1566b..92e522a 100644 --- a/kraken/KRSurface.h +++ b/kraken/KRSurface.h @@ -53,7 +53,6 @@ public: uint32_t getHeight() const; hydra::Vector2i getDimensions() const; VkFormat getDepthFormat() const; - void renderBlackFrame(VkCommandBuffer &commandBuffer); VkFormat getSurfaceFormat() const; KRSurface(const KRSurface&) = delete; @@ -62,7 +61,6 @@ public: KrResult initialize(); KrResult recreateSwapChain(); - KRRenderPass* getRenderPass(RenderPassType type); void endFrame(); KrSurfaceHandle m_handle; @@ -83,6 +81,9 @@ public: private: void destroySwapChain(); KrResult createSwapChain(); + +public: + // TODO - These need to be relocated... std::unique_ptr m_renderGraphForward; std::unique_ptr m_renderGraphDeferred; std::unique_ptr m_renderGraphBlackFrame; diff --git a/kraken/nodes/KRCamera.cpp b/kraken/nodes/KRCamera.cpp index dd09c3d..ee37414 100755 --- a/kraken/nodes/KRCamera.cpp +++ b/kraken/nodes/KRCamera.cpp @@ -35,6 +35,7 @@ #include "KRRenderPass.h" #include "KRPipeline.h" #include "KRRenderPass.h" +#include "KRRenderGraph.h" using namespace mimir; using namespace hydra; @@ -231,7 +232,7 @@ void KRCamera::render(KRNode::RenderInfo& ri) } } -void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface) +void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface, KRRenderGraph& renderGraph) { if (compositeSurface.m_handle != m_surfaceHandle) { // Only render to the assigned surface @@ -268,204 +269,7 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS m_viewport.expireOcclusionResults(getContext().getCurrentFrame()); - // ----====---- Pre-stream resources ----====---- - KRNode::RenderInfo ri(commandBuffer); - ri.camera = this; - ri.viewport = &m_viewport; - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PRESTREAM); - ri.surface = &compositeSurface; - - render(ri); - - // ----====---- Generate Shadowmaps for Lights ----====---- - if (settings.m_cShadowBuffers > 0) { - GL_PUSH_GROUP_MARKER("Generate Shadowmaps"); - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_SHADOWMAP); - render(ri); - GL_POP_GROUP_MARKER; - } - - if (settings.bEnableDeferredLighting) { - - // ----====---- Opaque Geometry, Deferred rendering Pass 1 ----====---- - - GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 1 (Opaque)"); - - // Start render pass - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_GBUFFER); - ri.renderPass->begin(commandBuffer, compositeSurface); - - // Render the geometry - render(ri); - - // End render pass - ri.renderPass->end(commandBuffer); - - GL_POP_GROUP_MARKER; - - - - // ----====---- Opaque Geometry, Deferred rendering Pass 2 ----====---- - - GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 2 (Opaque)"); - - // Set render target - GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer)); - GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); - GLDEBUG(glClearColor(0.0f, 0.0f, 0.0f, 0.0f)); - GLDEBUG(glClear(GL_COLOR_BUFFER_BIT)); - - // Set source to buffers from pass 1 - m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 6, compositeColorTexture); - m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 7, compositeDepthTexture); - - // Render the geometry - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_LIGHTS); - ri.renderPass->begin(commandBuffer, compositeSurface); - render(ri); - ri.renderPass->end(commandBuffer); - - GL_POP_GROUP_MARKER; - - // ----====---- Opaque Geometry, Deferred rendering Pass 3 ----====---- - - GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 3 (Opaque)"); - - // Start render pass - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_DEFERRED_OPAQUE); - ri.renderPass->begin(commandBuffer, compositeSurface); - - // Set source to buffers from pass 2 - m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 6, lightAccumulationTexture); - - // Render the geometry - // TODO: At this point, we only want to render octree nodes that produced fragments during the 1st pass into the GBuffer - render(ri); - - // End render pass - ri.renderPass->end(commandBuffer); - - GL_POP_GROUP_MARKER; - } else { - // ----====---- Opaque Geometry, Forward Rendering ----====---- - GL_PUSH_GROUP_MARKER("Forward Rendering - Opaque"); - - // Start render pass - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_OPAQUE); - ri.renderPass->begin(commandBuffer, compositeSurface); - - // Render the geometry - render(ri); - - GL_POP_GROUP_MARKER; - - ri.renderPass->end(commandBuffer); - } - - - - - // ----====---- Transparent Geometry, Forward Rendering ----====---- - - GL_PUSH_GROUP_MARKER("Forward Rendering - Transparent"); - - // Render all transparent geometry - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT); - ri.renderPass->begin(commandBuffer, compositeSurface); - render(ri); - ri.renderPass->end(commandBuffer); - GL_POP_GROUP_MARKER; - - // ----====---- Particle Occlusion Tests ----====---- - - GL_PUSH_GROUP_MARKER("Particle Occlusion Tests"); - - // ----====---- Perform Occlusion Tests ----====---- - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_PARTICLE_OCCLUSION); - if (ri.renderPass) { - ri.renderPass->begin(commandBuffer, compositeSurface); - render(ri); - ri.renderPass->end(commandBuffer); - } - - GL_POP_GROUP_MARKER; - - // ----====---- Flares ----====---- - - GL_PUSH_GROUP_MARKER("Additive Particles"); - - // Render all flares - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES); - if (ri.renderPass) { - ri.renderPass->begin(commandBuffer, compositeSurface); - render(ri); - ri.renderPass->end(commandBuffer); - } - - GL_POP_GROUP_MARKER; - - // ----====---- Volumetric Lighting ----====---- - - if (settings.volumetric_environment_enable) { - - GL_PUSH_GROUP_MARKER("Volumetric Lighting"); - - KRViewport volumetricLightingViewport = KRViewport(Vector2::Create((float)volumetricBufferWidth, (float)volumetricBufferHeight), m_viewport.getViewMatrix(), m_viewport.getProjectionMatrix()); - - if (settings.volumetric_environment_downsample != 0) { - // Set render target - GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, volumetricLightAccumulationBuffer)); - GLDEBUG(glClearColor(0.0f, 0.0f, 0.0f, 0.0f)); - GLDEBUG(glClear(GL_COLOR_BUFFER_BIT)); - - // Disable z-buffer test - GLDEBUG(glDisable(GL_DEPTH_TEST)); - m_pContext->getTextureManager()->selectTexture(0 /*GL_TEXTURE_2D*/, 0, compositeDepthTexture); - - GLDEBUG(glViewport(0, 0, (int)volumetricLightingViewport.getSize().x, (int)volumetricLightingViewport.getSize().y)); - } else { - // Enable z-buffer test - GLDEBUG(glEnable(GL_DEPTH_TEST)); - GLDEBUG(glDepthFunc(GL_LEQUAL)); - GLDEBUG(glDepthRangef(0.0, 1.0)); - } - - ri.renderPass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE); - ri.viewport = &volumetricLightingViewport; - ri.renderPass->begin(commandBuffer, compositeSurface); - render(ri); - ri.renderPass->end(commandBuffer); - ri.viewport = &m_viewport; - GL_POP_GROUP_MARKER; - } - - - - // ----====---- Debug Overlay ----====---- - - GL_PUSH_GROUP_MARKER("Debug Overlays"); - - GL_POP_GROUP_MARKER; - - // fprintf(stderr, "VBO Mem: %i Kbyte Texture Mem: %i/%i Kbyte (active/total) Shader Handles: %i Visible Bounds: %i Max Texture LOD: %i\n", (int)m_pContext->getMeshManager()->getMemUsed() / 1024, (int)m_pContext->getTextureManager()->getActiveMemUsed() / 1024, (int)m_pContext->getTextureManager()->getMemUsed() / 1024, (int)m_pContext->getPipelineManager()->getShaderHandlesUsed(), (int)m_visibleBounds.size(), m_pContext->getTextureManager()->getLODDimCap()); - - GL_PUSH_GROUP_MARKER("Debug Overlays"); - - - - GL_POP_GROUP_MARKER; - - GL_PUSH_GROUP_MARKER("Post Processing"); - - KRRenderPass* postCompositePass = compositeSurface.getRenderPass(RenderPassType::RENDER_PASS_POST_COMPOSITE); - postCompositePass->begin(commandBuffer, compositeSurface); - - renderPost(ri); - - postCompositePass->end(commandBuffer); - - - GL_POP_GROUP_MARKER; + renderGraph.render(commandBuffer, compositeSurface, this); } diff --git a/kraken/nodes/KRCamera.h b/kraken/nodes/KRCamera.h index e1bb8a4..78b9454 100755 --- a/kraken/nodes/KRCamera.h +++ b/kraken/nodes/KRCamera.h @@ -47,6 +47,7 @@ class KRModel; class KRScene; class KRViewport; class KRSurface; +class KRRenderGraph; class KRCamera : public KRNode { @@ -57,7 +58,7 @@ public: KrResult update(const KrNodeInfo* nodeInfo) override; - void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface); + void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeSurface, KRRenderGraph& renderGraph); void render(KRNode::RenderInfo& ri); diff --git a/kraken/resources/scene/KRScene.cpp b/kraken/resources/scene/KRScene.cpp index a1e0ef5..3174c68 100755 --- a/kraken/resources/scene/KRScene.cpp +++ b/kraken/resources/scene/KRScene.cpp @@ -57,7 +57,7 @@ KRScene::~KRScene() m_pRootNode = NULL; } -void KRScene::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, float deltaTime) +void KRScene::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, KRRenderGraph& renderGraph, float deltaTime) { getContext().startFrame(deltaTime); KRCamera* camera = find("default_camera"); @@ -74,7 +74,7 @@ void KRScene::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, fl getContext().getAudioManager()->setReverbMaxLength(camera->settings.siren_reverb_max_length); getContext().getTextureManager()->setMaxAnisotropy(camera->settings.max_anisotropy); - camera->renderFrame(commandBuffer, surface); + camera->renderFrame(commandBuffer, surface, renderGraph); getContext().endFrame(deltaTime); physicsUpdate(deltaTime); } diff --git a/kraken/resources/scene/KRScene.h b/kraken/resources/scene/KRScene.h index 247a5ce..a20f9d5 100755 --- a/kraken/resources/scene/KRScene.h +++ b/kraken/resources/scene/KRScene.h @@ -45,6 +45,7 @@ class KRModel; class KRLight; class KRSurface; +class KRRenderGraph; using std::vector; @@ -70,7 +71,7 @@ public: bool rayCast(const hydra::Vector3& v0, const hydra::Vector3& dir, hydra::HitInfo& hitinfo, unsigned int layer_mask); bool sphereCast(const hydra::Vector3& v0, const hydra::Vector3& v1, float radius, hydra::HitInfo& hitinfo, unsigned int layer_mask); - void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, float deltaTime); + void renderFrame(VkCommandBuffer& commandBuffer, KRSurface& surface, KRRenderGraph& renderGraph, float deltaTime); void render(KRNode::RenderInfo& ri); void updateOctree(const KRViewport& viewport);