diff --git a/Source/Game-Lib/Game-Lib/Application/Application.cpp b/Source/Game-Lib/Game-Lib/Application/Application.cpp index 3c7617d..06dab48 100644 --- a/Source/Game-Lib/Game-Lib/Application/Application.cpp +++ b/Source/Game-Lib/Game-Lib/Application/Application.cpp @@ -166,6 +166,7 @@ void Application::Run() ECS::Singletons::FrameTimes timings; while (true) { + ZoneScoped; f32 deltaTime = timer.GetDeltaTime(); timer.Tick(); @@ -192,42 +193,48 @@ void Application::Run() if (!Render(deltaTime, timeSpentWaiting)) break; - timings.renderFrameTimeS = renderTimer.GetLifeTime() - timeSpentWaiting; - timings.renderWaitTimeS = timeSpentWaiting; + { + ZoneScopedN("TimeQueries"); + timings.renderFrameTimeS = renderTimer.GetLifeTime() - timeSpentWaiting; + timings.renderWaitTimeS = timeSpentWaiting; - // Get last GPU Frame time - Renderer::Renderer* renderer = _gameRenderer->GetRenderer(); + // Get last GPU Frame time + Renderer::Renderer* renderer = _gameRenderer->GetRenderer(); - const std::vector frameTimeQueries = renderer->GetFrameTimeQueries(); - if (frameTimeQueries.size() > 0) - { - for (Renderer::TimeQueryID timeQueryID : frameTimeQueries) + const std::vector frameTimeQueries = renderer->GetFrameTimeQueries(); + if (frameTimeQueries.size() > 0) { - const std::string& name = renderer->GetTimeQueryName(timeQueryID); - f32 durationMS = renderer->GetLastTimeQueryDuration(timeQueryID); + for (Renderer::TimeQueryID timeQueryID : frameTimeQueries) + { + const std::string& name = renderer->GetTimeQueryName(timeQueryID); + f32 durationMS = renderer->GetLastTimeQueryDuration(timeQueryID); + + engineStats.AddNamedStat(name, durationMS); + } - engineStats.AddNamedStat(name, durationMS); + Renderer::TimeQueryID totalTimeQuery = frameTimeQueries[0]; + timings.gpuFrameTimeMS = renderer->GetLastTimeQueryDuration(totalTimeQuery); + } + else + { + timings.gpuFrameTimeMS = 0; } - Renderer::TimeQueryID totalTimeQuery = frameTimeQueries[0]; - timings.gpuFrameTimeMS = renderer->GetLastTimeQueryDuration(totalTimeQuery); + engineStats.AddTimings(timings.deltaTimeS, timings.simulationFrameTimeS, timings.renderFrameTimeS, timings.renderWaitTimeS, timings.gpuFrameTimeMS); } - else - { - timings.gpuFrameTimeMS = 0; - } - - engineStats.AddTimings(timings.deltaTimeS, timings.simulationFrameTimeS, timings.renderFrameTimeS, timings.renderWaitTimeS, timings.gpuFrameTimeMS); - bool limitFrameRate = CVAR_FramerateLimit.Get() == 1; - if (limitFrameRate) { - f32 targetFramerate = Math::Max(static_cast(CVAR_FramerateLimitTarget.Get()), 10.0f); - f32 targetDelta = 1.0f / targetFramerate; - - for (deltaTime = timer.GetDeltaTime(); deltaTime < targetDelta; deltaTime = timer.GetDeltaTime()) + ZoneScopedN("Framerate Limit"); + bool limitFrameRate = CVAR_FramerateLimit.Get() == 1; + if (limitFrameRate) { - std::this_thread::yield(); + f32 targetFramerate = Math::Max(static_cast(CVAR_FramerateLimitTarget.Get()), 10.0f); + f32 targetDelta = 1.0f / targetFramerate; + + for (deltaTime = timer.GetDeltaTime(); deltaTime < targetDelta; deltaTime = timer.GetDeltaTime()) + { + std::this_thread::yield(); + } } } @@ -362,12 +369,26 @@ bool Application::Init() bool Application::Tick(f32 deltaTime) { + ZoneScoped; // Imgui New Frame { + ZoneScopedN("_editorHandler->NewFrame"); _editorHandler->NewFrame(); + } + { + ZoneScopedN("ImGui_ImplVulkan_NewFrame"); ImGui_ImplVulkan_NewFrame(); + } + { + ZoneScopedN("ImGui_ImplGlfw_NewFrame"); ImGui_ImplGlfw_NewFrame(); + } + { + ZoneScopedN("ImGui::NewFrame"); ImGui::NewFrame(); + } + { + ZoneScopedN("ImGuizmo::BeginFrame"); ImGuizmo::BeginFrame(); } @@ -481,10 +502,17 @@ bool Application::Tick(f32 deltaTime) bool Application::Render(f32 deltaTime, f32& timeSpentWaiting) { + ZoneScoped; timeSpentWaiting = _gameRenderer->Render(); - ImGui::UpdatePlatformWindows(); - ImGui::RenderPlatformWindowsDefault(); + { + ZoneScopedN("ImGui::UpdatePlatformWindows"); + ImGui::UpdatePlatformWindows(); + } + { + ZoneScopedN("ImGui::RenderPlatformWindowsDefault"); + ImGui::RenderPlatformWindowsDefault(); + } return true; } diff --git a/Source/Game-Lib/Game-Lib/Editor/AssetBrowser.cpp b/Source/Game-Lib/Game-Lib/Editor/AssetBrowser.cpp index e69b765..430d72b 100644 --- a/Source/Game-Lib/Game-Lib/Editor/AssetBrowser.cpp +++ b/Source/Game-Lib/Game-Lib/Editor/AssetBrowser.cpp @@ -402,7 +402,7 @@ namespace Editor Renderer::TextureID textureID = _renderer->LoadTexture(textureDesc); _images[i] = _renderer->GetImguiTextureID(textureID); - Renderer::TextureBaseDesc textureBaseDesc = _renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = _renderer->GetDesc(textureID); _imagesSize[i] = ImVec2(static_cast(textureBaseDesc.width), static_cast(textureBaseDesc.height)); diff --git a/Source/Game-Lib/Game-Lib/Editor/MapSelector.cpp b/Source/Game-Lib/Game-Lib/Editor/MapSelector.cpp index 05e762a..b4c62ef 100644 --- a/Source/Game-Lib/Game-Lib/Editor/MapSelector.cpp +++ b/Source/Game-Lib/Game-Lib/Editor/MapSelector.cpp @@ -131,7 +131,7 @@ namespace Editor textureDesc.path = path.string(); Renderer::TextureID textureID = renderer->LoadTexture(textureDesc); _mapIcons[0] = renderer->GetImguiTextureID(textureID); - Renderer::TextureBaseDesc textureBaseDesc = renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = renderer->GetDesc(textureID); _mapIconSizes[0] = ImVec2(static_cast(textureBaseDesc.width), static_cast(textureBaseDesc.height)); } @@ -141,7 +141,7 @@ namespace Editor textureDesc.path = path.string(); Renderer::TextureID textureID = renderer->LoadTexture(textureDesc); _mapIcons[1] = renderer->GetImguiTextureID(textureID); - Renderer::TextureBaseDesc textureBaseDesc = renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = renderer->GetDesc(textureID); _mapIconSizes[1] = ImVec2(static_cast(textureBaseDesc.width), static_cast(textureBaseDesc.height)); } @@ -151,7 +151,7 @@ namespace Editor textureDesc.path = path.string(); Renderer::TextureID textureID = renderer->LoadTexture(textureDesc); _mapIcons[2] = renderer->GetImguiTextureID(textureID); - Renderer::TextureBaseDesc textureBaseDesc = renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = renderer->GetDesc(textureID); _mapIconSizes[2] = ImVec2(static_cast(textureBaseDesc.width), static_cast(textureBaseDesc.height)); } @@ -161,7 +161,7 @@ namespace Editor textureDesc.path = path.string(); Renderer::TextureID textureID = renderer->LoadTexture(textureDesc); _mapIcons[3] = renderer->GetImguiTextureID(textureID); - Renderer::TextureBaseDesc textureBaseDesc = renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = renderer->GetDesc(textureID); _mapIconSizes[3] = ImVec2(static_cast(textureBaseDesc.width), static_cast(textureBaseDesc.height)); } @@ -171,7 +171,7 @@ namespace Editor textureDesc.path = path.string(); Renderer::TextureID textureID = renderer->LoadTexture(textureDesc); _mapIcons[4] = renderer->GetImguiTextureID(textureID); - Renderer::TextureBaseDesc textureBaseDesc = renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = renderer->GetDesc(textureID); _mapIconSizes[4] = ImVec2(static_cast(textureBaseDesc.width), static_cast(textureBaseDesc.height)); } } diff --git a/Source/Game-Lib/Game-Lib/Editor/PerformanceDiagnostics.cpp b/Source/Game-Lib/Game-Lib/Editor/PerformanceDiagnostics.cpp index 0733a39..a468f2b 100644 --- a/Source/Game-Lib/Game-Lib/Editor/PerformanceDiagnostics.cpp +++ b/Source/Game-Lib/Game-Lib/Editor/PerformanceDiagnostics.cpp @@ -433,21 +433,28 @@ namespace Editor ImGui::Text("%.3f", average.deltaTimeS * 1000); ImGui::TableNextColumn(); - ImGui::Text("Update"); + ImGui::Text(" Update"); ImGui::TableNextColumn(); ImGui::Text("%.3f", average.simulationFrameTimeS * 1000); ImGui::TableNextColumn(); - ImGui::Text("Render CPU"); + ImGui::Text(" Render CPU"); ImGui::TableNextColumn(); ImGui::Text("%.3f", average.renderFrameTimeS * 1000); ImGui::TableNextColumn(); - ImGui::Text("CPU wait for GPU"); + ImGui::Text(" CPU wait for GPU"); ImGui::TableNextColumn(); ImGui::Text("%.3f", average.renderWaitTimeS * 1000); ImGui::TableNextColumn(); + // Separate GPU from Total above since it does not add to it (it would be a part of CPU wait for GPU) + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, IM_COL32(200, 200, 200, 255)); + ImGui::Dummy(vec2(0, 1)); + ImGui::TableNextColumn(); + ImGui::Dummy(vec2(0, 1)); + ImGui::TableNextColumn(); + ImGui::Text("GPU frame time"); ImGui::TableNextColumn(); ImGui::Text("%.3f", average.gpuFrameTimeMS); diff --git a/Source/Game-Lib/Game-Lib/Gameplay/GameConsole/GameConsole.cpp b/Source/Game-Lib/Game-Lib/Gameplay/GameConsole/GameConsole.cpp index c6b39fe..08fd00c 100644 --- a/Source/Game-Lib/Game-Lib/Gameplay/GameConsole/GameConsole.cpp +++ b/Source/Game-Lib/Game-Lib/Gameplay/GameConsole/GameConsole.cpp @@ -13,6 +13,7 @@ #include #include +#include AutoCVar_Int CVAR_GameConsoleEnabled(CVarCategory::Client, "consoleEnabled", "enable game console", 1, CVarFlags::Hidden | CVarFlags::DoNotSave); AutoCVar_Int CVAR_GameConsoleDuplicateToTerminal(CVarCategory::Client, "consoleDuplicateToTerminal", "enable printing to terminal", 1, CVarFlags::EditCheckbox); @@ -65,6 +66,7 @@ bool MatchesCommand(const std::string& command, const std::string& _searchText) void GameConsole::Render(f32 deltaTime) { + ZoneScoped; i32* isGameConsoleEnabled = CVAR_GameConsoleEnabled.GetPtr(); if (*isGameConsoleEnabled == 0) return; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.cpp index f2fab1f..c59f07c 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.cpp @@ -44,7 +44,8 @@ CanvasRenderer::CanvasRenderer(Renderer::Renderer* renderer, GameRenderer* gameR : _renderer(renderer) , _gameRenderer(gameRenderer) , _debugRenderer(debugRenderer) - , _descriptorSet(Renderer::DescriptorSetSlot::PER_PASS) + , _panelDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) + , _textDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) { CreatePermanentResources(); } @@ -219,22 +220,24 @@ void CanvasRenderer::Update(f32 deltaTime) if (_vertices.SyncToGPU(_renderer)) { - _descriptorSet.Bind("_vertices", _vertices.GetBuffer()); + _panelDescriptorSet.Bind("_vertices", _vertices.GetBuffer()); + _textDescriptorSet.Bind("_vertices", _vertices.GetBuffer()); } if (_panelDrawDatas.SyncToGPU(_renderer)) { - _descriptorSet.Bind("_panelDrawDatas", _panelDrawDatas.GetBuffer()); + _panelDescriptorSet.Bind("_panelDrawDatas", _panelDrawDatas.GetBuffer()); } if (_charDrawDatas.SyncToGPU(_renderer)) { - _descriptorSet.Bind("_charDrawDatas", _charDrawDatas.GetBuffer()); + _textDescriptorSet.Bind("_charDrawDatas", _charDrawDatas.GetBuffer()); } if (_widgetWorldPositions.SyncToGPU(_renderer)) { - _descriptorSet.Bind("_widgetWorldPositions", _widgetWorldPositions.GetBuffer()); + _panelDescriptorSet.Bind("_widgetWorldPositions", _widgetWorldPositions.GetBuffer()); + _textDescriptorSet.Bind("_widgetWorldPositions", _widgetWorldPositions.GetBuffer()); } uiRegistry->clear(); @@ -266,7 +269,8 @@ void CanvasRenderer::AddCanvasPass(Renderer::RenderGraph* renderGraph, RenderRes Renderer::ImageMutableResource target; Renderer::DescriptorSetResource globalDescriptorSet; - Renderer::DescriptorSetResource descriptorSet; + Renderer::DescriptorSetResource panelDescriptorSet; + Renderer::DescriptorSetResource textDescriptorSet; }; renderGraph->AddPass("Canvases", [this, &resources](Data& data, Renderer::RenderGraphBuilder& builder) // Setup @@ -284,7 +288,8 @@ void CanvasRenderer::AddCanvasPass(Renderer::RenderGraph* renderGraph, RenderRes builder.Read(_widgetWorldPositions.GetBuffer(), BufferUsage::GRAPHICS); data.globalDescriptorSet = builder.Use(resources.globalDescriptorSet); - data.descriptorSet = builder.Use(_descriptorSet); + data.panelDescriptorSet = builder.Use(_panelDescriptorSet); + data.textDescriptorSet = builder.Use(_textDescriptorSet); return true;// Return true from setup to enable this pass, return false to disable it }, @@ -300,7 +305,7 @@ void CanvasRenderer::AddCanvasPass(Renderer::RenderGraph* renderGraph, RenderRes // Loop over dirty rendertarget canvases registry->view().each([&](auto entity, auto& canvas) { - Renderer::TextureBaseDesc textureDesc = _renderer->GetTextureDesc(canvas.renderTexture); + Renderer::TextureBaseDesc textureDesc = _renderer->GetDesc(canvas.renderTexture); commandList.SetViewport(0, 0, static_cast(textureDesc.width), static_cast(textureDesc.height), 0.0f, 1.0f); commandList.SetScissorRect(0, static_cast(textureDesc.width), 0, static_cast(textureDesc.height)); @@ -330,7 +335,14 @@ void CanvasRenderer::AddCanvasPass(Renderer::RenderGraph* renderGraph, RenderRes if (ChangePipelineIfNecessary(commandList, currentPipeline, childWidget.type)) { - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.descriptorSet, frameIndex); + if (childWidget.type == WidgetType::Panel) + { + commandList.BindDescriptorSet(data.panelDescriptorSet, frameIndex); + } + else if (childWidget.type == WidgetType::Text) + { + commandList.BindDescriptorSet(data.textDescriptorSet, frameIndex); + } } if (childWidget.type == WidgetType::Panel) @@ -394,8 +406,15 @@ void CanvasRenderer::AddCanvasPass(Renderer::RenderGraph* renderGraph, RenderRes if (ChangePipelineIfNecessary(commandList, currentPipeline, childWidget.type)) { - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.descriptorSet, frameIndex); + commandList.BindDescriptorSet(data.globalDescriptorSet, frameIndex); + if (childWidget.type == WidgetType::Panel) + { + commandList.BindDescriptorSet(data.panelDescriptorSet, frameIndex); + } + else if (childWidget.type == WidgetType::Text) + { + commandList.BindDescriptorSet(data.textDescriptorSet, frameIndex); + } } if (childWidget.type == WidgetType::Panel) @@ -433,11 +452,15 @@ void CanvasRenderer::AddCanvasPass(Renderer::RenderGraph* renderGraph, RenderRes void CanvasRenderer::CreatePermanentResources() { + CreatePipelines(); + InitDescriptorSets(); + Renderer::TextureArrayDesc textureArrayDesc; textureArrayDesc.size = 4096; _textures = _renderer->CreateTextureArray(textureArrayDesc); - _descriptorSet.Bind("_textures", _textures); + _panelDescriptorSet.Bind("_textures", _textures); + _textDescriptorSet.Bind("_textures", _textures); Renderer::DataTextureDesc dataTextureDesc; dataTextureDesc.width = 1; @@ -468,7 +491,8 @@ void CanvasRenderer::CreatePermanentResources() samplerDesc.shaderVisibility = Renderer::ShaderVisibility::PIXEL; _sampler = _renderer->CreateSampler(samplerDesc); - _descriptorSet.Bind("_sampler"_h, _sampler); + _panelDescriptorSet.Bind("_sampler"_h, _sampler); + _textDescriptorSet.Bind("_sampler"_h, _sampler); textureArrayDesc.size = 256; _fontTextures = _renderer->CreateTextureArray(textureArrayDesc); @@ -476,7 +500,7 @@ void CanvasRenderer::CreatePermanentResources() _font = Renderer::Font::GetDefaultFont(_renderer); _renderer->AddTextureToArray(_font->GetTextureID(), _fontTextures); - _descriptorSet.Bind("_fontTextures"_h, _fontTextures); + _textDescriptorSet.Bind("_fontTextures"_h, _fontTextures); _vertices.SetDebugName("UIVertices"); _vertices.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); @@ -492,7 +516,10 @@ void CanvasRenderer::CreatePermanentResources() // Push a debug position _widgetWorldPositions.Add(vec4(0, 0, 0, 1)); +} +void CanvasRenderer::CreatePipelines() +{ // Create pipelines Renderer::ImageFormat renderTargetFormat = _renderer->GetSwapChainImageFormat(); @@ -507,13 +534,11 @@ void CanvasRenderer::CreatePermanentResources() // Shader Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Panel.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "UI/Panel.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Panel.vs"_h, "UI/Panel.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); - + Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Panel.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "UI/Panel.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Panel.ps"_h, "UI/Panel.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Blending @@ -537,13 +562,11 @@ void CanvasRenderer::CreatePermanentResources() // Shader Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Text.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "UI/Text.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Text.vs"_h, "UI/Text.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Text.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "UI/Text.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("UI/Text.ps"_h, "UI/Text.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Blending @@ -557,6 +580,15 @@ void CanvasRenderer::CreatePermanentResources() } } +void CanvasRenderer::InitDescriptorSets() +{ + _panelDescriptorSet.RegisterPipeline(_renderer, _panelPipeline); + _panelDescriptorSet.Init(_renderer); + _textDescriptorSet.RegisterPipeline(_renderer, _textPipeline); + _textDescriptorSet.Init(_renderer); + +} + void CanvasRenderer::UpdatePanelVertices(const vec2& clipPos, const vec2& clipSize, ECS::Components::UI::Panel& panel, ECS::Components::UI::PanelTemplate& panelTemplate) { // Add vertices if necessary @@ -797,7 +829,7 @@ void CanvasRenderer::UpdatePanelData(entt::entity entity, ECS::Components::Trans const vec2& widgetSize = transform.GetSize(); Renderer::TextureID textureID = _renderer->GetTextureID(_textures, textureIndex); - Renderer::TextureBaseDesc textureBaseDesc = _renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureBaseDesc = _renderer->GetDesc(textureID); vec2 texSize = vec2(textureBaseDesc.width, textureBaseDesc.height); vec2 textureScaleToWidgetSize = texSize / widgetSize; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.h index 1b4a9eb..ea0b5bc 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.h @@ -56,6 +56,8 @@ class CanvasRenderer private: void CreatePermanentResources(); + void CreatePipelines(); + void InitDescriptorSets(); void UpdatePanelVertices(const vec2& clipPos, const vec2& clipSize, ECS::Components::UI::Panel& panel, ECS::Components::UI::PanelTemplate& panelTemplate); void UpdateTextVertices(ECS::Components::UI::Widget& widget, ECS::Components::Transform2D& transform, ECS::Components::UI::Text& text, ECS::Components::UI::TextTemplate& textTemplate, const vec2& canvasSize); @@ -125,7 +127,8 @@ class CanvasRenderer Renderer::GraphicsPipelineID _panelPipeline; Renderer::GraphicsPipelineID _textPipeline; - Renderer::DescriptorSet _descriptorSet; + Renderer::DescriptorSet _panelDescriptorSet; + Renderer::DescriptorSet _textDescriptorSet; ECS::Components::UI::WidgetType _lastRenderedWidgetType = ECS::Components::UI::WidgetType::None; }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/CullUtils.cpp b/Source/Game-Lib/Game-Lib/Rendering/CullUtils.cpp index c30cfc8..e705092 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CullUtils.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/CullUtils.cpp @@ -21,6 +21,9 @@ Renderer::BufferID DepthPyramidUtils::_atomicBuffer; Renderer::ComputePipelineID DepthPyramidUtils::_blitDepthPipeline; Renderer::ComputePipelineID DepthPyramidUtils::_downsamplePipeline; +Renderer::Renderer* DepthPyramidUtils::_renderer = nullptr; +GameRenderer* DepthPyramidUtils::_gameRenderer = nullptr; + inline u32 GetGroupCount(u32 threadCount, u32 localSize) { return (threadCount + localSize - 1) / localSize; @@ -28,6 +31,36 @@ inline u32 GetGroupCount(u32 threadCount, u32 localSize) void DepthPyramidUtils::Init(Renderer::Renderer* renderer, GameRenderer* gameRenderer) { + _renderer = renderer; + _gameRenderer = gameRenderer; + + // Init pipelines + Renderer::ComputePipelineDesc pipelineDesc; + { + pipelineDesc.debugName = "Blit Depthpyramid"; + + Renderer::ComputeShaderDesc shaderDesc; + shaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/BlitDepth.cs"_h, "Blitting/BlitDepth.cs"); + pipelineDesc.computeShader = renderer->LoadShader(shaderDesc); + + _blitDepthPipeline = renderer->CreatePipeline(pipelineDesc); + } + { + pipelineDesc.debugName = "Downsample Depthpyramid"; + + Renderer::ComputeShaderDesc shaderDesc; + shaderDesc.shaderEntry = gameRenderer->GetShaderEntry("DownSampler/SinglePassDownsampler.cs"_h, "DownSampler/SinglePassDownsampler.cs"); + pipelineDesc.computeShader = renderer->LoadShader(shaderDesc); + + _downsamplePipeline = renderer->CreatePipeline(pipelineDesc); + } + + // Init descriptor sets + _copyDescriptorSet.RegisterPipeline(renderer, _blitDepthPipeline); + _copyDescriptorSet.Init(renderer); + _pyramidDescriptorSet.RegisterPipeline(renderer, _downsamplePipeline); + _pyramidDescriptorSet.Init(renderer); + Renderer::BufferDesc desc; desc.name = "DepthPyramidAtomicCounters"; desc.size = sizeof(u32) * 6; @@ -62,29 +95,6 @@ void DepthPyramidUtils::Init(Renderer::Renderer* renderer, GameRenderer* gameRen _pyramidSampler = renderer->CreateSampler(pyramidSamplerDesc); _pyramidDescriptorSet.Bind("srcSampler", _pyramidSampler); - - // Init pipelines - Renderer::ComputePipelineDesc pipelineDesc; - { - pipelineDesc.debugName = "Blit Depthpyramid"; - - Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/BlitDepth.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Blitting/BlitDepth.cs.hlsl"; - pipelineDesc.computeShader = renderer->LoadShader(shaderDesc); - - _blitDepthPipeline = renderer->CreatePipeline(pipelineDesc); - } - { - pipelineDesc.debugName = "Downsample Depthpyramid"; - - Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = gameRenderer->GetShaderEntry("DownSampler/SinglePassDownsampler.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "DownSampler/SinglePassDownsampler.cs.hlsl"; - pipelineDesc.computeShader = renderer->LoadShader(shaderDesc); - - _downsamplePipeline = renderer->CreatePipeline(pipelineDesc); - } } void DepthPyramidUtils::BuildPyramid(BuildPyramidParams& params) @@ -97,7 +107,7 @@ void DepthPyramidUtils::BuildPyramid(BuildPyramidParams& params) params.commandList->BeginPipeline(pipeline); params.copyDescriptorSet.Bind("_source", params.depth); - params.copyDescriptorSet.BindStorage("_target", params.depthPyramid, 0); + params.copyDescriptorSet.Bind("_target", params.depthPyramid, 0); struct CopyParams { @@ -112,7 +122,7 @@ void DepthPyramidUtils::BuildPyramid(BuildPyramidParams& params) params.commandList->PushConstant(copyData, 0, sizeof(CopyParams)); - params.commandList->BindDescriptorSet(Renderer::PER_PASS, params.copyDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.copyDescriptorSet, params.frameIndex); params.commandList->Dispatch(GetGroupCount(params.pyramidSize.x, 32), GetGroupCount(params.pyramidSize.y, 32), 1); params.commandList->EndPipeline(pipeline); @@ -125,16 +135,16 @@ void DepthPyramidUtils::BuildPyramid(BuildPyramidParams& params) Renderer::ComputePipelineID pipeline = _downsamplePipeline; params.commandList->BeginPipeline(pipeline); - params.pyramidDescriptorSet.Bind("imgSrc", params.depthPyramid, 0); - params.pyramidDescriptorSet.BindStorage("imgDst", params.depthPyramid, 1, 12); - params.pyramidDescriptorSet.BindStorage("imgDst5", params.depthPyramid, 6); - varAU2(dispatchThreadGroupCountXY); varAU2(workGroupOffset); varAU2(numWorkGroupsAndMips); varAU4(rectInfo) = initAU4(0, 0, params.pyramidSize.x, params.pyramidSize.y); // left, top, width, height SpdSetup(dispatchThreadGroupCountXY, workGroupOffset, numWorkGroupsAndMips, rectInfo); + params.pyramidDescriptorSet.Bind("imgSrc", params.depthPyramid, 0); + params.pyramidDescriptorSet.Bind("imgDst", params.depthPyramid, 1, numWorkGroupsAndMips[1]); + params.pyramidDescriptorSet.Bind("imgDst5", params.depthPyramid, 6); + struct Constants { u32 mips; @@ -153,7 +163,7 @@ void DepthPyramidUtils::BuildPyramid(BuildPyramidParams& params) params.commandList->PushConstant(constants, 0, sizeof(Constants)); - params.commandList->BindDescriptorSet(Renderer::PER_PASS, params.pyramidDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.pyramidDescriptorSet, params.frameIndex); params.commandList->Dispatch(dispatchThreadGroupCountXY[0], dispatchThreadGroupCountXY[1], 1); diff --git a/Source/Game-Lib/Game-Lib/Rendering/CullUtils.h b/Source/Game-Lib/Game-Lib/Rendering/CullUtils.h index 72041ef..baba7bc 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CullUtils.h +++ b/Source/Game-Lib/Game-Lib/Rendering/CullUtils.h @@ -24,8 +24,6 @@ class DepthPyramidUtils struct BuildPyramidParams { public: - Renderer::Renderer* renderer; - GameRenderer* gameRenderer; Renderer::RenderGraphResources* graphResources; Renderer::CommandList* commandList; RenderResources* resources; @@ -47,4 +45,8 @@ class DepthPyramidUtils static Renderer::BufferID _atomicBuffer; static Renderer::ComputePipelineID _blitDepthPipeline; static Renderer::ComputePipelineID _downsamplePipeline; + +private: + static Renderer::Renderer* _renderer; + static GameRenderer* _gameRenderer; }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp index 4285bb7..13efee2 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp @@ -12,6 +12,33 @@ Renderer::ComputePipelineID CulledRenderer::_createIndirectAfterCullingOrderedPi Renderer::ComputePipelineID CulledRenderer::_cullingInstancedPipeline[2]; // [0] = no bitmasks, [1] = use bitmasks Renderer::ComputePipelineID CulledRenderer::_cullingPipeline[2]; // [0] = no bitmasks, [1] = use bitmasks +void CulledRenderer::InitCullingResources(CullingResourcesBase& cullingResources) +{ + bool isIndexed = cullingResources.IsIndexed(); + bool isInstanced = cullingResources.IsInstanced(); + bool supportsTwoPassCulling = cullingResources.HasSupportForTwoStepCulling(); + + Renderer::ComputePipelineID fillPipeline = (isInstanced) ? _fillInstancedDrawCallsFromBitmaskPipeline[isIndexed] : _fillDrawCallsFromBitmaskPipeline[isIndexed]; + Renderer::ComputePipelineID cullingPipeline = (isInstanced) ? _cullingInstancedPipeline[supportsTwoPassCulling] : _cullingPipeline[supportsTwoPassCulling]; + + // Init descriptor sets + Renderer::DescriptorSet& occluderFillDescriptorSet = cullingResources.GetOccluderFillDescriptorSet(); + occluderFillDescriptorSet.RegisterPipeline(_renderer, fillPipeline); + occluderFillDescriptorSet.Init(_renderer); + + Renderer::DescriptorSet& cullingDescriptorSet = cullingResources.GetCullingDescriptorSet(); + cullingDescriptorSet.RegisterPipeline(_renderer, cullingPipeline); + cullingDescriptorSet.Init(_renderer); + + Renderer::DescriptorSet& createIndirectAfterCullDescriptorSet = cullingResources.GetCreateIndirectAfterCullDescriptorSet(); + createIndirectAfterCullDescriptorSet.RegisterPipeline(_renderer, _createIndirectAfterCullingPipeline[isIndexed]); + createIndirectAfterCullDescriptorSet.Init(_renderer); + + Renderer::DescriptorSet& geometryFillDescriptorSet = cullingResources.GetGeometryFillDescriptorSet(); + geometryFillDescriptorSet.RegisterPipeline(_renderer, fillPipeline); + geometryFillDescriptorSet.Init(_renderer); +} + CulledRenderer::CulledRenderer(Renderer::Renderer* renderer, GameRenderer* gameRenderer, DebugRenderer* debugRenderer) : _renderer(renderer) , _gameRenderer(gameRenderer) @@ -53,8 +80,8 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) return; } - - if (params.useInstancedCulling) + + if (params.cullingResources->IsInstanced()) { const bool debugOrdered = false; @@ -73,7 +100,7 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) std::string debugName = params.passName + " Instanced Occlusion Fill"; params.commandList->PushMarker(debugName, Color::White); - Renderer::ComputePipelineID pipeline = _fillInstancedDrawCallsFromBitmaskPipeline[params.isIndexed]; + Renderer::ComputePipelineID pipeline = _fillInstancedDrawCallsFromBitmaskPipeline[params.cullingResources->IsIndexed()]; params.commandList->BeginPipeline(pipeline); struct FillDrawCallConstants @@ -93,10 +120,8 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) params.occluderFillDescriptorSet.Bind("_culledDrawCallsBitMask"_h, params.culledDrawCallsBitMaskBuffer); // Bind descriptorset - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, ¶ms.renderResources->debugDescriptorSet, frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.occluderFillDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.occluderFillDescriptorSet, params.frameIndex); params.commandList->Dispatch((numInstances + 31) / 32, 1, 1); @@ -120,11 +145,11 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) Renderer::ComputePipelineID pipeline; if (debugOrdered) { - pipeline = _createIndirectAfterCullingOrderedPipeline[params.isIndexed]; + pipeline = _createIndirectAfterCullingOrderedPipeline[params.cullingResources->IsIndexed()]; } else { - pipeline = _createIndirectAfterCullingPipeline[params.isIndexed]; + pipeline = _createIndirectAfterCullingPipeline[params.cullingResources->IsIndexed()]; } params.commandList->BeginPipeline(pipeline); @@ -141,10 +166,8 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) cullConstants->drawCallDataSize = params.drawCallDataSize; params.commandList->PushConstant(cullConstants, 0, sizeof(CullConstants)); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, params.debugDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.createIndirectDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.createIndirectDescriptorSet, params.frameIndex); if (debugOrdered) { @@ -170,8 +193,6 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) drawParams.cullingEnabled = true; // The occuder pass only makes sense if culling is enabled drawParams.shadowPass = false; drawParams.viewIndex = 0; - drawParams.globalDescriptorSet = params.globalDescriptorSet; - drawParams.drawDescriptorSet = params.drawDescriptorSet; drawParams.rt0 = params.rt0; drawParams.rt1 = params.rt1; drawParams.depth = params.depth[0]; @@ -239,7 +260,7 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) std::string debugName = params.passName + " Occlusion Fill"; params.commandList->PushMarker(debugName, Color::White); - Renderer::ComputePipelineID pipeline = _fillDrawCallsFromBitmaskPipeline[params.isIndexed]; + Renderer::ComputePipelineID pipeline = _fillDrawCallsFromBitmaskPipeline[params.cullingResources->IsIndexed()]; params.commandList->BeginPipeline(pipeline); struct FillDrawCallConstants @@ -259,10 +280,8 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) params.occluderFillDescriptorSet.Bind("_prevCulledDrawCallsBitMask"_h, params.prevCulledDrawCallsBitMaskBuffer); // Bind descriptorset - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, ¶ms.renderResources->debugDescriptorSet, frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.occluderFillDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.occluderFillDescriptorSet, params.frameIndex); params.commandList->Dispatch((numDrawCalls + 31) / 32, 1, 1); @@ -284,8 +303,6 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) drawParams.cullingEnabled = true; // The occuder pass only makes sense if culling is enabled drawParams.shadowPass = i > 0; drawParams.viewIndex = i; - drawParams.globalDescriptorSet = params.globalDescriptorSet; - drawParams.drawDescriptorSet = params.drawDescriptorSet; drawParams.rt0 = params.rt0; drawParams.rt1 = params.rt1; drawParams.depth = params.depth[i]; @@ -326,7 +343,7 @@ void CulledRenderer::CullingPass(CullingPassParams& params) if (numDrawCalls > 0 && numInstances > 0) { - if (params.useInstancedCulling) + if (params.cullingResources->IsInstanced()) { const bool debugOrdered = false; @@ -393,10 +410,9 @@ void CulledRenderer::CullingPass(CullingPassParams& params) params.cullingDescriptorSet.Bind("_culledDrawCallsBitMask"_h, params.currentCulledDrawCallsBitMask); } - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, params.debugDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.cullingDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.debugDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.cullingDescriptorSet, params.frameIndex); params.commandList->Dispatch((numInstances + 31) / 32, 1, 1); @@ -436,10 +452,9 @@ void CulledRenderer::CullingPass(CullingPassParams& params) cullConstants->drawCallDataSize = params.drawCallDataSize; params.commandList->PushConstant(cullConstants, 0, sizeof(CullConstants)); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, params.debugDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.cullingDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.debugDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.createIndirectAfterCullSet, params.frameIndex); if (debugOrdered) { @@ -513,10 +528,9 @@ void CulledRenderer::CullingPass(CullingPassParams& params) params.cullingDescriptorSet.Bind("_culledDrawCallsBitMask"_h, params.currentCulledDrawCallsBitMask); } - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, params.debugDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.cullingDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.debugDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.cullingDescriptorSet, params.frameIndex); params.commandList->Dispatch((numDrawCalls + 31) / 32, 1, 1); @@ -527,7 +541,7 @@ void CulledRenderer::CullingPass(CullingPassParams& params) } else if (numDrawCalls > 0) { - if (params.useInstancedCulling) + if (params.cullingResources->IsInstanced()) { // Reset the counters params.commandList->FillBuffer(params.drawCountBuffer, 0, sizeof(u32), 0); @@ -556,7 +570,7 @@ void CulledRenderer::GeometryPass(GeometryPassParams& params) params.commandList->PushMarker(markerName, Color::PastelYellow); // Reset the counters - if (!params.useInstancedCulling && params.cullingResources->HasSupportForTwoStepCulling()) + if (!params.cullingResources->IsInstanced() && params.cullingResources->HasSupportForTwoStepCulling()) { params.commandList->BufferBarrier(params.drawCountBuffer, Renderer::BufferPassUsage::TRANSFER); params.commandList->FillBuffer(params.drawCountBuffer, 0, sizeof(u32), 0); @@ -577,7 +591,7 @@ void CulledRenderer::GeometryPass(GeometryPassParams& params) std::string debugName = params.passName + " Geometry Fill"; params.commandList->PushMarker(debugName, Color::White); - Renderer::ComputePipelineID pipeline = _fillDrawCallsFromBitmaskPipeline[params.isIndexed]; + Renderer::ComputePipelineID pipeline = _fillDrawCallsFromBitmaskPipeline[params.cullingResources->IsIndexed()]; params.commandList->BeginPipeline(pipeline); struct FillDrawCallConstants @@ -597,10 +611,8 @@ void CulledRenderer::GeometryPass(GeometryPassParams& params) params.fillDescriptorSet.Bind("_prevCulledDrawCallsBitMask"_h, params.prevCulledDrawCallsBitMaskBuffer); // Bind descriptorset - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, ¶ms.renderResources->debugDescriptorSet, frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, params.frameIndex); - //params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, ¶ms.renderResources->shadowDescriptorSet, frameIndex); - params.commandList->BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.fillDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); + params.commandList->BindDescriptorSet(params.fillDescriptorSet, params.frameIndex); params.commandList->Dispatch((numDrawCalls + 31) / 32, 1, 1); @@ -632,8 +644,7 @@ void CulledRenderer::GeometryPass(GeometryPassParams& params) drawParams.cullingEnabled = params.cullingEnabled; drawParams.shadowPass = i > 0; drawParams.viewIndex = i; - drawParams.globalDescriptorSet = params.globalDescriptorSet; - drawParams.drawDescriptorSet = params.drawDescriptorSet; + drawParams.cullingResources = params.cullingResources; drawParams.rt0 = params.rt0; drawParams.rt1 = params.rt1; drawParams.depth = params.depth[i]; @@ -655,7 +666,7 @@ void CulledRenderer::GeometryPass(GeometryPassParams& params) drawParams.argumentBuffer = params.drawCallsBuffer; } - if (params.useInstancedCulling) + if (params.cullingResources->IsInstanced()) { drawParams.drawCountBuffer = params.culledDrawCallCountBuffer; drawParams.drawCountIndex = debugDrawCallBufferIndex; @@ -735,11 +746,10 @@ void CulledRenderer::CreatePipelines() { { "IS_INDEXED", std::to_string(i) } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/FillInstancedDrawCallsFromBitmask.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/FillInstancedDrawCallsFromBitmask.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Utils/FillInstancedDrawCallsFromBitmask.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Utils/FillInstancedDrawCallsFromBitmask.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); @@ -755,11 +765,10 @@ void CulledRenderer::CreatePipelines() { { "IS_INDEXED", std::to_string(i) } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/FillDrawCallsFromBitmask.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/FillDrawCallsFromBitmask.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Utils/FillDrawCallsFromBitmask.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Utils/FillDrawCallsFromBitmask.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); @@ -777,11 +786,10 @@ void CulledRenderer::CreatePipelines() { "IS_INDEXED", std::to_string(i) }, { "DEBUG_ORDERED", "0" } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/CreateIndirectAfterCulling.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/CreateIndirectAfterCulling.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Utils/CreateIndirectAfterCulling.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Utils/CreateIndirectAfterCulling.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); @@ -798,11 +806,10 @@ void CulledRenderer::CreatePipelines() { "IS_INDEXED", std::to_string(i) }, { "DEBUG_ORDERED", "1" } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/CreateIndirectAfterCulling.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/CreateIndirectAfterCulling.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Utils/CreateIndirectAfterCulling.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Utils/CreateIndirectAfterCulling.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); @@ -819,11 +826,10 @@ void CulledRenderer::CreatePipelines() { { "USE_BITMASKS", std::to_string(i) } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/CullingInstanced.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/CullingInstanced.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Utils/CullingInstanced.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Utils/CullingInstanced.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); @@ -840,11 +846,10 @@ void CulledRenderer::CreatePipelines() { { "USE_BITMASKS", std::to_string(i) } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/Culling.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Utils/Culling.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Utils/Culling.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Utils/Culling.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); diff --git a/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.h index 8719d47..0d37c72 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.h @@ -29,6 +29,9 @@ struct DrawParams; class CulledRenderer { +public: + void InitCullingResources(CullingResourcesBase& resources); + protected: struct DrawParams { @@ -36,6 +39,8 @@ class CulledRenderer bool cullingEnabled = false; bool shadowPass = false; u32 viewIndex = 0; + + CullingResourcesBase* cullingResources; Renderer::ImageMutableResource rt0; Renderer::ImageMutableResource rt1; @@ -44,12 +49,10 @@ class CulledRenderer Renderer::BufferMutableResource argumentBuffer; Renderer::BufferMutableResource drawCountBuffer; - Renderer::DescriptorSetResource globalDescriptorSet; - Renderer::DescriptorSetResource drawDescriptorSet; + std::vector descriptorSets; u32 drawCountIndex = 0; u32 numMaxDrawCalls = 0; - bool isIndexed = true; }; CulledRenderer(Renderer::Renderer* renderer, GameRenderer* gameRenderer, DebugRenderer* debugRenderer); @@ -89,7 +92,7 @@ class CulledRenderer builder.Write(cullingResources->GetCulledInstanceLookupTableBuffer(), BufferUsage::COMPUTE | BufferUsage::GRAPHICS); data.occluderFillSet = builder.Use(cullingResources->GetOccluderFillDescriptorSet()); - data.createIndirectDescriptorSet = builder.Use(cullingResources->GetCullingDescriptorSet()); + data.createIndirectDescriptorSet = builder.Use(cullingResources->GetCreateIndirectAfterCullDescriptorSet()); data.drawSet = builder.Use(cullingResources->GetGeometryPassDescriptorSet()); } @@ -155,8 +158,6 @@ class CulledRenderer bool enableDrawing = false; // Allows us to do everything but the actual drawcall, for debugging bool disableTwoStepCulling = false; - bool isIndexed = true; - bool useInstancedCulling = false; }; void OccluderPass(OccluderPassParams& params); @@ -179,6 +180,7 @@ class CulledRenderer builder.Read(cullingResources->GetInstanceRefs().GetBuffer(), BufferUsage::COMPUTE); data.cullingSet = builder.Use(cullingResources->GetCullingDescriptorSet()); + data.createIndirectAfterCullSet = builder.Use(cullingResources->GetCreateIndirectAfterCullDescriptorSet()); } template @@ -224,6 +226,7 @@ class CulledRenderer Renderer::DescriptorSetResource debugDescriptorSet; Renderer::DescriptorSetResource globalDescriptorSet; Renderer::DescriptorSetResource cullingDescriptorSet; + Renderer::DescriptorSetResource createIndirectAfterCullSet; u32 numCascades = 0; bool occlusionCull = true; @@ -237,8 +240,6 @@ class CulledRenderer u32 modelIDOffset = 0; u32 baseInstanceLookupOffset = 0; u32 drawCallDataSize = 0; - - bool useInstancedCulling = false; }; void CullingPass(CullingPassParams& params); @@ -316,8 +317,6 @@ class CulledRenderer bool enableDrawing = false; // Allows us to do everything but the actual drawcall, for debugging bool cullingEnabled = false; - bool isIndexed = true; - bool useInstancedCulling = false; }; void GeometryPass(GeometryPassParams& params); diff --git a/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp b/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp index bef6fbb..c0e9a50 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp @@ -1,5 +1,5 @@ #include "CullingResources.h" -#include "CullingResources.h" +#include "CulledRenderer.h" #include "Game-Lib/Rendering/RenderUtils.h" @@ -8,6 +8,7 @@ CullingResourcesBase::CullingResourcesBase() , _cullingDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) , _geometryFillDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) , _geometryPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) + , _createIndirectAfterCullingDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) { } @@ -15,11 +16,15 @@ CullingResourcesBase::CullingResourcesBase() void CullingResourcesBase::Init(InitParams& params) { NC_ASSERT(params.renderer != nullptr, "CullingResources : params.renderer is nullptr"); + NC_ASSERT(params.culledRenderer != nullptr, "CullingResources : params.culledRenderer is nullptr"); _renderer = params.renderer; _bufferNamePrefix = params.bufferNamePrefix; _enableTwoStepCulling = params.enableTwoStepCulling; _materialPassDescriptorSet = params.materialPassDescriptorSet; + _isInstanced = params.isInstanced; + + params.culledRenderer->InitCullingResources(*this); // Create DrawCountBuffer { @@ -29,9 +34,13 @@ void CullingResourcesBase::Init(InitParams& params) desc.usage = Renderer::BufferUsage::INDIRECT_ARGUMENT_BUFFER | Renderer::BufferUsage::STORAGE_BUFFER | Renderer::BufferUsage::TRANSFER_DESTINATION | Renderer::BufferUsage::TRANSFER_SOURCE; _instanceCountBuffer = _renderer->CreateBuffer(_instanceCountBuffer, desc); - _occluderFillDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); - _cullingDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); - _geometryFillDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); + if (!_isInstanced) + { + _occluderFillDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); + _cullingDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); + _geometryFillDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); + } + _createIndirectAfterCullingDescriptorSet.Bind("_drawCount"_h, _instanceCountBuffer); desc.size = sizeof(u32) * Renderer::Settings::MAX_VIEWS; desc.name = _bufferNamePrefix + "DrawCountRBBuffer"; @@ -54,9 +63,13 @@ void CullingResourcesBase::Init(InitParams& params) desc.usage = Renderer::BufferUsage::STORAGE_BUFFER | Renderer::BufferUsage::TRANSFER_DESTINATION | Renderer::BufferUsage::TRANSFER_SOURCE; _triangleCountBuffer = _renderer->CreateBuffer(_triangleCountBuffer, desc); - _occluderFillDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); - _cullingDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); - _geometryFillDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); + if (!_isInstanced) + { + _occluderFillDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); + _cullingDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); + _geometryFillDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); + } + _createIndirectAfterCullingDescriptorSet.Bind("_triangleCount"_h, _triangleCountBuffer); desc.size = sizeof(u32) * Renderer::Settings::MAX_VIEWS; desc.name = _bufferNamePrefix + "TriangleCountRBBuffer"; @@ -140,13 +153,16 @@ bool CullingResourcesBase::SyncToGPU(bool forceRecount) if (_instanceRefs.SyncToGPU(_renderer)) { - _occluderFillDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); - _cullingDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); - _geometryFillDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); - _geometryPassDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); + if (_isInstanced) + { + _occluderFillDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); + _cullingDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); + } + //_geometryFillDescriptorSet.Bind2("_instanceRefTable"_h, _instanceRefs.GetBuffer()); + _geometryPassDescriptorSet.Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer(), true); if (_materialPassDescriptorSet != nullptr) { - _materialPassDescriptorSet->Bind("_instanceRefTable"_h, _instanceRefs.GetBuffer()); + _materialPassDescriptorSet->Bind("_opaqueInstanceRefTable"_h, _instanceRefs.GetBuffer()); } u32 numInstanceCapacity = static_cast(_instanceRefs.Capacity()); @@ -160,10 +176,17 @@ bool CullingResourcesBase::SyncToGPU(bool forceRecount) _culledInstanceLookupTableBuffer = _renderer->CreateBuffer(_culledInstanceLookupTableBuffer, desc); - _occluderFillDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); - _cullingDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); - _geometryFillDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); - _geometryPassDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); + if (_isInstanced) + { + _occluderFillDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); + _cullingDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); + } + //_geometryFillDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); + _geometryPassDescriptorSet.Bind("_culledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer, true); + if (_materialPassDescriptorSet != nullptr) + { + _materialPassDescriptorSet->Bind("_opaqueCulledInstanceLookupTable"_h, _culledInstanceLookupTableBuffer); + } } // (Re)create Culled DrawCall Bitmask buffer @@ -247,11 +270,14 @@ bool CullingResourcesIndexedBase::SyncToGPU(bool forceRecount) { if (_enableTwoStepCulling) { - _occluderFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); - _geometryFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); + if (!_isInstanced) + { + _occluderFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); + _geometryFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); + } } + _createIndirectAfterCullingDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); _cullingDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); - _geometryPassDescriptorSet.Bind("_modelDraws"_h, _drawCalls.GetBuffer()); if (_materialPassDescriptorSet != nullptr) { _materialPassDescriptorSet->Bind("_modelDraws"_h, _drawCalls.GetBuffer()); @@ -266,9 +292,13 @@ bool CullingResourcesIndexedBase::SyncToGPU(bool forceRecount) _culledInstanceCountsBuffer = _renderer->CreateBuffer(_culledInstanceCountsBuffer, desc); - _occluderFillDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); - _cullingDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); - _geometryFillDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); + if (_isInstanced) + { + _occluderFillDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); + _cullingDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); + _geometryFillDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); + _createIndirectAfterCullingDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); + } } // CulledDrawCallBuffer, one for each view @@ -279,9 +309,13 @@ bool CullingResourcesIndexedBase::SyncToGPU(bool forceRecount) desc.name = _bufferNamePrefix + "CulledDrawCallBuffer"; _culledDrawCallsBuffer = _renderer->CreateBuffer(_culledDrawCallsBuffer, desc); - _cullingDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); - _occluderFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); - _geometryFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + if (!_isInstanced) + { + _cullingDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + _occluderFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + _geometryFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + } + _createIndirectAfterCullingDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); } // (Re)create CulledDrawCallCountBuffer @@ -293,7 +327,7 @@ bool CullingResourcesIndexedBase::SyncToGPU(bool forceRecount) _culledDrawCallCountBuffer = _renderer->CreateBuffer(_culledDrawCallCountBuffer, desc); - _cullingDescriptorSet.Bind("_culledDrawCallCount"_h, _culledDrawCallCountBuffer); + _createIndirectAfterCullingDescriptorSet.Bind("_culledDrawCallCount"_h, _culledDrawCallCountBuffer); } gotRecreated = true; @@ -391,11 +425,14 @@ bool CullingResourcesNonIndexedBase::SyncToGPU(bool forceRecount) { if (_enableTwoStepCulling) { - _occluderFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); - _geometryFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); + if (!_isInstanced) + { + _occluderFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); + _geometryFillDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); + } + _createIndirectAfterCullingDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); } _cullingDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); - _geometryPassDescriptorSet.Bind("_modelDraws"_h, _drawCalls.GetBuffer()); if (_materialPassDescriptorSet != nullptr) { _materialPassDescriptorSet->Bind("_modelDraws"_h, _drawCalls.GetBuffer()); @@ -413,6 +450,7 @@ bool CullingResourcesNonIndexedBase::SyncToGPU(bool forceRecount) _occluderFillDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); _cullingDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); _geometryFillDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); + _createIndirectAfterCullingDescriptorSet.Bind("_culledInstanceCounts"_h, _culledInstanceCountsBuffer); } // CulledDrawCallBuffer @@ -424,9 +462,13 @@ bool CullingResourcesNonIndexedBase::SyncToGPU(bool forceRecount) _culledDrawCallsBuffer = _renderer->CreateBuffer(_culledDrawCallsBuffer, desc); - _cullingDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); - _occluderFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); - _geometryFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + if (!_isInstanced) + { + _cullingDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + _occluderFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + _geometryFillDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); + } + _createIndirectAfterCullingDescriptorSet.Bind("_culledDrawCalls"_h, _culledDrawCallsBuffer); } // (Re)create CulledDrawCallCountBuffer @@ -438,7 +480,7 @@ bool CullingResourcesNonIndexedBase::SyncToGPU(bool forceRecount) _culledDrawCallCountBuffer = _renderer->CreateBuffer(_culledDrawCallCountBuffer, desc); - _cullingDescriptorSet.Bind("_culledDrawCallCount"_h, _culledDrawCallCountBuffer); + _createIndirectAfterCullingDescriptorSet.Bind("_culledDrawCallCount"_h, _culledDrawCallCountBuffer); } gotRecreated = true; diff --git a/Source/Game-Lib/Game-Lib/Rendering/CullingResources.h b/Source/Game-Lib/Game-Lib/Rendering/CullingResources.h index 0c3727b..3199dba 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CullingResources.h +++ b/Source/Game-Lib/Game-Lib/Rendering/CullingResources.h @@ -7,6 +7,8 @@ #include #include +class CulledRenderer; + struct InstanceRef { u32 instanceID; @@ -23,10 +25,12 @@ class CullingResourcesBase struct InitParams { Renderer::Renderer* renderer = nullptr; + CulledRenderer* culledRenderer = nullptr; std::string bufferNamePrefix = ""; Renderer::DescriptorSet* materialPassDescriptorSet = nullptr; bool enableTwoStepCulling = true; + bool isInstanced = true; }; virtual void Init(InitParams& params); @@ -37,6 +41,7 @@ class CullingResourcesBase virtual u32 GetDrawCallCount() = 0; virtual bool IsIndexed() = 0; + bool IsInstanced() { return _isInstanced; } Renderer::GPUVector& GetInstanceRefs() { return _instanceRefs; } @@ -60,6 +65,7 @@ class CullingResourcesBase Renderer::DescriptorSet& GetOccluderFillDescriptorSet() { return _occluderFillDescriptorSet; } Renderer::DescriptorSet& GetCullingDescriptorSet() { return _cullingDescriptorSet; } + Renderer::DescriptorSet& GetCreateIndirectAfterCullDescriptorSet() { return _createIndirectAfterCullingDescriptorSet; } Renderer::DescriptorSet& GetGeometryFillDescriptorSet() { return _geometryFillDescriptorSet; } Renderer::DescriptorSet& GetGeometryPassDescriptorSet() { return _geometryPassDescriptorSet; } @@ -81,6 +87,7 @@ class CullingResourcesBase Renderer::Renderer* _renderer; std::string _bufferNamePrefix = ""; bool _enableTwoStepCulling; + bool _isInstanced; Renderer::GPUVector _instanceRefs; @@ -103,6 +110,7 @@ class CullingResourcesBase Renderer::DescriptorSet _occluderFillDescriptorSet; Renderer::DescriptorSet _cullingDescriptorSet; + Renderer::DescriptorSet _createIndirectAfterCullingDescriptorSet; Renderer::DescriptorSet _geometryFillDescriptorSet; Renderer::DescriptorSet _geometryPassDescriptorSet; Renderer::DescriptorSet* _materialPassDescriptorSet; @@ -192,7 +200,7 @@ class CullingResourcesIndexed : public CullingResourcesIndexedBase _drawCallDatas.SetDebugName(_bufferNamePrefix + "DrawCallDataBuffer"); _drawCallDatas.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); - SyncToGPU(false); + //SyncToGPU(false); } virtual u32 Add() override @@ -239,15 +247,14 @@ class CullingResourcesIndexed : public CullingResourcesIndexedBase // DrawCallDatas if (_drawCallDatas.SyncToGPU(_renderer)) { - _occluderFillDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); - _cullingDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); - _geometryFillDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); - _geometryPassDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); - _geometryPassDescriptorSet.Bind("_packedModelDrawCallDatas"_h, _drawCallDatas.GetBuffer()); // TODO: This should not be this hardcoded... - if (_materialPassDescriptorSet != nullptr) + if (_isInstanced) { - _materialPassDescriptorSet->Bind("_packedModelDrawCallDatas"_h, _drawCallDatas.GetBuffer()); // TODO: This should not be this hardcoded... + _occluderFillDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); + _geometryFillDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); } + _cullingDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); + _createIndirectAfterCullingDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); + _geometryPassDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer(), true); gotRecreated = true; } @@ -310,7 +317,7 @@ class CullingResourcesNonIndexed : public CullingResourcesNonIndexedBase _drawCallDatas.SetDebugName(_bufferNamePrefix + "DrawCallDataBuffer"); _drawCallDatas.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); - SyncToGPU(false); + //SyncToGPU(false); } virtual u32 Add() override @@ -360,12 +367,7 @@ class CullingResourcesNonIndexed : public CullingResourcesNonIndexedBase _occluderFillDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); _cullingDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); _geometryFillDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); - _geometryPassDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer()); - _geometryPassDescriptorSet.Bind("_packedModelDrawCallDatas"_h, _drawCallDatas.GetBuffer()); // TODO: This should not be this hardcoded... - if (_materialPassDescriptorSet != nullptr) - { - _materialPassDescriptorSet->Bind("_packedModelDrawCallDatas"_h, _drawCallDatas.GetBuffer()); // TODO: This should not be this hardcoded... - } + _geometryPassDescriptorSet.Bind("_drawCallDatas"_h, _drawCallDatas.GetBuffer(), true); gotRecreated = true; } diff --git a/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp index 298609e..ae5f808 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp @@ -28,6 +28,9 @@ DebugRenderer::DebugRenderer(Renderer::Renderer* renderer, GameRenderer* gameRen void DebugRenderer::CreatePermanentResources() { + CreatePipelines(); + InitDescriptorSets(); + _debugVertices2D.SetDebugName("DebugVertices2D"); _debugVertices2D.SetUsage(Renderer::BufferUsage::TRANSFER_DESTINATION | Renderer::BufferUsage::STORAGE_BUFFER); _debugVertices2D.SyncToGPU(_renderer); @@ -100,7 +103,10 @@ void DebugRenderer::CreatePermanentResources() }); _debugDescriptorSet.Bind("_debugVertices3DCount", _gpuDebugVertices3DArgumentBuffer); } +} +void DebugRenderer::CreatePipelines() +{ // Create pipelines Renderer::GraphicsPipelineDesc pipelineDesc; // 2D Solid and Wireframe @@ -113,18 +119,16 @@ void DebugRenderer::CreatePermanentResources() // Shader Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug2D.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Debug/Debug2D.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug2D.vs"_h, "Debug/Debug2D.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug2D.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Debug/Debug2D.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug2D.ps"_h, "Debug/Debug2D.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); pipelineDesc.states.primitiveTopology = Renderer::PrimitiveTopology::Lines; _debugLine2DPipeline = _renderer->CreatePipeline(pipelineDesc); - + pipelineDesc.states.primitiveTopology = Renderer::PrimitiveTopology::Triangles; _debugSolid2DPipeline = _renderer->CreatePipeline(pipelineDesc); } @@ -132,13 +136,11 @@ void DebugRenderer::CreatePermanentResources() { // Shader Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/DebugSolid3D.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Debug/DebugSolid3D.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/DebugSolid3D.vs"_h, "Debug/DebugSolid3D.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/DebugSolid3D.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Debug/DebugSolid3D.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/DebugSolid3D.ps"_h, "Debug/DebugSolid3D.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Depth state @@ -160,13 +162,11 @@ void DebugRenderer::CreatePermanentResources() // 3D Wireframe { Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug3D.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Debug/Debug3D.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug3D.vs"_h, "Debug/Debug3D.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug3D.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Debug/Debug3D.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Debug/Debug3D.ps"_h, "Debug/Debug3D.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); pipelineDesc.states.depthStencilState.depthWriteEnable = false; @@ -176,6 +176,35 @@ void DebugRenderer::CreatePermanentResources() } } +void DebugRenderer::InitDescriptorSets() +{ + // Line 2d + _draw2DDescriptorSet.RegisterPipeline(_renderer, _debugLine2DPipeline); + _draw2DDescriptorSet.Init(_renderer); + + _draw2DIndirectDescriptorSet.RegisterPipeline(_renderer, _debugLine2DPipeline); + _draw2DIndirectDescriptorSet.Init(_renderer); + + // Line 3d + _draw3DDescriptorSet.RegisterPipeline(_renderer, _debugLine3DPipeline); + _draw3DDescriptorSet.Init(_renderer); + + _draw3DIndirectDescriptorSet.RegisterPipeline(_renderer, _debugLine3DPipeline); + _draw3DIndirectDescriptorSet.Init(_renderer); + + // Solid 2d + _drawSolid2DDescriptorSet.RegisterPipeline(_renderer, _debugSolid2DPipeline); + _drawSolid2DDescriptorSet.Init(_renderer); + + // Solid 3d + _drawSolid3DDescriptorSet.RegisterPipeline(_renderer, _debugSolid3DPipeline); + _drawSolid3DDescriptorSet.Init(_renderer); + + // Material pass descriptor set + _debugDescriptorSet.RegisterPipeline(_renderer, _debugLine2DPipeline); + _debugDescriptorSet.Init(_renderer); +} + void DebugRenderer::Update(f32 deltaTime) { ZoneScoped; @@ -272,8 +301,8 @@ void DebugRenderer::Add2DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.drawSolid2DSet, frameIndex); + //commandList.BindDescriptorSet2(data.globalSet, frameIndex); // TODO: Enable this with validation layers and find a way to print a better warning that this shader doesn't need this descriptorset + commandList.BindDescriptorSet(data.drawSolid2DSet, frameIndex); // Draw commandList.Draw(static_cast(_debugVerticesSolid2D.Count()), 1, 0, 0); @@ -290,8 +319,8 @@ void DebugRenderer::Add2DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.draw2DSet, frameIndex); + //commandList.BindDescriptorSet2(data.globalSet, frameIndex); // TODO: Enable this with validation layers and find a way to print a better warning that this shader doesn't need this descriptorset + commandList.BindDescriptorSet(data.draw2DSet, frameIndex); // Draw commandList.Draw(static_cast(_debugVertices2D.Count()), 1, 0, 0); @@ -304,8 +333,8 @@ void DebugRenderer::Add2DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.draw2DIndirectSet, frameIndex); + //commandList.BindDescriptorSet2(data.globalSet, frameIndex); // TODO: Enable this with validation layers and find a way to print a better warning that this shader doesn't need this descriptorset + commandList.BindDescriptorSet(data.draw2DIndirectSet, frameIndex); // Draw commandList.DrawIndirect(data.gpuDebugVertices2DArgumentBuffer, 0, 1); @@ -392,8 +421,8 @@ void DebugRenderer::Add3DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.drawSolid3DSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.drawSolid3DSet, frameIndex); // Draw commandList.Draw(static_cast(_debugVerticesSolid3D.Count()), 1, 0, 0); @@ -411,8 +440,8 @@ void DebugRenderer::Add3DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.draw3DSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.draw3DSet, frameIndex); // Draw commandList.Draw(static_cast(_debugVertices3D.Count()), 1, 0, 0); @@ -425,8 +454,8 @@ void DebugRenderer::Add3DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.draw3DIndirectSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.draw3DIndirectSet, frameIndex); // Draw commandList.DrawIndirect(data.gpuDebugVertices3DArgumentBuffer, 0, 1); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.h index aa1afa6..af28f0a 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.h @@ -58,6 +58,8 @@ class DebugRenderer private: void CreatePermanentResources(); + void CreatePipelines(); + void InitDescriptorSets(); private: Renderer::Renderer* _renderer = nullptr; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.cpp index 087f84e..a6c84b1 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.cpp @@ -193,7 +193,10 @@ void JoltDebugRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Rend params.drawCallback = [&](DrawParams& drawParams) { - drawParams.isIndexed = true; + drawParams.descriptorSets = { + &data.globalSet, + &data.drawSet + }; Draw(resources, frameIndex, graphResources, commandList, drawParams); }; @@ -202,8 +205,6 @@ void JoltDebugRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Rend params.enableDrawing = CVAR_JoltDebugDrawOccluders.Get(); params.disableTwoStepCulling = CVAR_JoltDebugDisableTwoStepCulling.Get(); - params.isIndexed = true; - params.useInstancedCulling = true; OccluderPass(params); }); @@ -266,7 +267,10 @@ void JoltDebugRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Rend params.drawCallback = [&](DrawParams& drawParams) { - drawParams.isIndexed = false; + drawParams.descriptorSets = { + &data.globalSet, + &data.drawSet + }; Draw(resources, frameIndex, graphResources, commandList, drawParams); }; @@ -275,8 +279,6 @@ void JoltDebugRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Rend params.enableDrawing = CVAR_JoltDebugDrawOccluders.Get(); params.disableTwoStepCulling = CVAR_JoltDebugDisableTwoStepCulling.Get(); - params.isIndexed = false; - params.useInstancedCulling = true; OccluderPass(params); }); @@ -311,6 +313,7 @@ void JoltDebugRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, Rende Renderer::DescriptorSetResource debugSet; Renderer::DescriptorSetResource globalSet; Renderer::DescriptorSetResource cullingSet; + Renderer::DescriptorSetResource createIndirectAfterCullSet; }; if (_indexedCullingResources.GetDrawCalls().Count() > 0) @@ -364,6 +367,7 @@ void JoltDebugRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, Rende params.debugDescriptorSet = data.debugSet; params.globalDescriptorSet = data.globalSet; params.cullingDescriptorSet = data.cullingSet; + params.createIndirectAfterCullSet = data.createIndirectAfterCullSet; params.numCascades = 0; params.occlusionCull = CVAR_JoltDebugOcclusionCullingEnabled.Get(); @@ -373,8 +377,6 @@ void JoltDebugRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, Rende params.drawCallDataSize = sizeof(DrawCallData); - params.useInstancedCulling = true; - CullingPass(params); }); } @@ -439,8 +441,6 @@ void JoltDebugRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, Rende params.drawCallDataSize = sizeof(DrawCallData); - params.useInstancedCulling = true; - CullingPass(params); }); } @@ -527,14 +527,15 @@ void JoltDebugRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, Rend params.drawCallback = [&](DrawParams& drawParams) { - drawParams.isIndexed = true; + drawParams.descriptorSets = { + &data.globalSet, + &data.drawSet + }; Draw(resources, frameIndex, graphResources, commandList, drawParams); }; params.enableDrawing = CVAR_JoltDebugDrawGeometry.Get(); params.cullingEnabled = cullingEnabled; - params.useInstancedCulling = true; - params.isIndexed = true; params.numCascades = 0; GeometryPass(params); @@ -608,14 +609,15 @@ void JoltDebugRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, Rend params.drawCallback = [&](DrawParams& drawParams) { - drawParams.isIndexed = false; + drawParams.descriptorSets = { + &data.globalSet, + &data.drawSet + }; Draw(resources, frameIndex, graphResources, commandList, drawParams); }; params.enableDrawing = CVAR_JoltDebugDrawGeometry.Get(); params.cullingEnabled = cullingEnabled; - params.useInstancedCulling = true; - params.isIndexed = false; params.numCascades = 0; GeometryPass(params); @@ -856,10 +858,10 @@ void JoltDebugRenderer::Draw(const RenderResources& resources, u8 frameIndex, Re commandList.BeginPipeline(pipeline); - commandList.SetIndexBuffer(_indices.GetBuffer(), Renderer::IndexFormat::UInt32); - - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.drawDescriptorSet, frameIndex); + for (auto& descriptorSet : params.descriptorSets) + { + commandList.BindDescriptorSet(*descriptorSet, frameIndex); + } commandList.SetIndexBuffer(_indices.GetBuffer(), Renderer::IndexFormat::UInt16); @@ -867,7 +869,7 @@ void JoltDebugRenderer::Draw(const RenderResources& resources, u8 frameIndex, Re { u32 drawCountBufferOffset = params.drawCountIndex * sizeof(u32); - if (params.isIndexed) + if (params.cullingResources->IsIndexed()) { commandList.DrawIndexedIndirectCount(params.argumentBuffer, 0, params.drawCountBuffer, drawCountBufferOffset, params.numMaxDrawCalls); } @@ -878,7 +880,7 @@ void JoltDebugRenderer::Draw(const RenderResources& resources, u8 frameIndex, Re } else { - if (params.isIndexed) + if (params.cullingResources->IsIndexed()) { commandList.DrawIndexedIndirect(params.argumentBuffer, 0, params.numMaxDrawCalls); } @@ -894,6 +896,8 @@ void JoltDebugRenderer::Draw(const RenderResources& resources, u8 frameIndex, Re void JoltDebugRenderer::CreatePermanentResources() { + CreatePipelines(); + _instances.SetDebugName("JoltInstances"); _instances.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); @@ -905,47 +909,65 @@ void JoltDebugRenderer::CreatePermanentResources() CullingResourcesIndexed::InitParams indexedInitParams; indexedInitParams.renderer = _renderer; + indexedInitParams.culledRenderer = this; indexedInitParams.bufferNamePrefix = "IndexedJolt"; indexedInitParams.enableTwoStepCulling = true; + indexedInitParams.isInstanced = true; _indexedCullingResources.Init(indexedInitParams); CullingResourcesNonIndexed::InitParams initParams; initParams.renderer = _renderer; + initParams.culledRenderer = this; initParams.bufferNamePrefix = "Jolt"; initParams.enableTwoStepCulling = true; + indexedInitParams.isInstanced = true; _cullingResources.Init(initParams); + InitDescriptorSets(); SyncToGPU(); +} - // Create pipeline - { - Renderer::GraphicsPipelineDesc pipelineDesc; +void JoltDebugRenderer::CreatePipelines() +{ + Renderer::GraphicsPipelineDesc pipelineDesc; + + // Shader + Renderer::VertexShaderDesc vertexShaderDesc; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Jolt/Draw.vs"_h, "Jolt/Draw.vs"); + pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); - // Shader - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Jolt/Draw.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Jolt/Draw.vs.hlsl"; - pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); + Renderer::PixelShaderDesc pixelShaderDesc; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Jolt/Draw.ps"_h, "Jolt/Draw.ps"); + pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Jolt/Draw.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Jolt/Draw.ps.hlsl"; - pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); + // Depth state + pipelineDesc.states.depthStencilState.depthEnable = true; + pipelineDesc.states.depthStencilState.depthWriteEnable = true; + pipelineDesc.states.depthStencilState.depthFunc = Renderer::ComparisonFunc::GREATER; - // Depth state - pipelineDesc.states.depthStencilState.depthEnable = true; - pipelineDesc.states.depthStencilState.depthWriteEnable = true; - pipelineDesc.states.depthStencilState.depthFunc = Renderer::ComparisonFunc::GREATER; + // Rasterizer state + pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; + pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::Settings::FRONT_FACE_STATE; - // Rasterizer state - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::Settings::FRONT_FACE_STATE; + pipelineDesc.states.renderTargetFormats[0] = Renderer::ImageFormat::R32G32_UINT; // Visibility buffer - pipelineDesc.states.renderTargetFormats[0] = Renderer::ImageFormat::R32G32_UINT; // Visibility buffer + pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; - pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; + _drawPipeline = _renderer->CreatePipeline(pipelineDesc); +} - _drawPipeline = _renderer->CreatePipeline(pipelineDesc); +void JoltDebugRenderer::InitDescriptorSets() +{ + CullingResourcesBase* cullingResources[] = { + &_indexedCullingResources, + & _cullingResources + }; + + for (CullingResourcesBase* cullingResource : cullingResources) + { + Renderer::DescriptorSet& geometryPassDescriptorSet = cullingResource->GetGeometryPassDescriptorSet(); + geometryPassDescriptorSet.RegisterPipeline(_renderer, _drawPipeline); + geometryPassDescriptorSet.Init(_renderer); } } diff --git a/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.h index 54b8dd1..a45e073 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Debug/JoltDebugRenderer.h @@ -65,6 +65,8 @@ class JoltDebugRenderer : public CulledRenderer private: void CreatePermanentResources(); + void CreatePipelines(); + void InitDescriptorSets(); void SyncToGPU(); void Compact(); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Editor/EditorRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Editor/EditorRenderer.cpp index 3172270..e65cfc9 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Editor/EditorRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Editor/EditorRenderer.cpp @@ -78,7 +78,7 @@ void EditorRenderer::AddWorldGridPass(Renderer::RenderGraph* renderGraph, Render Renderer::GraphicsPipelineID pipeline = _worldGridPipeline; commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); struct Constants { @@ -107,13 +107,11 @@ void EditorRenderer::CreatePermanentResources() // Shaders Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Editor/WorldGrid.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Editor/WorldGrid.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Editor/WorldGrid.vs"_h, "Editor/WorldGrid.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Editor/WorldGrid.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Editor/WorldGrid.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Editor/WorldGrid.ps"_h, "Editor/WorldGrid.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Depth state diff --git a/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.cpp index 2e78405..3f4c31a 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.cpp @@ -50,6 +50,7 @@ #include #include +#include "RenderUtils.h" AutoCVar_ShowFlag CVAR_StartWindowMaximized(CVarCategory::Client, "startWindowMaximized", "determines if the window should be maximized on launch", ShowFlag::ENABLED); @@ -139,14 +140,8 @@ GameRenderer::GameRenderer(InputManager* inputManager) glfwSetWindowIconifyCallback(_window->GetWindow(), WindowIconifyCallback); _renderer = new Renderer::RendererVK(_window); - _renderer->SetGetShaderEntryCallback([this](u32 shaderNameHash) -> const Renderer::ShaderEntry& - { - return GetShaderEntry(shaderNameHash); - }); - _renderer->SetGetBlitPipelineCallback([this](u32 shaderNameHash) -> Renderer::GraphicsPipelineID - { - return GetBlitPipeline(shaderNameHash); - }); + _renderer->SetGetShaderEntryCallback(std::bind_front(&GameRenderer::GetShaderEntry, this)); + _renderer->SetGetBlitPipelineCallback(std::bind_front(&GameRenderer::GetBlitPipeline, this)); std::string shaderSourcePath = SHADER_SOURCE_DIR; _renderer->SetShaderSourceDirectory(shaderSourcePath); @@ -157,6 +152,9 @@ GameRenderer::GameRenderer(InputManager* inputManager) CreatePermanentResources(); + RenderUtils::Init(_renderer, this); + DepthPyramidUtils::Init(_renderer, this); + _debugRenderer = new DebugRenderer(_renderer, this); _joltDebugRenderer = new JoltDebugRenderer(_renderer, this, _debugRenderer); @@ -186,8 +184,6 @@ GameRenderer::GameRenderer(InputManager* inputManager) _shadowRenderer = new ShadowRenderer(_renderer, this, _debugRenderer, _terrainRenderer, _modelRenderer, _resources); _pixelQuery = new PixelQuery(_renderer, this); - DepthPyramidUtils::Init(_renderer, this); - _nameHashToCursor.reserve(128); } @@ -198,6 +194,7 @@ GameRenderer::~GameRenderer() bool GameRenderer::UpdateWindow(f32 deltaTime) { + ZoneScoped; return _window->Update(deltaTime); } @@ -291,6 +288,12 @@ f32 GameRenderer::Render() struct StartFramePassData { Renderer::ImageMutableResource sceneColor; + + Renderer::DescriptorSetResource debugSet; + Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource lightSet; + Renderer::DescriptorSetResource modelSet; + Renderer::DescriptorSetResource terrainSet; }; renderGraph.AddPass("StartFramePass", @@ -308,7 +311,13 @@ f32 GameRenderer::Render() builder.Write(_resources.skyboxDepth, Renderer::PipelineType::GRAPHICS, Renderer::LoadMode::CLEAR); builder.Write(_resources.packedNormals, Renderer::PipelineType::GRAPHICS, Renderer::LoadMode::CLEAR); builder.Write(_resources.ssaoTarget, Renderer::PipelineType::GRAPHICS, Renderer::LoadMode::CLEAR); - + + data.debugSet = builder.Use(_resources.debugDescriptorSet); + data.globalSet = builder.Use(_resources.globalDescriptorSet); + data.lightSet = builder.Use(_resources.lightDescriptorSet); + data.modelSet = builder.Use(_resources.modelDescriptorSet); + data.terrainSet = builder.Use(_resources.terrainDescriptorSet); + return true; // Return true from setup to enable this pass, return false to disable it }, [this](StartFramePassData& data, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList) // Execute @@ -367,8 +376,6 @@ f32 GameRenderer::Render() GPU_SCOPED_PROFILER_ZONE(commandList, BuildPyramid); DepthPyramidUtils::BuildPyramidParams params; - params.renderer = _renderer; - params.gameRenderer = this; params.graphResources = &graphResources; params.commandList = &commandList; params.resources = &_resources; @@ -491,13 +498,20 @@ bool GameRenderer::SetCursor(u32 nameHash, u32 imguiMouseCursor /*= 0*/) return true; } -const Renderer::ShaderEntry& GameRenderer::GetShaderEntry(u32 shaderNameHash) +const Renderer::ShaderEntry* GameRenderer::GetShaderEntry(u32 shaderNameHash, const std::string& debugName) { if (_shaderNameHashToShaderEntry.contains(shaderNameHash) == false) { NC_LOG_CRITICAL("GameRenderer::GetShaderEntry Tried to get ShaderEntry for unknown shader name hash: {}", shaderNameHash); } - return _shaderNameHashToShaderEntry[shaderNameHash]; + + Renderer::ShaderEntry& entry = _shaderNameHashToShaderEntry[shaderNameHash]; + if (entry.debugName.empty()) + { + entry.debugName = debugName; + } + + return &entry; } Renderer::GraphicsPipelineID GameRenderer::GetBlitPipeline(u32 shaderNameHash) @@ -510,6 +524,16 @@ Renderer::GraphicsPipelineID GameRenderer::GetBlitPipeline(u32 shaderNameHash) return _blitPipelines[shaderNameHash]; } +Renderer::GraphicsPipelineID GameRenderer::GetOverlayPipeline(u32 shaderNameHash) +{ + if (_overlayPipelines.contains(shaderNameHash) == false) + { + NC_LOG_CRITICAL("GameRenderer::GetOverlayPipeline Tried to get Overlay Pipeline for unknown shader name hash: {}", shaderNameHash); + } + + return _overlayPipelines[shaderNameHash]; +} + bool GameRenderer::SetImguiTheme(u32 themeNameHash) { if (!_themeNameHashToIndex.contains(themeNameHash)) @@ -535,6 +559,7 @@ void GameRenderer::CreatePermanentResources() { CreateRenderTargets(); LoadShaderPacks(); + InitDescriptorSets(); CreateBlitPipelines(); // Frame allocator, this is a fast allocator for data that is only needed this frame @@ -678,6 +703,44 @@ void GameRenderer::CreateRenderTargets() _resources.depthColorCopy = _renderer->CreateImage(depthColorCopyDesc); } +void GameRenderer::InitDescriptorSets() +{ + // Load dummy shader containing includes of all descriptor sets + Renderer::ComputeShaderDesc shaderDesc; + shaderDesc.shaderEntry = GetShaderEntry("DescriptorSet/_IncludeAll.cs"_h, "DescriptorSet/_IncludeAll.cs"); + Renderer::ComputeShaderID computeShader = _renderer->LoadShader(shaderDesc); + + // Create a dummy pipeline from it + Renderer::ComputePipelineDesc pipelineDesc; + pipelineDesc.computeShader = computeShader; + _allDescriptorSetComputePipeline = _renderer->CreatePipeline(pipelineDesc); + + Renderer::DescriptorSet* descriptorSets[] = + { + &_resources.debugDescriptorSet, + &_resources.globalDescriptorSet, + &_resources.lightDescriptorSet, + &_resources.terrainDescriptorSet, + &_resources.modelDescriptorSet + }; + + for(Renderer::DescriptorSet* descriptorSet : descriptorSets) + { + descriptorSet->RegisterPipeline(_renderer, _allDescriptorSetComputePipeline); + descriptorSet->Init(_renderer); + } + + // Create a dummy graphics pipeline + Renderer::VertexShaderDesc vertexShaderDesc; + vertexShaderDesc.shaderEntry = GetShaderEntry("DescriptorSet/_IncludeAll.vs"_h, "DescriptorSet/_IncludeAll.vs"); + Renderer::VertexShaderID vertexShader = _renderer->LoadShader(vertexShaderDesc); + + Renderer::GraphicsPipelineDesc graphicsPipelineDesc; + graphicsPipelineDesc.states.vertexShader = vertexShader; + + _allDescriptorSetGraphicsPipeline = _renderer->CreatePipeline(graphicsPipelineDesc); +} + void GameRenderer::LoadShaderPacks() { // Load all shader packs into memory @@ -728,6 +791,8 @@ void GameRenderer::LoadShaderPack(std::shared_ptr buffer, FileFormat .shaderData = buffer->GetDataPointer() + shaderRef->dataOffset, .shaderSize = shaderRef->dataSize, }; + shaderPack.GetShaderReflection(buffer, i, shaderEntry.reflection); + _shaderNameHashToShaderEntry[shaderRef->permutationNameHash] = shaderEntry; } } @@ -735,8 +800,7 @@ void GameRenderer::LoadShaderPack(std::shared_ptr buffer, FileFormat void GameRenderer::CreateBlitPipelines() { Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Blitting/Blit.vs.hlsl"; + vertexShaderDesc.shaderEntry = GetShaderEntry("Blitting/Blit.vs"_h, "Blitting/Blit.vs"); Renderer::VertexShaderID vertexShader = _renderer->LoadShader(vertexShaderDesc); const char* textureTypes[] = @@ -752,6 +816,7 @@ void GameRenderer::CreateBlitPipelines() pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; pipelineDesc.states.renderTargetFormats[0] = _renderer->GetSwapChainImageFormat(); + // Create blit pipelines for all texture types and component counts for (u32 i = 0; i < 3; i++) { const char* textureType = textureTypes[i]; @@ -768,11 +833,10 @@ void GameRenderer::CreateBlitPipelines() { { "TEX_TYPE", componentTypeName } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps", permutationFields); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Blit_" + componentTypeName; + pixelShaderDesc.shaderEntry = GetShaderEntry(shaderEntryNameHash, "Blitting/Blit.ps"); pipelineDesc.debugName = "Blit_" + componentTypeName; pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); @@ -781,6 +845,42 @@ void GameRenderer::CreateBlitPipelines() _blitPipelines[componentTypeNameHash] = _renderer->CreatePipeline(pipelineDesc); } } + + // Set additive blending for overlay pipelines + pipelineDesc.states.blendState.renderTargets[0].blendEnable = true; + pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; + pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::SRC_ALPHA; + pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ONE; + + // Create overlay pipelines for all texture types and component counts + for (u32 i = 0; i < 3; i++) + { + const char* textureType = textureTypes[i]; + + for (u32 j = 1; j <= 4; j++) + { + std::string componentTypeName = textureType; + if (j > 1) + { + componentTypeName.append(std::to_string(j)); + } + + std::vector permutationFields = + { + { "TEX_TYPE", componentTypeName } + }; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps", permutationFields); + + Renderer::PixelShaderDesc pixelShaderDesc; + pixelShaderDesc.shaderEntry = GetShaderEntry(shaderEntryNameHash, "Blitting/Blit.ps"); + pipelineDesc.debugName = "Blit_" + componentTypeName; + + pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); + + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.length()); + _overlayPipelines[componentTypeNameHash] = _renderer->CreatePipeline(pipelineDesc); + } + } } void GameRenderer::CreateImguiThemes() diff --git a/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.h index 3b00fa5..ec0bd9f 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/GameRenderer.h @@ -4,6 +4,8 @@ #include #include +#include + #include namespace Renderer @@ -16,11 +18,6 @@ namespace Novus class Window; } -namespace FileFormat -{ - struct ShaderPack; -} - struct GLFWwindow; struct GLFWimage; struct GLFWcursor; @@ -91,8 +88,9 @@ class GameRenderer RenderResources& GetRenderResources() { return _resources; } PixelQuery* GetPixelQuery() { return _pixelQuery; } - const Renderer::ShaderEntry& GetShaderEntry(u32 shaderNameHash); + const Renderer::ShaderEntry* GetShaderEntry(u32 shaderNameHash, const std::string& debugName); Renderer::GraphicsPipelineID GetBlitPipeline(u32 shaderNameHash); + Renderer::GraphicsPipelineID GetOverlayPipeline(u32 shaderNameHash); const std::vector& GetImguiThemes() { return _imguiThemes; } bool IsCurrentTheme(u32 themeNameHash) { return _currentThemeHash == themeNameHash; } @@ -103,6 +101,7 @@ class GameRenderer private: void CreatePermanentResources(); + void InitDescriptorSets(); void CreateRenderTargets(); void LoadShaderPacks(); @@ -130,6 +129,9 @@ class GameRenderer vec2 _lastWindowSize = vec2(1, 1); RenderResources _resources; + Renderer::ComputePipelineID _allDescriptorSetComputePipeline; + Renderer::GraphicsPipelineID _allDescriptorSetGraphicsPipeline; + // Sub Renderers TerrainRenderer* _terrainRenderer = nullptr; TerrainLoader* _terrainLoader = nullptr; @@ -166,4 +168,5 @@ class GameRenderer robin_hood::unordered_map _shaderNameHashToShaderEntry; robin_hood::unordered_map _blitPipelines; + robin_hood::unordered_map _overlayPipelines; }; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.cpp index c496825..f503b77 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.cpp @@ -34,7 +34,6 @@ LightRenderer::LightRenderer(Renderer::Renderer* renderer, GameRenderer* gameRen , _modelRenderer(modelRenderer) , _classifyPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) , _debugPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) - , _materialPassDescriptorSet(Renderer::DescriptorSetSlot::LIGHT) { CreatePermanentResources(); } @@ -196,8 +195,7 @@ void LightRenderer::Update(f32 deltaTime) } } - /* - ECS::Util::EventUtil::OnEvent([&](const ECS::Components::MapLoadedEvent& event) + /*ECS::Util::EventUtil::OnEvent([&](const ECS::Components::MapLoadedEvent& event) { entt::registry* registry = ServiceLocator::GetEnttRegistries()->gameRegistry; @@ -298,12 +296,12 @@ void LightRenderer::AddClassificationPass(Renderer::RenderGraph* renderGraph, Re commandList.PushConstant(constants, 0, sizeof(Constants)); data.classifySet.Bind("_depthRT", data.depth); - data.classifySet.BindStorage("_debugTexture", data.debugColor); + //data.classifySet.Bind("_debugTexture", data.debugColor); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, data.debugSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.classifySet, frameIndex); + commandList.BindDescriptorSet(data.debugSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.classifySet, frameIndex); commandList.Dispatch(numTilesX, numTilesY, 1); @@ -346,7 +344,7 @@ void LightRenderer::AddDebugPass(Renderer::RenderGraph* renderGraph, RenderResou overlayParams.overlayImage = data.debug; overlayParams.descriptorSet = data.debugSet; - RenderUtils::Overlay(_renderer, _gameRenderer, graphResources, commandList, frameIndex, overlayParams); + RenderUtils::Overlay(graphResources, commandList, frameIndex, overlayParams); }); } @@ -377,6 +375,20 @@ void LightRenderer::RemoveDecal(entt::entity entity) void LightRenderer::CreatePermanentResources() { + // Create pipeline + Renderer::ComputePipelineDesc pipelineDesc; + pipelineDesc.debugName = "LightClassification"; + + Renderer::ComputeShaderDesc shaderDesc; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Light/Classification.cs"_h, "Light/Classification.cs"); + pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); + + _classificationPipeline = _renderer->CreatePipeline(pipelineDesc); + + // Create descriptor sets + _classifyPassDescriptorSet.RegisterPipeline(_renderer, _classificationPipeline); + _classifyPassDescriptorSet.Init(_renderer); + _decals.SetDebugName("Decals"); _decals.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); @@ -388,16 +400,12 @@ void LightRenderer::CreatePermanentResources() _decalAddWork.resize(64); _decalRemoveWork.resize(64); - // Create pipeline - Renderer::ComputePipelineDesc pipelineDesc; - pipelineDesc.debugName = "LightClassification"; - - Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Light/Classification.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Light/Classification.cs.hlsl"; - pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); - - _classificationPipeline = _renderer->CreatePipeline(pipelineDesc); + // Init debug pass descriptor set + std::string componentTypeName = Renderer::GetTextureTypeName(Renderer::ImageFormat::B8G8R8A8_UNORM_SRGB); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID debugPipeline = _gameRenderer->GetOverlayPipeline(componentTypeNameHash); + _debugPassDescriptorSet.RegisterPipeline(_renderer, debugPipeline); + _debugPassDescriptorSet.Init(_renderer); } u32 LightRenderer::CalculateNumTiles(const vec2& size) @@ -424,6 +432,8 @@ void LightRenderer::RegisterMaterialPassBufferUsage(Renderer::RenderGraphBuilder void LightRenderer::RecreateBuffer(const vec2& size) { + RenderResources& resources = _gameRenderer->GetRenderResources(); + u32 numTiles = CalculateNumTiles(size); Renderer::BufferDesc bufferDesc; @@ -434,14 +444,15 @@ void LightRenderer::RecreateBuffer(const vec2& size) _entityTilesBuffer = _renderer->CreateBuffer(_entityTilesBuffer, bufferDesc); _classifyPassDescriptorSet.Bind("_entityTiles", _entityTilesBuffer); - _materialPassDescriptorSet.Bind("_entityTiles", _entityTilesBuffer); + resources.lightDescriptorSet.Bind("_entityTiles", _entityTilesBuffer); } void LightRenderer::SyncToGPU() { if (_decals.SyncToGPU(_renderer)) { + RenderResources& resources = _gameRenderer->GetRenderResources(); _classifyPassDescriptorSet.Bind("_packedDecals", _decals.GetBuffer()); - _materialPassDescriptorSet.Bind("_packedDecals", _decals.GetBuffer()); + resources.lightDescriptorSet.Bind("_packedDecals", _decals.GetBuffer()); } } \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.h index 1b5cdde..615813a 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Light/LightRenderer.h @@ -44,7 +44,6 @@ class LightRenderer inline u32 CalculateNumTiles(const vec2& size); uvec2 CalculateNumTiles2D(const vec2& size); - Renderer::DescriptorSet& GetTileDescriptorSet() { return _materialPassDescriptorSet; } void RegisterMaterialPassBufferUsage(Renderer::RenderGraphBuilder& builder); private: @@ -87,7 +86,6 @@ class LightRenderer Renderer::DescriptorSet _classifyPassDescriptorSet; Renderer::DescriptorSet _debugPassDescriptorSet; - Renderer::DescriptorSet _materialPassDescriptorSet; Renderer::GPUVector _decals; robin_hood::unordered_map _decalIDToEntity; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.cpp index 2230d97..d61d45e 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.cpp @@ -283,6 +283,7 @@ void LiquidRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderRe Renderer::DescriptorSetResource debugSet; Renderer::DescriptorSetResource globalSet; Renderer::DescriptorSetResource cullingSet; + Renderer::DescriptorSetResource createIndirectAfterCullSet; }; renderGraph->AddPass("Liquid Culling", @@ -337,6 +338,7 @@ void LiquidRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderRe params.debugDescriptorSet = data.debugSet; params.globalDescriptorSet = data.globalSet; params.cullingDescriptorSet = data.cullingSet; + params.createIndirectAfterCullSet = data.cullingSet; params.numCascades = 0;// *CVarSystem::Get()->GetIntCVar(CVarCategory::Client | CVarCategory::Rendering, "numShadowCascades"_h); params.occlusionCull = CVAR_LiquidOcclusionCullingEnabled.Get(); @@ -391,7 +393,7 @@ void LiquidRenderer::AddCopyDepthPass(Renderer::RenderGraph* renderGraph, Render copyParams.destinationMip = 0; copyParams.descriptorSet = data.copySet; - RenderUtils::CopyDepthToColor(_renderer, _gameRenderer, graphResources, commandList, frameIndex, copyParams); + RenderUtils::CopyDepthToColor(graphResources, commandList, frameIndex, copyParams); }); } @@ -482,8 +484,13 @@ void LiquidRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, RenderR params.globalDescriptorSet = data.globalSet; params.drawDescriptorSet = data.drawSet; - params.drawCallback = [&](const DrawParams& drawParams) + params.drawCallback = [&](DrawParams& drawParams) { + drawParams.descriptorSets = { + &data.globalSet, + &data.drawSet + }; + Draw(resources, frameIndex, graphResources, commandList, drawParams); }; @@ -497,13 +504,19 @@ void LiquidRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, RenderR void LiquidRenderer::CreatePermanentResources() { + CreatePipelines(); + CullingResourcesIndexed::InitParams initParams; initParams.renderer = _renderer; + initParams.culledRenderer = this; initParams.bufferNamePrefix = "Liquid"; initParams.materialPassDescriptorSet = nullptr; // Transparencies, we don't draw these in materialPass initParams.enableTwoStepCulling = false; + initParams.isInstanced = false; _cullingResources.Init(initParams); + InitDescriptorSets(); + _constants.shallowOceanColor = Color::FromBGR32(2635575); _constants.deepOceanColor = Color::FromBGR32(1387070); _constants.shallowRiverColor = Color::FromBGR32(1856070); @@ -610,57 +623,65 @@ void LiquidRenderer::CreatePermanentResources() return true; }); +} - // Create pipeline - { - Renderer::GraphicsPipelineDesc pipelineDesc; - - // Shaders - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Liquid/Draw.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Liquid/Draw.vs.hlsl"; - pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Liquid/Draw.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Liquid/Draw.ps.hlsl"; - pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); - - // Depth state - pipelineDesc.states.depthStencilState.depthEnable = true; - pipelineDesc.states.depthStencilState.depthFunc = Renderer::ComparisonFunc::GREATER; - - // Rasterizer state - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::Settings::FRONT_FACE_STATE; - - // Blend state - pipelineDesc.states.blendState.independentBlendEnable = true; - - pipelineDesc.states.blendState.renderTargets[0].blendEnable = true; - pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; - pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::ONE; - pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ONE; - pipelineDesc.states.blendState.renderTargets[0].srcBlendAlpha = Renderer::BlendMode::ONE; - pipelineDesc.states.blendState.renderTargets[0].destBlendAlpha = Renderer::BlendMode::ONE; - pipelineDesc.states.blendState.renderTargets[0].blendOpAlpha = Renderer::BlendOp::ADD; - - pipelineDesc.states.blendState.renderTargets[1].blendEnable = true; - pipelineDesc.states.blendState.renderTargets[1].blendOp = Renderer::BlendOp::ADD; - pipelineDesc.states.blendState.renderTargets[1].srcBlend = Renderer::BlendMode::ZERO; - pipelineDesc.states.blendState.renderTargets[1].destBlend = Renderer::BlendMode::INV_SRC_ALPHA; - pipelineDesc.states.blendState.renderTargets[1].srcBlendAlpha = Renderer::BlendMode::ZERO; - pipelineDesc.states.blendState.renderTargets[1].destBlendAlpha = Renderer::BlendMode::INV_SRC_ALPHA; - pipelineDesc.states.blendState.renderTargets[1].blendOpAlpha = Renderer::BlendOp::ADD; - - // Render targets - pipelineDesc.states.renderTargetFormats[0] = Renderer::ImageFormat::R16G16B16A16_FLOAT; - pipelineDesc.states.renderTargetFormats[1] = Renderer::ImageFormat::R16_FLOAT; - - pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; - - _liquidPipeline = _renderer->CreatePipeline(pipelineDesc); // This will compile the pipeline and return the ID, or just return ID of cached pipeline - } +void LiquidRenderer::CreatePipelines() +{ + Renderer::GraphicsPipelineDesc pipelineDesc; + + // Shaders + Renderer::VertexShaderDesc vertexShaderDesc; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Liquid/Draw.vs"_h, "Liquid/Draw.vs"); + pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); + + Renderer::PixelShaderDesc pixelShaderDesc; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Liquid/Draw.ps"_h, "Liquid/Draw.ps"); + pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); + + // Depth state + pipelineDesc.states.depthStencilState.depthEnable = true; + pipelineDesc.states.depthStencilState.depthFunc = Renderer::ComparisonFunc::GREATER; + + // Rasterizer state + pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; + pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::Settings::FRONT_FACE_STATE; + + // Blend state + pipelineDesc.states.blendState.independentBlendEnable = true; + + pipelineDesc.states.blendState.renderTargets[0].blendEnable = true; + pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; + pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::ONE; + pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ONE; + pipelineDesc.states.blendState.renderTargets[0].srcBlendAlpha = Renderer::BlendMode::ONE; + pipelineDesc.states.blendState.renderTargets[0].destBlendAlpha = Renderer::BlendMode::ONE; + pipelineDesc.states.blendState.renderTargets[0].blendOpAlpha = Renderer::BlendOp::ADD; + + pipelineDesc.states.blendState.renderTargets[1].blendEnable = true; + pipelineDesc.states.blendState.renderTargets[1].blendOp = Renderer::BlendOp::ADD; + pipelineDesc.states.blendState.renderTargets[1].srcBlend = Renderer::BlendMode::ZERO; + pipelineDesc.states.blendState.renderTargets[1].destBlend = Renderer::BlendMode::INV_SRC_ALPHA; + pipelineDesc.states.blendState.renderTargets[1].srcBlendAlpha = Renderer::BlendMode::ZERO; + pipelineDesc.states.blendState.renderTargets[1].destBlendAlpha = Renderer::BlendMode::INV_SRC_ALPHA; + pipelineDesc.states.blendState.renderTargets[1].blendOpAlpha = Renderer::BlendOp::ADD; + + // Render targets + pipelineDesc.states.renderTargetFormats[0] = Renderer::ImageFormat::R16G16B16A16_FLOAT; + pipelineDesc.states.renderTargetFormats[1] = Renderer::ImageFormat::R16_FLOAT; + + pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; + + _liquidPipeline = _renderer->CreatePipeline(pipelineDesc); // This will compile the pipeline and return the ID, or just return ID of cached pipeline +} + +void LiquidRenderer::InitDescriptorSets() +{ + Renderer::DescriptorSet& geometryPassDescriptorSet = _cullingResources.GetGeometryPassDescriptorSet(); + geometryPassDescriptorSet.RegisterPipeline(_renderer, _liquidPipeline); + geometryPassDescriptorSet.Init(_renderer); + + _copyDescriptorSet.RegisterPipeline(_renderer, RenderUtils::GetCopyDepthToColorPipeline()); + _copyDescriptorSet.Init(_renderer); } void LiquidRenderer::SyncToGPU() @@ -684,7 +705,7 @@ void LiquidRenderer::SyncToGPU() if (_indices.SyncToGPU(_renderer)) { - _cullingResources.GetGeometryPassDescriptorSet().Bind("_modelIndices"_h, _indices.GetBuffer()); + } } @@ -716,8 +737,10 @@ void LiquidRenderer::Draw(const RenderResources& resources, u8 frameIndex, Rende Renderer::GraphicsPipelineID pipeline = _liquidPipeline; commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.drawDescriptorSet, frameIndex); + for (auto& descriptorSet : params.descriptorSets) + { + commandList.BindDescriptorSet(*descriptorSet, frameIndex); + } commandList.PushConstant(&_constants, 0, sizeof(Constants)); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.h index b65a677..d00791b 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Liquid/LiquidRenderer.h @@ -122,6 +122,8 @@ class LiquidRenderer : CulledRenderer private: void CreatePermanentResources(); + void CreatePipelines(); + void InitDescriptorSets(); void SyncToGPU(); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp index b03cf16..54850ea 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp @@ -48,6 +48,9 @@ void MaterialRenderer::Update(f32 deltaTime) ZoneScoped; SyncToGPU(); + + Editor::Viewport* viewport = ServiceLocator::GetEditorHandler()->GetViewport(); + Util::Physics::GetMouseWorldPosition(viewport, _mouseWorldPosition); } void MaterialRenderer::AddPreEffectsPass(Renderer::RenderGraph* renderGraph, RenderResources& resources, u8 frameIndex) @@ -58,9 +61,9 @@ void MaterialRenderer::AddPreEffectsPass(Renderer::RenderGraph* renderGraph, Ren Renderer::ImageMutableResource packedNormals; Renderer::DescriptorSetResource globalSet; - Renderer::DescriptorSetResource preEffectsSet; Renderer::DescriptorSetResource terrainSet; Renderer::DescriptorSetResource modelSet; + Renderer::DescriptorSetResource preEffectsSet; }; renderGraph->AddPass("Pre Effects", @@ -71,13 +74,10 @@ void MaterialRenderer::AddPreEffectsPass(Renderer::RenderGraph* renderGraph, Ren builder.Read(resources.cameras.GetBuffer(), Renderer::BufferPassUsage::COMPUTE); - Renderer::DescriptorSet& terrainDescriptorSet = _terrainRenderer->GetMaterialPassDescriptorSet(); - Renderer::DescriptorSet& modelDescriptorSet = _modelRenderer->GetMaterialPassDescriptorSet(); - data.globalSet = builder.Use(resources.globalDescriptorSet); + data.terrainSet = builder.Use(resources.terrainDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); data.preEffectsSet = builder.Use(_preEffectsPassDescriptorSet); - data.terrainSet = builder.Use(terrainDescriptorSet); - data.modelSet = builder.Use(modelDescriptorSet); _terrainRenderer->RegisterMaterialPassBufferUsage(builder); _modelRenderer->RegisterMaterialPassBufferUsage(builder); @@ -91,13 +91,13 @@ void MaterialRenderer::AddPreEffectsPass(Renderer::RenderGraph* renderGraph, Ren commandList.BeginPipeline(_preEffectsPipeline); data.preEffectsSet.Bind("_visibilityBuffer", data.visibilityBuffer); - data.preEffectsSet.BindStorage("_packedNormals", data.packedNormals, 0); + data.preEffectsSet.Bind("_packedNormals", data.packedNormals); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN, data.terrainSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::MODEL, data.modelSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.preEffectsSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.terrainSet, frameIndex); + commandList.BindDescriptorSet(data.modelSet, frameIndex); + commandList.BindDescriptorSet(data.preEffectsSet, frameIndex); vec2 outputSize = static_cast(_renderer->GetImageDimensions(resources.packedNormals, 0)); @@ -124,17 +124,16 @@ void MaterialRenderer::AddMaterialPass(Renderer::RenderGraph* renderGraph, Rende Renderer::ImageResource skyboxColor; Renderer::ImageResource transparency; Renderer::ImageResource transparencyWeights; - Renderer::DepthImageResource depth; Renderer::ImageMutableResource resolvedColor; Renderer::ImageResource ambientOcclusion; + Renderer::DescriptorSetResource debugSet; Renderer::DescriptorSetResource globalSet; - Renderer::DescriptorSetResource tilesSet; Renderer::DescriptorSetResource lightSet; - Renderer::DescriptorSetResource materialSet; Renderer::DescriptorSetResource terrainSet; Renderer::DescriptorSetResource modelSet; + Renderer::DescriptorSetResource materialSet; }; const i32 visibilityBufferDebugID = Math::Clamp(CVAR_VisibilityBufferDebugID.Get(), 0, 4); @@ -146,7 +145,6 @@ void MaterialRenderer::AddMaterialPass(Renderer::RenderGraph* renderGraph, Rende data.skyboxColor = builder.Read(resources.skyboxColor, Renderer::PipelineType::COMPUTE); data.transparency = builder.Read(resources.transparency, Renderer::PipelineType::COMPUTE); data.transparencyWeights = builder.Read(resources.transparencyWeights, Renderer::PipelineType::COMPUTE); - data.depth = builder.Read(resources.depth, Renderer::PipelineType::COMPUTE); data.resolvedColor = builder.Write(resources.sceneColor, Renderer::PipelineType::COMPUTE, Renderer::LoadMode::LOAD); data.ambientOcclusion = builder.Read(resources.ssaoTarget, Renderer::PipelineType::COMPUTE); @@ -154,16 +152,12 @@ void MaterialRenderer::AddMaterialPass(Renderer::RenderGraph* renderGraph, Rende builder.Read(resources.cameras.GetBuffer(), Renderer::BufferPassUsage::COMPUTE); builder.Read(_directionalLights.GetBuffer(), Renderer::BufferPassUsage::COMPUTE); - Renderer::DescriptorSet& tileDescriptorSet = _lightRenderer->GetTileDescriptorSet(); - Renderer::DescriptorSet& terrainDescriptorSet = _terrainRenderer->GetMaterialPassDescriptorSet(); - Renderer::DescriptorSet& modelDescriptorSet = _modelRenderer->GetMaterialPassDescriptorSet(); - + data.debugSet = builder.Use(resources.debugDescriptorSet); data.globalSet = builder.Use(resources.globalDescriptorSet); - data.tilesSet = builder.Use(tileDescriptorSet); data.lightSet = builder.Use(resources.lightDescriptorSet); + data.terrainSet = builder.Use(resources.terrainDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); data.materialSet = builder.Use(_materialPassDescriptorSet); - data.terrainSet = builder.Use(terrainDescriptorSet); - data.modelSet = builder.Use(modelDescriptorSet); _terrainRenderer->RegisterMaterialPassBufferUsage(builder); _modelRenderer->RegisterMaterialPassBufferUsage(builder); @@ -182,26 +176,20 @@ void MaterialRenderer::AddMaterialPass(Renderer::RenderGraph* renderGraph, Rende data.materialSet.Bind("_skyboxColor", data.skyboxColor); data.materialSet.Bind("_transparency", data.transparency); data.materialSet.Bind("_transparencyWeights", data.transparencyWeights); - data.materialSet.Bind("_depth"_h, data.depth); - data.materialSet.BindStorage("_resolvedColor", data.resolvedColor, 0); + data.materialSet.Bind("_resolvedColor", data.resolvedColor); data.materialSet.Bind("_ambientOcclusion", data.ambientOcclusion); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::TILES, data.tilesSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::LIGHT, data.lightSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN, data.terrainSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::MODEL, data.modelSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.materialSet, frameIndex); + commandList.BindDescriptorSet(data.debugSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.lightSet, frameIndex); + commandList.BindDescriptorSet(data.terrainSet, frameIndex); + commandList.BindDescriptorSet(data.modelSet, frameIndex); + commandList.BindDescriptorSet(data.materialSet, frameIndex); //if (CVAR_DrawTerrainWireframe.Get() == ShowFlag::ENABLED) { - Editor::Viewport* viewport = ServiceLocator::GetEditorHandler()->GetViewport(); - - vec3 mouseWorldPosition = vec3(0, 0, 0); - Util::Physics::GetMouseWorldPosition(viewport, mouseWorldPosition); - struct Constants { vec4 renderInfo; // x = Render Width, y = Render Height, z = 1/Width, w = 1/Height @@ -235,7 +223,7 @@ void MaterialRenderer::AddMaterialPass(Renderer::RenderGraph* renderGraph, Rende constants->fogSettings.y = CVAR_FogBeginDist.GetFloat(); constants->fogSettings.z = CVAR_FogEndDist.GetFloat(); - constants->mouseWorldPos = vec4(mouseWorldPosition, 1.0f); + constants->mouseWorldPos = vec4(_mouseWorldPosition, 1.0f); Editor::TerrainTools* terrainTools = ServiceLocator::GetEditorHandler()->GetTerrainTools(); constants->brushSettings.x = terrainTools->GetHardness(); constants->brushSettings.y = terrainTools->GetRadius(); @@ -297,8 +285,7 @@ void MaterialRenderer::CreatePermanentResources() { // Create Pre-Effects Pipeline Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Material/PreEffectsPass.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Material/PreEffectsPass.cs.hlsl"; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Material/PreEffectsPass.cs"_h, "Material/PreEffectsPass.cs"); Renderer::ComputePipelineDesc pipelineDesc; pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); @@ -321,9 +308,12 @@ void MaterialRenderer::CreatePermanentResources() CreateMaterialPipeline(); }); - // Register pipelines with descriptor sets + // Register pipelines with descriptor sets and init _preEffectsPassDescriptorSet.RegisterPipeline(_renderer, _preEffectsPipeline); + _preEffectsPassDescriptorSet.Init(_renderer); + _materialPassDescriptorSet.RegisterPipeline(_renderer, _materialPipeline); + _materialPassDescriptorSet.Init(_renderer); Renderer::SamplerDesc samplerDesc; samplerDesc.enabled = true; @@ -363,14 +353,12 @@ void MaterialRenderer::CreateMaterialPipeline() { { "DEBUG_ID", std::to_string(CVAR_VisibilityBufferDebugID.Get()) }, { "SHADOW_FILTER_MODE", std::to_string(shadowFilterMode) }, - { "SUPPORTS_EXTENDED_TEXTURES", _renderer->HasExtendedTextureSupport() ? "1" : "0" }, { "EDITOR_MODE", CVAR_DrawTerrainWireframe.Get() == ShowFlag::ENABLED ? "1" : "0" } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Material/MaterialPass.cs.hlsl", permutationFields); + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Material/MaterialPass.cs", permutationFields); Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - shaderDesc.shaderEntry.debugName = "Material/MaterialPass.cs.hlsl"; + shaderDesc.shaderEntry = shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Material/MaterialPass.cs"); Renderer::ComputePipelineDesc pipelineDesc; pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.h index 1e90200..db12214 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.h @@ -63,6 +63,8 @@ class MaterialRenderer Renderer::SamplerID _sampler; + vec3 _mouseWorldPosition; + TerrainRenderer* _terrainRenderer = nullptr; ModelRenderer* _modelRenderer = nullptr; LightRenderer* _lightRenderer = nullptr; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp index 3e5d1b7..5ab48cf 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp @@ -58,7 +58,6 @@ ModelRenderer::ModelRenderer(Renderer::Renderer* renderer, GameRenderer* gameRen , _renderer(renderer) , _gameRenderer(gameRenderer) , _debugRenderer(debugRenderer) - , _materialPassDescriptorSet(Renderer::DescriptorSetSlot::MODEL) { CreatePermanentResources(); @@ -427,6 +426,8 @@ void ModelRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, RenderRe Renderer::BufferMutableResource triangleCountReadBackBuffer; Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource modelSet; + Renderer::DescriptorSetResource occluderFillSet; Renderer::DescriptorSetResource createIndirectDescriptorSet; Renderer::DescriptorSetResource drawSet; @@ -463,6 +464,7 @@ void ModelRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, RenderRe builder.Write(_animatedVertices.GetBuffer(), BufferUsage::GRAPHICS | BufferUsage::COMPUTE); data.globalSet = builder.Use(resources.globalDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); return true; // Return true from setup to enable this pass, return false to disable it }, @@ -499,8 +501,12 @@ void ModelRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, RenderRe params.createIndirectDescriptorSet = data.createIndirectDescriptorSet; params.drawDescriptorSet = data.drawSet; - params.drawCallback = [&](const DrawParams& drawParams) + params.drawCallback = [&](DrawParams& drawParams) { + drawParams.descriptorSets = { + &data.globalSet, + &data.modelSet + }; Draw(resources, frameIndex, graphResources, commandList, drawParams); }; @@ -515,8 +521,6 @@ void ModelRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, RenderRe params.enableDrawing = CVAR_ModelDrawOccluders.Get(); params.disableTwoStepCulling = CVAR_ModelDisableTwoStepCulling.Get(); - params.isIndexed = true; - params.useInstancedCulling = true; OccluderPass(params); }); @@ -550,6 +554,7 @@ void ModelRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderRes Renderer::DescriptorSetResource debugSet; Renderer::DescriptorSetResource globalSet; Renderer::DescriptorSetResource cullingSet; + Renderer::DescriptorSetResource createIndirectAfterCullSet; }; renderGraph->AddPass("Model (O) Culling", @@ -604,6 +609,7 @@ void ModelRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderRes params.debugDescriptorSet = data.debugSet; params.globalDescriptorSet = data.globalSet; params.cullingDescriptorSet = data.cullingSet; + params.createIndirectAfterCullSet = data.createIndirectAfterCullSet; params.numCascades = *CVarSystem::Get()->GetIntCVar(CVarCategory::Client | CVarCategory::Rendering, "shadowCascadeNum"_h); params.occlusionCull = CVAR_ModelOcclusionCullingEnabled.Get(); @@ -616,8 +622,6 @@ void ModelRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderRes params.modelIDOffset = offsetof(DrawCallData, modelID); params.drawCallDataSize = sizeof(DrawCallData); - params.useInstancedCulling = true; - CullingPass(params); }); } @@ -658,6 +662,7 @@ void ModelRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, RenderRe Renderer::BufferMutableResource triangleCountReadBackBuffer; Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource modelSet; Renderer::DescriptorSetResource fillSet; Renderer::DescriptorSetResource drawSet; }; @@ -693,6 +698,7 @@ void ModelRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, RenderRe builder.Read(_opaqueCullingResources.GetDrawCallDatas().GetBuffer(), BufferUsage::GRAPHICS); data.globalSet = builder.Use(resources.globalDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); data.fillSet = builder.Use(_opaqueCullingResources.GetGeometryFillDescriptorSet()); return true; // Return true from setup to enable this pass, return false to disable it @@ -729,8 +735,12 @@ void ModelRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, RenderRe params.fillDescriptorSet = data.fillSet; params.drawDescriptorSet = data.drawSet; - params.drawCallback = [&](const DrawParams& drawParams) + params.drawCallback = [&](DrawParams& drawParams) { + drawParams.descriptorSets = { + &data.globalSet, + &data.modelSet + }; Draw(resources, frameIndex, graphResources, commandList, drawParams); }; @@ -742,8 +752,6 @@ void ModelRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, RenderRe params.enableDrawing = CVAR_ModelDrawGeometry.Get(); params.cullingEnabled = cullingEnabled; - params.useInstancedCulling = true; - params.isIndexed = true; GeometryPass(params); }); @@ -776,6 +784,7 @@ void ModelRenderer::AddTransparencyCullingPass(Renderer::RenderGraph* renderGrap Renderer::DescriptorSetResource debugSet; Renderer::DescriptorSetResource globalSet; Renderer::DescriptorSetResource cullingSet; + Renderer::DescriptorSetResource createIndirectAfterCullSet; }; renderGraph->AddPass("Model (T) Culling", @@ -826,6 +835,7 @@ void ModelRenderer::AddTransparencyCullingPass(Renderer::RenderGraph* renderGrap params.debugDescriptorSet = data.debugSet; params.globalDescriptorSet = data.globalSet; params.cullingDescriptorSet = data.cullingSet; + params.createIndirectAfterCullSet = data.createIndirectAfterCullSet; params.numCascades = 0;// *CVarSystem::Get()->GetIntCVar(CVarCategory::Client | CVarCategory::Rendering, "numShadowCascades"_h); params.occlusionCull = CVAR_ModelOcclusionCullingEnabled.Get(); @@ -838,8 +848,6 @@ void ModelRenderer::AddTransparencyCullingPass(Renderer::RenderGraph* renderGrap params.modelIDOffset = offsetof(DrawCallData, modelID); params.drawCallDataSize = sizeof(DrawCallData); - params.useInstancedCulling = true; - CullingPass(params); }); } @@ -872,6 +880,7 @@ void ModelRenderer::AddTransparencyGeometryPass(Renderer::RenderGraph* renderGra Renderer::BufferMutableResource triangleCountReadBackBuffer; Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource modelSet; Renderer::DescriptorSetResource fillSet; Renderer::DescriptorSetResource drawSet; }; @@ -901,6 +910,7 @@ void ModelRenderer::AddTransparencyGeometryPass(Renderer::RenderGraph* renderGra builder.Read(_transparentCullingResources.GetDrawCallDatas().GetBuffer(), BufferUsage::GRAPHICS); data.globalSet = builder.Use(resources.globalDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); data.fillSet = builder.Use(_transparentCullingResources.GetGeometryFillDescriptorSet()); return true; // Return true from setup to enable this pass, return false to disable it @@ -933,8 +943,13 @@ void ModelRenderer::AddTransparencyGeometryPass(Renderer::RenderGraph* renderGra params.fillDescriptorSet = data.fillSet; params.drawDescriptorSet = data.drawSet; - params.drawCallback = [&](const DrawParams& drawParams) + params.drawCallback = [&](DrawParams& drawParams) { + drawParams.descriptorSets = { + &data.globalSet, + &data.modelSet, + &data.drawSet + }; DrawTransparent(resources, frameIndex, graphResources, commandList, drawParams); }; @@ -942,8 +957,6 @@ void ModelRenderer::AddTransparencyGeometryPass(Renderer::RenderGraph* renderGra params.enableDrawing = CVAR_ModelDrawGeometry.Get(); params.cullingEnabled = cullingEnabled; - params.useInstancedCulling = true; - params.isIndexed = true; GeometryPass(params); }); @@ -971,6 +984,7 @@ void ModelRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderReso Renderer::BufferMutableResource triangleCountReadBackBuffer; Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource modelSet; Renderer::DescriptorSetResource drawSet; }; @@ -1005,6 +1019,7 @@ void ModelRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderReso data.triangleCountReadBackBuffer = builder.Write(_opaqueSkyboxCullingResources.GetTriangleCountReadBackBuffer(), BufferUsage::TRANSFER); data.globalSet = builder.Use(resources.globalDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); data.drawSet = builder.Use(_opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet()); return true; // Return true from setup to enable this pass, return false to disable it @@ -1033,8 +1048,13 @@ void ModelRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderReso params.globalDescriptorSet = data.globalSet; params.drawDescriptorSet = data.drawSet; - params.drawCallback = [&](const DrawParams& drawParams) + params.drawCallback = [&](DrawParams& drawParams) { + drawParams.descriptorSets = { + &data.globalSet, + &data.modelSet, + &data.drawSet + }; DrawSkybox(resources, frameIndex, graphResources, commandList, drawParams, false); }; @@ -1062,6 +1082,7 @@ void ModelRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderReso Renderer::BufferMutableResource triangleCountReadBackBuffer; Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource modelSet; Renderer::DescriptorSetResource drawSet; }; @@ -1097,6 +1118,7 @@ void ModelRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderReso data.triangleCountReadBackBuffer = builder.Write(_transparentSkyboxCullingResources.GetTriangleCountReadBackBuffer(), BufferUsage::TRANSFER); data.globalSet = builder.Use(resources.globalDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); data.drawSet = builder.Use(_transparentSkyboxCullingResources.GetGeometryPassDescriptorSet()); return true; // Return true from setup to enable this pass, return false to disable it @@ -1126,8 +1148,13 @@ void ModelRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderReso params.globalDescriptorSet = data.globalSet; params.drawDescriptorSet = data.drawSet; - params.drawCallback = [&](const DrawParams& drawParams) + params.drawCallback = [&](DrawParams& drawParams) { + drawParams.descriptorSets = { + &data.globalSet, + &data.modelSet, + &data.drawSet + }; DrawSkybox(resources, frameIndex, graphResources, commandList, drawParams, true); }; @@ -2440,15 +2467,15 @@ bool ModelRenderer::SetTextureTransformMatricesAsDirty(u32 instanceID, u32 local void ModelRenderer::CreatePermanentResources() { ZoneScoped; + CreateModelPipelines(); + + RenderResources& resources = _gameRenderer->GetRenderResources(); + Renderer::TextureArrayDesc textureArrayDesc; textureArrayDesc.size = Renderer::Settings::MAX_TEXTURES; _textures = _renderer->CreateTextureArray(textureArrayDesc); - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextures"_h, _textures); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextures"_h, _textures); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextures"_h, _textures); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextures"_h, _textures); - _materialPassDescriptorSet.Bind("_modelTextures"_h, _textures); + resources.modelDescriptorSet.Bind("_modelTextures"_h, _textures); Renderer::DataTextureDesc dataTextureDesc; dataTextureDesc.width = 1; @@ -2537,17 +2564,14 @@ void ModelRenderer::CreatePermanentResources() for (u32 i = 0; i < NumSamplers; i++) { - _opaqueCullingResources.GetGeometryPassDescriptorSet().BindArray("_samplers"_h, _samplers[i], i); - _transparentCullingResources.GetGeometryPassDescriptorSet().BindArray("_samplers"_h, _samplers[i], i); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().BindArray("_samplers"_h, _samplers[i], i); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().BindArray("_samplers"_h, _samplers[i], i); - _materialPassDescriptorSet.BindArray("_samplers"_h, _samplers[i], i); + resources.modelDescriptorSet.BindArray("_samplers"_h, _samplers[i], i); } CullingResourcesIndexed::InitParams initParams; initParams.renderer = _renderer; + initParams.culledRenderer = this; initParams.bufferNamePrefix = "OpaqueModels"; - initParams.materialPassDescriptorSet = &_materialPassDescriptorSet; + initParams.materialPassDescriptorSet = &resources.modelDescriptorSet; initParams.enableTwoStepCulling = true; _opaqueCullingResources.Init(initParams); @@ -2566,6 +2590,8 @@ void ModelRenderer::CreatePermanentResources() initParams.enableTwoStepCulling = false; _transparentSkyboxCullingResources.Init(initParams); + InitDescriptorSets(); + // Set GPU Buffers name and usage { _vertices.SetDebugName("ModelVertexBuffer"); @@ -2595,8 +2621,6 @@ void ModelRenderer::CreatePermanentResources() _textureTransformMatrices.SetDebugName("ModelInstanceTextureTransformMatrices"); _textureTransformMatrices.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); } - - CreateModelPipelines(); } void ModelRenderer::CreateModelPipelines() @@ -2622,23 +2646,19 @@ void ModelRenderer::CreateModelPipelines() std::vector vertexPermutationFields = { { "EDITOR_PASS", "0" }, - { "SHADOW_PASS", "0"}, - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } + { "SHADOW_PASS", "0"} }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.vs.hlsl", vertexPermutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Model/Draw.vs.hlsl"; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.vs", vertexPermutationFields); + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Model/Draw.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; std::vector pixelPermutationFields = { - { "SHADOW_PASS", "0" }, - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } + { "SHADOW_PASS", "0" } }; - shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.ps.hlsl", pixelPermutationFields); - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Model/Draw.ps.hlsl"; + shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.ps", pixelPermutationFields); + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Model/Draw.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); _drawPipeline = _renderer->CreatePipeline(pipelineDesc); @@ -2657,23 +2677,19 @@ void ModelRenderer::CreateModelPipelines() std::vector vertexPermutationFields = { { "EDITOR_PASS", "0" }, - { "SHADOW_PASS", "1"}, - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } + { "SHADOW_PASS", "1"} }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.vs.hlsl", vertexPermutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Model/Draw.vs.hlsl"; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.vs", vertexPermutationFields); + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Model/Draw.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; std::vector pixelPermutationFields = { - { "SHADOW_PASS", "1" }, - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } + { "SHADOW_PASS", "1" } }; - shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.ps.hlsl", pixelPermutationFields); - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Model/Draw.ps.hlsl"; + shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/Draw.ps", pixelPermutationFields); + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Model/Draw.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Draw @@ -2714,20 +2730,12 @@ void ModelRenderer::CreateModelPipelines() pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; Renderer::VertexShaderDesc vertexShaderDesc; - std::vector permutationFields = - { - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawTransparent.vs.hlsl", permutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Model/DrawTransparent.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Model/DrawTransparent.vs"_h, "Model/DrawTransparent.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawTransparent.ps.hlsl", permutationFields); - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Model/DrawTransparent.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Model/DrawTransparent.ps"_h, "Model/DrawTransparent.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Draw @@ -2750,24 +2758,16 @@ void ModelRenderer::CreateModelPipelines() pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; Renderer::VertexShaderDesc vertexShaderDesc; - std::vector vertexPermutationFields = - { - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawSkybox.vs.hlsl", vertexPermutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Model/DrawSkybox.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Model/DrawSkybox.vs"_h, "Model/DrawSkybox.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; std::vector pixelPermutationFields = { - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" }, { "TRANSPARENCY", "0" } }; - shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawSkybox.ps.hlsl", pixelPermutationFields); - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Model/DrawSkybox.ps.hlsl"; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawSkybox.ps", pixelPermutationFields); + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Model/DrawSkybox.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Draw @@ -2810,28 +2810,51 @@ void ModelRenderer::CreateModelPipelines() pipelineDesc.states.depthStencilFormat = Renderer::DepthImageFormat::D32_FLOAT; Renderer::VertexShaderDesc vertexShaderDesc; - std::vector vertexPermutationFields = - { - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawSkybox.vs.hlsl", vertexPermutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Model/DrawSkybox.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Model/DrawSkybox.vs"_h, "Model/DrawSkybox.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; std::vector pixelPermutationFields = { - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" }, { "TRANSPARENCY", "1" } }; - shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawSkybox.ps.hlsl", pixelPermutationFields); - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Model/DrawSkybox.ps.hlsl"; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Model/DrawSkybox.ps", pixelPermutationFields); + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Model/DrawSkybox.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Draw - _drawSkyboxOpaquePipeline = _renderer->CreatePipeline(pipelineDesc); + _drawSkyboxTransparentPipeline = _renderer->CreatePipeline(pipelineDesc); + } +} + +void ModelRenderer::InitDescriptorSets() +{ + // Opaque + { + Renderer::DescriptorSet& geometryPassDescriptorSet = _opaqueCullingResources.GetGeometryPassDescriptorSet(); + geometryPassDescriptorSet.RegisterPipeline(_renderer, _drawPipeline); + geometryPassDescriptorSet.Init(_renderer); + } + + // Transparent + { + Renderer::DescriptorSet& geometryPassDescriptorSet = _transparentCullingResources.GetGeometryPassDescriptorSet(); + geometryPassDescriptorSet.RegisterPipeline(_renderer, _drawTransparentPipeline); + geometryPassDescriptorSet.Init(_renderer); + } + + // Opaque Skybox + { + Renderer::DescriptorSet& geometryPassDescriptorSet = _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet(); + geometryPassDescriptorSet.RegisterPipeline(_renderer, _drawSkyboxOpaquePipeline); + geometryPassDescriptorSet.Init(_renderer); + } + + // Transparent Skybox + { + Renderer::DescriptorSet& geometryPassDescriptorSet = _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet(); + geometryPassDescriptorSet.RegisterPipeline(_renderer, _drawSkyboxTransparentPipeline); + geometryPassDescriptorSet.Init(_renderer); } } @@ -3253,6 +3276,7 @@ void ModelRenderer::CompactInstanceRefs() void ModelRenderer::SyncToGPU() { ZoneScopedN("ModelRenderer::SyncToGPU"); + RenderResources& resources = _gameRenderer->GetRenderResources(); CulledRenderer::SyncToGPU(); @@ -3260,11 +3284,7 @@ void ModelRenderer::SyncToGPU() { if (_vertices.SyncToGPU(_renderer)) { - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelVertices"_h, _vertices.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelVertices"_h, _vertices.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelVertices"_h, _vertices.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelVertices"_h, _vertices.GetBuffer()); - _materialPassDescriptorSet.Bind("_packedModelVertices"_h, _vertices.GetBuffer()); + resources.modelDescriptorSet.Bind("_packedModelVertices"_h, _vertices.GetBuffer()); } } @@ -3281,11 +3301,7 @@ void ModelRenderer::SyncToGPU() if (_animatedVertices.SyncToGPU(_renderer)) { - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_animatedModelVertexPositions"_h, _animatedVertices.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_animatedModelVertexPositions"_h, _animatedVertices.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_animatedModelVertexPositions"_h, _animatedVertices.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_animatedModelVertexPositions"_h, _animatedVertices.GetBuffer()); - _materialPassDescriptorSet.Bind("_animatedModelVertexPositions"_h, _animatedVertices.GetBuffer()); + resources.modelDescriptorSet.Bind("_animatedModelVertexPositions"_h, _animatedVertices.GetBuffer()); } } @@ -3293,11 +3309,7 @@ void ModelRenderer::SyncToGPU() { if (_indices.SyncToGPU(_renderer)) { - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_modelIndices"_h, _indices.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_modelIndices"_h, _indices.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelIndices"_h, _indices.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelIndices"_h, _indices.GetBuffer()); - _materialPassDescriptorSet.Bind("_modelIndices"_h, _indices.GetBuffer()); + resources.modelDescriptorSet.Bind("_modelIndices"_h, _indices.GetBuffer()); } } @@ -3305,11 +3317,7 @@ void ModelRenderer::SyncToGPU() { if (_textureDatas.SyncToGPU(_renderer)) { - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelTextureDatas"_h, _textureDatas.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelTextureDatas"_h, _textureDatas.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelTextureDatas"_h, _textureDatas.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_packedModelTextureDatas"_h, _textureDatas.GetBuffer()); - _materialPassDescriptorSet.Bind("_packedModelTextureDatas"_h, _textureDatas.GetBuffer()); + resources.modelDescriptorSet.Bind("_packedModelTextureDatas"_h, _textureDatas.GetBuffer()); } } @@ -3317,11 +3325,7 @@ void ModelRenderer::SyncToGPU() { if (_textureUnits.SyncToGPU(_renderer)) { - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextureUnits"_h, _textureUnits.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextureUnits"_h, _textureUnits.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextureUnits"_h, _textureUnits.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelTextureUnits"_h, _textureUnits.GetBuffer()); - _materialPassDescriptorSet.Bind("_modelTextureUnits"_h, _textureUnits.GetBuffer()); + resources.modelDescriptorSet.Bind("_modelTextureUnits"_h, _textureUnits.GetBuffer()); } } @@ -3329,16 +3333,7 @@ void ModelRenderer::SyncToGPU() { if (_instanceDatas.SyncToGPU(_renderer)) { - _opaqueCullingResources.GetCullingDescriptorSet().Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); - - _transparentCullingResources.GetCullingDescriptorSet().Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); - - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); - - _materialPassDescriptorSet.Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); + resources.modelDescriptorSet.Bind("_modelInstanceDatas"_h, _instanceDatas.GetBuffer()); } } @@ -3348,13 +3343,8 @@ void ModelRenderer::SyncToGPU() { _opaqueCullingResources.GetCullingDescriptorSet().Bind("_instanceMatrices"_h, _instanceMatrices.GetBuffer()); _transparentCullingResources.GetCullingDescriptorSet().Bind("_instanceMatrices"_h, _instanceMatrices.GetBuffer()); - //_animationPrepassDescriptorSet.Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); - _materialPassDescriptorSet.Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); + resources.modelDescriptorSet.Bind("_modelInstanceMatrices"_h, _instanceMatrices.GetBuffer()); } } @@ -3362,13 +3352,7 @@ void ModelRenderer::SyncToGPU() { if (_boneMatrices.SyncToGPU(_renderer)) { - //_animationPrepassDescriptorSet.Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); - - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); - _materialPassDescriptorSet.Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); + resources.modelDescriptorSet.Bind("_instanceBoneMatrices"_h, _boneMatrices.GetBuffer()); } } @@ -3376,13 +3360,7 @@ void ModelRenderer::SyncToGPU() { if (_textureTransformMatrices.SyncToGPU(_renderer)) { - //_animationPrepassDescriptorSet.Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); - - _opaqueCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); - _transparentCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); - _opaqueSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); - _transparentSkyboxCullingResources.GetGeometryPassDescriptorSet().Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); - _materialPassDescriptorSet.Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); + resources.modelDescriptorSet.Bind("_instanceTextureTransformMatrices"_h, _textureTransformMatrices.GetBuffer()); } } @@ -3428,9 +3406,10 @@ void ModelRenderer::Draw(const RenderResources& resources, u8 frameIndex, Render constants->viewIndex = params.viewIndex; commandList.PushConstant(constants, 0, sizeof(PushConstants)); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, frameIndex); - //commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, &resources.shadowDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::MODEL, params.drawDescriptorSet, frameIndex); + for (auto& descriptorSet : params.descriptorSets) + { + commandList.BindDescriptorSet(*descriptorSet, frameIndex); + } commandList.SetIndexBuffer(_indices.GetBuffer(), Renderer::IndexFormat::UInt16); @@ -3463,8 +3442,10 @@ void ModelRenderer::DrawTransparent(const RenderResources& resources, u8 frameIn Renderer::GraphicsPipelineID pipeline = _drawTransparentPipeline; commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::MODEL, params.drawDescriptorSet, frameIndex); + for (auto& descriptorSet : params.descriptorSets) + { + commandList.BindDescriptorSet(*descriptorSet, frameIndex); + } commandList.SetIndexBuffer(_indices.GetBuffer(), Renderer::IndexFormat::UInt16); @@ -3499,8 +3480,10 @@ void ModelRenderer::DrawSkybox(const RenderResources& resources, u8 frameIndex, Renderer::GraphicsPipelineID pipeline = isTransparent ? _drawSkyboxTransparentPipeline : _drawSkyboxOpaquePipeline; commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::MODEL, params.drawDescriptorSet, frameIndex); + for (auto& descriptorSet : params.descriptorSets) + { + commandList.BindDescriptorSet(*descriptorSet, frameIndex); + } commandList.SetIndexBuffer(_indices.GetBuffer(), Renderer::IndexFormat::UInt16); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.h index bf12f5c..a07177b 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.h @@ -351,7 +351,6 @@ class ModelRenderer : CulledRenderer void AddTransparencyCullingPass(Renderer::RenderGraph* renderGraph, RenderResources& resources, u8 frameIndex); void AddTransparencyGeometryPass(Renderer::RenderGraph* renderGraph, RenderResources& resources, u8 frameIndex); - Renderer::DescriptorSet& GetMaterialPassDescriptorSet() { return _materialPassDescriptorSet; } void RegisterMaterialPassBufferUsage(Renderer::RenderGraphBuilder& builder); Renderer::GPUVector& GetInstanceMatrices() { return _instanceMatrices; } @@ -373,6 +372,7 @@ class ModelRenderer : CulledRenderer private: void CreatePermanentResources(); void CreateModelPipelines(); + void InitDescriptorSets(); void AllocateModel(const Model::ComplexModel& model, ModelOffsets& offsets); void AllocateTextureData(u32 numTextureDatas, TextureDataOffsets& offsets); @@ -455,8 +455,6 @@ class ModelRenderer : CulledRenderer std::vector _samplers; Renderer::SamplerID _occlusionSampler; - Renderer::DescriptorSet _materialPassDescriptorSet; - u32 _numOccluderDrawCalls = 0; u32 _numSurvivingDrawCalls[Renderer::Settings::MAX_VIEWS] = { 0 }; diff --git a/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.cpp b/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.cpp index 5128865..1bf0ade 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.cpp @@ -19,27 +19,26 @@ PixelQuery::PixelQuery(Renderer::Renderer* renderer, GameRenderer* gameRenderer) void PixelQuery::CreatePermanentResources() { - { - Renderer::BufferDesc desc; - desc.name = "PixelQueryResultBuffer"; - desc.size = sizeof(PixelQuery::PixelData) * MaxQueryRequestPerFrame; - desc.usage = Renderer::BufferUsage::INDIRECT_ARGUMENT_BUFFER | Renderer::BufferUsage::STORAGE_BUFFER; - desc.cpuAccess = Renderer::BufferCPUAccess::ReadOnly; - _pixelResultBuffer = _renderer->CreateBuffer(desc); - } + Renderer::BufferDesc desc; + desc.name = "PixelQueryResultBuffer"; + desc.size = sizeof(PixelQuery::PixelData) * MaxQueryRequestPerFrame; + desc.usage = Renderer::BufferUsage::INDIRECT_ARGUMENT_BUFFER | Renderer::BufferUsage::STORAGE_BUFFER; + desc.cpuAccess = Renderer::BufferCPUAccess::ReadOnly; + _pixelResultBuffer = _renderer->CreateBuffer(desc); _generator.seed(_randomDevice()); - { - Renderer::ComputePipelineDesc queryPipelineDesc; - Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Utils/ObjectQuery.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Utils/ObjectQuery.cs.hlsl"; - queryPipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); + Renderer::ComputePipelineDesc queryPipelineDesc; - _queryPipeline = _renderer->CreatePipeline(queryPipelineDesc); - } + Renderer::ComputeShaderDesc shaderDesc; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Utils/ObjectQuery.cs"_h, "Utils/ObjectQuery.cs"); + queryPipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); + + _queryPipeline = _renderer->CreatePipeline(queryPipelineDesc); + + _queryDescriptorSet.RegisterPipeline(_renderer, _queryPipeline); + _queryDescriptorSet.Init(_renderer); } void PixelQuery::Update(f32 deltaTime) @@ -95,14 +94,11 @@ void PixelQuery::AddPixelQueryPass(Renderer::RenderGraph* renderGraph, RenderRes data.pixelResultBuffer = builder.Write(_pixelResultBuffer, Renderer::BufferPassUsage::COMPUTE); TerrainRenderer* terrainRenderer = gameRenderer->GetTerrainRenderer(); - Renderer::DescriptorSet& terrainDescriptorSet = terrainRenderer->GetMaterialPassDescriptorSet(); - ModelRenderer* modelRenderer = gameRenderer->GetModelRenderer(); - Renderer::DescriptorSet& modelDescriptorSet = modelRenderer->GetMaterialPassDescriptorSet(); data.querySet = builder.Use(_queryDescriptorSet); - data.terrainSet = builder.Use(terrainDescriptorSet); - data.modelSet = builder.Use(modelDescriptorSet); + data.terrainSet = builder.Use(resources.terrainDescriptorSet); + data.modelSet = builder.Use(resources.modelDescriptorSet); terrainRenderer->RegisterMaterialPassBufferUsage(builder); modelRenderer->RegisterMaterialPassBufferUsage(builder); @@ -140,9 +136,9 @@ void PixelQuery::AddPixelQueryPass(Renderer::RenderGraph* renderGraph, RenderRes data.querySet.Bind("_visibilityBuffer", data.visibilityBuffer); data.querySet.Bind("_result", data.pixelResultBuffer); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.querySet, _frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN, data.terrainSet, _frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::MODEL, data.modelSet, _frameIndex); + commandList.BindDescriptorSet(data.querySet, _frameIndex); + commandList.BindDescriptorSet(data.terrainSet, _frameIndex); + commandList.BindDescriptorSet(data.modelSet, _frameIndex); commandList.Dispatch(1, 1, 1); diff --git a/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.h b/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.h index 4c8e239..99daae0 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.h +++ b/Source/Game-Lib/Game-Lib/Rendering/PixelQuery.h @@ -75,7 +75,7 @@ class PixelQuery GameRenderer* _gameRenderer = nullptr; Renderer::ComputePipelineID _queryPipeline; - Renderer::DescriptorSet _queryDescriptorSet; + Renderer::BufferID _pixelResultBuffer; }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/RenderResources.h b/Source/Game-Lib/Game-Lib/Rendering/RenderResources.h index ceeea81..e425382 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/RenderResources.h +++ b/Source/Game-Lib/Game-Lib/Rendering/RenderResources.h @@ -13,12 +13,22 @@ struct RenderResources { public: RenderResources() - : globalDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL) + : debugDescriptorSet(Renderer::DescriptorSetSlot::DEBUG) + , globalDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL) , lightDescriptorSet(Renderer::DescriptorSetSlot::LIGHT) + , terrainDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN) + , modelDescriptorSet(Renderer::DescriptorSetSlot::MODEL) { } + // Descriptor sets + Renderer::DescriptorSet debugDescriptorSet; + Renderer::DescriptorSet globalDescriptorSet; + Renderer::DescriptorSet lightDescriptorSet; + Renderer::DescriptorSet terrainDescriptorSet; + Renderer::DescriptorSet modelDescriptorSet; + // Permanent resources Renderer::GPUVector cameras; @@ -45,9 +55,6 @@ struct RenderResources Renderer::DepthImageID debugRendererDepth; - Renderer::DescriptorSet globalDescriptorSet; - Renderer::DescriptorSet lightDescriptorSet; - Renderer::SemaphoreID sceneRenderedSemaphore; // This semaphore tells the present function when the scene is ready to be blitted and presented FrameResource frameSyncSemaphores; // This semaphore makes sure the GPU handles frames in order }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.cpp b/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.cpp index 6882c0c..ee63455 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.cpp @@ -10,7 +10,30 @@ #include #include -void RenderUtils::Blit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const BlitParams& params) +Renderer::Renderer* RenderUtils::_renderer = nullptr; +GameRenderer* RenderUtils::_gameRenderer = nullptr; + +Renderer::ComputePipelineID RenderUtils::_copyDepthToColorPipeline; + +void RenderUtils::Init(Renderer::Renderer* renderer, GameRenderer* gameRenderer) +{ + _renderer = renderer; + _gameRenderer = gameRenderer; + + // Create pipelines + { + Renderer::ComputePipelineDesc pipelineDesc; + pipelineDesc.debugName = "CopyDepthToColor"; + + Renderer::ComputeShaderDesc shaderDesc; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Blitting/BlitDepth.cs"_h, "Blitting/BlitDepth.cs"); + pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); + + _copyDepthToColorPipeline = _renderer->CreatePipeline(pipelineDesc); + } +} + +void RenderUtils::Blit(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const BlitParams& params) { commandList.PushMarker("Blit", Color::White); @@ -23,32 +46,10 @@ void RenderUtils::Blit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, const Renderer::ImageDesc& imageDesc = graphResources.GetImageDesc(params.input); - // Setup pipeline - Renderer::GraphicsPipelineDesc pipelineDesc; - pipelineDesc.debugName = "Blit"; - - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - pipelineDesc.states.vertexShader = renderer->LoadShader(vertexShaderDesc); - - std::string textureTypeName = Renderer::GetTextureTypeName(imageDesc.format); - std::vector permutationFields = - { - { "TEX_TYPE", textureTypeName } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = gameRenderer->GetShaderEntry(shaderEntryNameHash); - pipelineDesc.states.pixelShader = renderer->LoadShader(pixelShaderDesc); - - const Renderer::ImageDesc& outputDesc = graphResources.GetImageDesc(params.output); - pipelineDesc.states.renderTargetFormats[0] = outputDesc.format; + std::string componentTypeName = GetTextureTypeName(imageDesc.format); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID pipeline = _gameRenderer->GetBlitPipeline(componentTypeNameHash); - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; - - Renderer::GraphicsPipelineID pipeline = renderer->CreatePipeline(pipelineDesc); commandList.BeginPipeline(pipeline); u32 mipLevel = params.inputMipLevel; @@ -58,7 +59,7 @@ void RenderUtils::Blit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, } params.descriptorSet.Bind("_texture", params.input, mipLevel); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); struct BlitConstant { @@ -89,7 +90,7 @@ void RenderUtils::Blit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, commandList.PopMarker(); } -void RenderUtils::DepthBlit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthBlitParams& params) +void RenderUtils::DepthBlit(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthBlitParams& params) { commandList.PushMarker("Blit", Color::White); @@ -102,36 +103,13 @@ void RenderUtils::DepthBlit(Renderer::Renderer* renderer, GameRenderer* gameRend const Renderer::DepthImageDesc& imageDesc = graphResources.GetImageDesc(params.input); - // Setup pipeline - Renderer::GraphicsPipelineDesc pipelineDesc; - pipelineDesc.debugName = "DepthBlit"; - - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - pipelineDesc.states.vertexShader = renderer->LoadShader(vertexShaderDesc); - - std::string textureTypeName = Renderer::GetTextureTypeName(imageDesc.format); - std::vector permutationFields = - { - { "TEX_TYPE", textureTypeName } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = gameRenderer->GetShaderEntry(shaderEntryNameHash); - pipelineDesc.states.pixelShader = renderer->LoadShader(pixelShaderDesc); - - const Renderer::ImageDesc& outputDesc = graphResources.GetImageDesc(params.output); - pipelineDesc.states.renderTargetFormats[0] = outputDesc.format; - - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; - - Renderer::GraphicsPipelineID pipeline = renderer->CreatePipeline(pipelineDesc); + std::string componentTypeName = GetTextureTypeName(imageDesc.format); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID pipeline = _gameRenderer->GetBlitPipeline(componentTypeNameHash); commandList.BeginPipeline(pipeline); params.descriptorSet.Bind("_texture", params.input); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); struct BlitConstant { @@ -162,7 +140,7 @@ void RenderUtils::DepthBlit(Renderer::Renderer* renderer, GameRenderer* gameRend commandList.PopMarker(); } -void RenderUtils::Overlay(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const OverlayParams& params) +void RenderUtils::Overlay(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const OverlayParams& params) { commandList.PushMarker("Overlay", Color::White); @@ -175,37 +153,9 @@ void RenderUtils::Overlay(Renderer::Renderer* renderer, GameRenderer* gameRender const Renderer::ImageDesc& imageDesc = graphResources.GetImageDesc(params.overlayImage); - // Setup pipeline - Renderer::GraphicsPipelineDesc pipelineDesc; - pipelineDesc.debugName = "Overlay"; - - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - pipelineDesc.states.vertexShader = renderer->LoadShader(vertexShaderDesc); - - std::string textureTypeName = Renderer::GetTextureTypeName(imageDesc.format); - std::vector permutationFields = - { - { "TEX_TYPE", textureTypeName } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = gameRenderer->GetShaderEntry(shaderEntryNameHash); - pipelineDesc.states.pixelShader = renderer->LoadShader(pixelShaderDesc); - - const Renderer::ImageDesc& outputDesc = graphResources.GetImageDesc(params.baseImage); - pipelineDesc.states.renderTargetFormats[0] = outputDesc.format; - - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; - - pipelineDesc.states.blendState.renderTargets[0].blendEnable = true; - pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; - pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::SRC_ALPHA; - pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ONE; - - Renderer::GraphicsPipelineID pipeline = renderer->CreatePipeline(pipelineDesc); + std::string componentTypeName = GetTextureTypeName(imageDesc.format); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID pipeline = _gameRenderer->GetOverlayPipeline(componentTypeNameHash); commandList.BeginPipeline(pipeline); @@ -216,7 +166,7 @@ void RenderUtils::Overlay(Renderer::Renderer* renderer, GameRenderer* gameRender } params.descriptorSet.Bind("_texture", params.overlayImage, mipLevel); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); struct BlitConstant { @@ -247,7 +197,7 @@ void RenderUtils::Overlay(Renderer::Renderer* renderer, GameRenderer* gameRender commandList.PopMarker(); } -void RenderUtils::DepthOverlay(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthOverlayParams& params) +void RenderUtils::DepthOverlay(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthOverlayParams& params) { commandList.PushMarker("DepthOverlay", Color::White); @@ -260,42 +210,14 @@ void RenderUtils::DepthOverlay(Renderer::Renderer* renderer, GameRenderer* gameR const Renderer::DepthImageDesc& imageDesc = graphResources.GetImageDesc(params.overlayImage); - // Setup pipeline - Renderer::GraphicsPipelineDesc pipelineDesc; - pipelineDesc.debugName = "DepthOverlay"; - - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - pipelineDesc.states.vertexShader = renderer->LoadShader(vertexShaderDesc); - - std::string textureTypeName = Renderer::GetTextureTypeName(imageDesc.format); - std::vector permutationFields = - { - { "TEX_TYPE", textureTypeName } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = gameRenderer->GetShaderEntry(shaderEntryNameHash); - pipelineDesc.states.pixelShader = renderer->LoadShader(pixelShaderDesc); - - const Renderer::ImageDesc& outputDesc = graphResources.GetImageDesc(params.baseImage); - pipelineDesc.states.renderTargetFormats[0] = outputDesc.format; - - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; - - pipelineDesc.states.blendState.renderTargets[0].blendEnable = true; - pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; - pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::SRC_ALPHA; - pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ONE; - - Renderer::GraphicsPipelineID pipeline = renderer->CreatePipeline(pipelineDesc); + std::string componentTypeName = GetTextureTypeName(imageDesc.format); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID pipeline = _gameRenderer->GetOverlayPipeline(componentTypeNameHash); commandList.BeginPipeline(pipeline); params.descriptorSet.Bind("_texture", params.overlayImage); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); struct BlitConstant { @@ -326,7 +248,7 @@ void RenderUtils::DepthOverlay(Renderer::Renderer* renderer, GameRenderer* gameR commandList.PopMarker(); } -void RenderUtils::PictureInPicture(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const PictureInPictureParams& params) +void RenderUtils::PictureInPicture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const PictureInPictureParams& params) { commandList.PushMarker("PictureInPicture", Color::White); @@ -346,37 +268,9 @@ void RenderUtils::PictureInPicture(Renderer::Renderer* renderer, GameRenderer* g const Renderer::ImageDesc& imageDesc = graphResources.GetImageDesc(params.pipImage); - // Setup pipeline - Renderer::GraphicsPipelineDesc pipelineDesc; - pipelineDesc.debugName = "PictureInPicture"; - - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - pipelineDesc.states.vertexShader = renderer->LoadShader(vertexShaderDesc); - - std::string textureTypeName = Renderer::GetTextureTypeName(imageDesc.format); - std::vector permutationFields = - { - { "TEX_TYPE", textureTypeName } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = gameRenderer->GetShaderEntry(shaderEntryNameHash); - pipelineDesc.states.pixelShader = renderer->LoadShader(pixelShaderDesc); - - const Renderer::ImageDesc& outputDesc = graphResources.GetImageDesc(params.baseImage); - pipelineDesc.states.renderTargetFormats[0] = outputDesc.format; - - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; - - pipelineDesc.states.blendState.renderTargets[0].blendEnable = false; - pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; - pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::ONE; - pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ZERO; - - Renderer::GraphicsPipelineID pipeline = renderer->CreatePipeline(pipelineDesc); + std::string componentTypeName = GetTextureTypeName(imageDesc.format); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID pipeline = _gameRenderer->GetBlitPipeline(componentTypeNameHash); commandList.BeginPipeline(pipeline); @@ -387,7 +281,7 @@ void RenderUtils::PictureInPicture(Renderer::Renderer* renderer, GameRenderer* g } params.descriptorSet.Bind("_texture", params.pipImage, mipLevel); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); struct BlitConstant { @@ -417,14 +311,14 @@ void RenderUtils::PictureInPicture(Renderer::Renderer* renderer, GameRenderer* g commandList.EndRenderPass(renderPassDesc); // Reset the viewport and scissor - vec2 renderSize = renderer->GetRenderSize(); + vec2 renderSize = _renderer->GetRenderSize(); commandList.SetViewport(0, 0, renderSize.x, renderSize.y, 0.0f, 1.0f); commandList.SetScissorRect(0, static_cast(renderSize.x), 0, static_cast(renderSize.y)); commandList.PopMarker(); } -void RenderUtils::DepthPictureInPicture(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthPictureInPictureParams& params) +void RenderUtils::DepthPictureInPicture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthPictureInPictureParams& params) { commandList.PushMarker("DepthPictureInPicture", Color::White); @@ -444,42 +338,14 @@ void RenderUtils::DepthPictureInPicture(Renderer::Renderer* renderer, GameRender const Renderer::DepthImageDesc& imageDesc = graphResources.GetImageDesc(params.pipImage); - // Setup pipeline - Renderer::GraphicsPipelineDesc pipelineDesc; - pipelineDesc.debugName = "DepthPictureInPicture"; - - Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - pipelineDesc.states.vertexShader = renderer->LoadShader(vertexShaderDesc); - - std::string textureTypeName = Renderer::GetTextureTypeName(imageDesc.format); - std::vector permutationFields = - { - { "TEX_TYPE", textureTypeName } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Blitting/Blit.ps.hlsl", permutationFields); - - Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = gameRenderer->GetShaderEntry(shaderEntryNameHash); - pipelineDesc.states.pixelShader = renderer->LoadShader(pixelShaderDesc); - - const Renderer::ImageDesc& outputDesc = graphResources.GetImageDesc(params.baseImage); - pipelineDesc.states.renderTargetFormats[0] = outputDesc.format; - - pipelineDesc.states.rasterizerState.cullMode = Renderer::CullMode::BACK; - pipelineDesc.states.rasterizerState.frontFaceMode = Renderer::FrontFaceState::COUNTERCLOCKWISE; - - pipelineDesc.states.blendState.renderTargets[0].blendEnable = false; - pipelineDesc.states.blendState.renderTargets[0].blendOp = Renderer::BlendOp::ADD; - pipelineDesc.states.blendState.renderTargets[0].srcBlend = Renderer::BlendMode::ONE; - pipelineDesc.states.blendState.renderTargets[0].destBlend = Renderer::BlendMode::ZERO; - - Renderer::GraphicsPipelineID pipeline = renderer->CreatePipeline(pipelineDesc); + std::string componentTypeName = GetTextureTypeName(imageDesc.format); + u32 componentTypeNameHash = StringUtils::fnv1a_32(componentTypeName.c_str(), componentTypeName.size()); + Renderer::GraphicsPipelineID pipeline = _gameRenderer->GetBlitPipeline(componentTypeNameHash); commandList.BeginPipeline(pipeline); params.descriptorSet.Bind("_texture", params.pipImage); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); struct BlitConstant { @@ -509,26 +375,16 @@ void RenderUtils::DepthPictureInPicture(Renderer::Renderer* renderer, GameRender commandList.EndRenderPass(renderPassDesc); // Reset the viewport and scissor - vec2 renderSize = renderer->GetRenderSize(); + vec2 renderSize = _renderer->GetRenderSize(); commandList.SetViewport(0, 0, renderSize.x, renderSize.y, 0.0f, 1.0f); commandList.SetScissorRect(0, static_cast(renderSize.x), 0, static_cast(renderSize.y)); commandList.PopMarker(); } -void RenderUtils::CopyDepthToColor(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const CopyDepthToColorParams& params) +void RenderUtils::CopyDepthToColor(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const CopyDepthToColorParams& params) { - Renderer::ComputePipelineDesc pipelineDesc; - pipelineDesc.debugName = "CopyDepthToColor"; - graphResources.InitializePipelineDesc(pipelineDesc); - - Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = gameRenderer->GetShaderEntry("Blitting/BlitDepth.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Blitting/BlitDepth.cs.hlsl"; - pipelineDesc.computeShader = renderer->LoadShader(shaderDesc); - - // Do culling - Renderer::ComputePipelineID pipeline = renderer->CreatePipeline(pipelineDesc); + Renderer::ComputePipelineID pipeline = _copyDepthToColorPipeline; commandList.BeginPipeline(pipeline); commandList.PushMarker("CopyDepthToColorRT", Color::White); @@ -539,7 +395,7 @@ void RenderUtils::CopyDepthToColor(Renderer::Renderer* renderer, GameRenderer* g uvec2 destinationSize = graphResources.GetImageDimensions(params.destination, params.destinationMip); params.descriptorSet.Bind("_source", params.source); - params.descriptorSet.BindStorage("_target", params.destination, params.destinationMip); + params.descriptorSet.Bind("_target", params.destination, params.destinationMip); struct CopyParams { @@ -554,7 +410,7 @@ void RenderUtils::CopyDepthToColor(Renderer::Renderer* renderer, GameRenderer* g commandList.PushConstant(copyParams, 0, sizeof(CopyParams)); - commandList.BindDescriptorSet(Renderer::PER_PASS, params.descriptorSet, frameIndex); + commandList.BindDescriptorSet(params.descriptorSet, frameIndex); commandList.Dispatch(GetGroupCount(destinationSize.x, 32), GetGroupCount(destinationSize.y, 32), 1); commandList.EndPipeline(pipeline); diff --git a/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.h b/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.h index 9f59724..5d75100 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.h +++ b/Source/Game-Lib/Game-Lib/Rendering/RenderUtils.h @@ -33,7 +33,7 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void Blit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const BlitParams& params); + static void Blit(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const BlitParams& params); struct DepthBlitParams { @@ -47,7 +47,7 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void DepthBlit(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthBlitParams& params); + static void DepthBlit(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthBlitParams& params); struct OverlayParams { @@ -62,7 +62,7 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void Overlay(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const OverlayParams& params); + static void Overlay(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const OverlayParams& params); struct DepthOverlayParams { @@ -76,7 +76,7 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void DepthOverlay(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthOverlayParams& params); + static void DepthOverlay(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthOverlayParams& params); struct PictureInPictureParams { @@ -92,7 +92,7 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void PictureInPicture(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const PictureInPictureParams& params); + static void PictureInPicture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const PictureInPictureParams& params); struct DepthPictureInPictureParams { @@ -107,7 +107,7 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void DepthPictureInPicture(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthPictureInPictureParams& params); + static void DepthPictureInPicture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const DepthPictureInPictureParams& params); static u32 CalcCullingBitmaskSize(size_t numObjects) { @@ -140,6 +140,12 @@ class RenderUtils Renderer::DescriptorSetResource descriptorSet; }; - static void CopyDepthToColor(Renderer::Renderer* renderer, GameRenderer* gameRenderer, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const CopyDepthToColorParams& params); + static void CopyDepthToColor(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, const CopyDepthToColorParams& params); + + static Renderer::ComputePipelineID GetCopyDepthToColorPipeline() { return _copyDepthToColorPipeline; } private: + static Renderer::Renderer* _renderer; + static GameRenderer* _gameRenderer; + + static Renderer::ComputePipelineID _copyDepthToColorPipeline; }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/Shadow/ShadowRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Shadow/ShadowRenderer.cpp index 5258028..0d31151 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Shadow/ShadowRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Shadow/ShadowRenderer.cpp @@ -93,7 +93,7 @@ void ShadowRenderer::AddShadowPass(Renderer::RenderGraph* renderGraph, RenderRes { Renderer::DepthImageMutableResource shadowDepthCascades[Renderer::Settings::MAX_SHADOW_CASCADES]; - Renderer::DescriptorSetResource shadowDescriptorSet; + Renderer::DescriptorSetResource lightDescriptorSet; }; CVarSystem* cvarSystem = CVarSystem::Get(); @@ -113,7 +113,7 @@ void ShadowRenderer::AddShadowPass(Renderer::RenderGraph* renderGraph, RenderRes data.shadowDepthCascades[i] = builder.Write(resources.shadowDepthCascades[i], Renderer::PipelineType::GRAPHICS, Renderer::LoadMode::CLEAR); } - data.shadowDescriptorSet = builder.Use(resources.lightDescriptorSet); + data.lightDescriptorSet = builder.Use(resources.lightDescriptorSet); return true; // Return true from setup to enable this pass, return false to disable it }, @@ -127,7 +127,7 @@ void ShadowRenderer::AddShadowPass(Renderer::RenderGraph* renderGraph, RenderRes cascadeDepthResource = data.shadowDepthCascades[i]; } - data.shadowDescriptorSet.BindArray("_shadowCascadeRTs", cascadeDepthResource, i); + data.lightDescriptorSet.BindArray("_shadowCascadeRTs", cascadeDepthResource, i); } }); } diff --git a/Source/Game-Lib/Game-Lib/Rendering/Skybox/SkyboxRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Skybox/SkyboxRenderer.cpp index fdecd4c..b641a02 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Skybox/SkyboxRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Skybox/SkyboxRenderer.cpp @@ -70,12 +70,12 @@ void SkyboxRenderer::AddSkyboxPass(Renderer::RenderGraph* renderGraph, RenderRes Renderer::GraphicsPipelineID pipeline = _skyboxPipeline; commandList.BeginPipeline(pipeline); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); // Skyband Color Push Constant commandList.PushConstant(&_skybandColors, 0, sizeof(SkybandColors)); - // NumVertices hardcoded as we use a Fullscreen Triangle (Check FullscreenTriangle.vs.hlsl for more information) + // NumVertices hardcoded as we use a Fullscreen Triangle (Check FullscreenTriangle.vs for more information) commandList.Draw(3, 1, 0, 0); commandList.EndPipeline(pipeline); @@ -98,13 +98,11 @@ void SkyboxRenderer::CreatePermanentResources() // Shaders Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("PostProcess/FullscreenTriangle.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "PostProcess/FullscreenTriangle.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("PostProcess/FullscreenTriangle.vs"_h, "PostProcess/FullscreenTriangle.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Skybox/Skybox.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Skybox/Skybox.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Skybox/Skybox.ps"_h, "Skybox/Skybox.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Depth state diff --git a/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp index aca0bd2..1dd23df 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp @@ -24,7 +24,8 @@ AutoCVar_Int CVAR_TerrainRendererEnabled(CVarCategory::Client | CVarCategory::Rendering, "terrainEnabled", "enable terrainrendering", 1, CVarFlags::EditCheckbox); AutoCVar_Int CVAR_TerrainCullingEnabled(CVarCategory::Client | CVarCategory::Rendering, "terrainCulling", "enable terrain culling", 1, CVarFlags::EditCheckbox); AutoCVar_Int CVAR_OcclusionCullingEnabled(CVarCategory::Client | CVarCategory::Rendering, "terrainOcclusionCulling", "enable terrain occlusion culling", 1, CVarFlags::EditCheckbox); -AutoCVar_Int CVAR_ForceDisableOccluders(CVarCategory::Client | CVarCategory::Rendering, "terrainForceDisableOccluders", "force disable occluders", 0, CVarFlags::EditCheckbox); + +AutoCVar_Int CVAR_TerrainDisableTwoStepCulling(CVarCategory::Client | CVarCategory::Rendering, "terrainDisableTwoStepCulling", "disable two step culling and force all drawcalls into the geometry pass", 0, CVarFlags::EditCheckbox); AutoCVar_Int CVAR_TerrainOccludersEnabled(CVarCategory::Client | CVarCategory::Rendering, "terrainDrawOccluders", "should draw occluders", 1, CVarFlags::EditCheckbox); AutoCVar_Int CVAR_TerrainGeometryEnabled(CVarCategory::Client | CVarCategory::Rendering, "terrainDrawGeometry", "should draw geometry", 1, CVarFlags::EditCheckbox); @@ -37,10 +38,10 @@ TerrainRenderer::TerrainRenderer(Renderer::Renderer* renderer, GameRenderer* gam : _renderer(renderer) , _gameRenderer(gameRenderer) , _debugRenderer(debugRenderer) - , _geometryPassDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN) - , _materialPassDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN) + , _occluderFillPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) + , _resetIndirectDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) , _cullingPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) - , _fillPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) + , _geometryFillPassDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) { if (CVAR_TerrainValidateTransfers.Get()) { @@ -68,7 +69,6 @@ TerrainRenderer::~TerrainRenderer() void TerrainRenderer::Update(f32 deltaTime) { ZoneScoped; - const bool cullingEnabled = true;//CVAR_TerrainCullingEnabled.Get(); // Read back from culling counters @@ -123,7 +123,7 @@ void TerrainRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Render if (!cullingEnabled) return; - const bool forceDisableOccluders = CVAR_ForceDisableOccluders.Get(); + const bool disableTwoStepCulling = CVAR_TerrainDisableTwoStepCulling.Get(); CVarSystem* cvarSystem = CVarSystem::Get(); @@ -173,18 +173,18 @@ void TerrainRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Render data.occluderDrawCountReadBackBuffer = builder.Write(_occluderDrawCountReadBackBuffer, BufferUsage::TRANSFER); data.globalSet = builder.Use(resources.globalDescriptorSet); - data.fillSet = builder.Use(_fillPassDescriptorSet); - data.drawSet = builder.Use(_geometryPassDescriptorSet); + data.fillSet = builder.Use(_occluderFillPassDescriptorSet); + data.drawSet = builder.Use(resources.terrainDescriptorSet); return true; // Return true from setup to enable this pass, return false to disable it }, - [this, &resources, frameIndex, numCascades, forceDisableOccluders, cullingEnabled, cvarSystem](Data& data, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList) // Execute + [this, &resources, frameIndex, numCascades, disableTwoStepCulling, cullingEnabled, cvarSystem](Data& data, Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList) // Execute { GPU_SCOPED_PROFILER_ZONE(commandList, TerrainOccluders); // Handle disabled occluders u32 cellCount = static_cast(_instanceDatas.Count()); - if (forceDisableOccluders) + if (disableTwoStepCulling) { u32 bitmaskSizePerView = RenderUtils::CalcCullingBitmaskSize(cellCount); commandList.FillBuffer(data.culledInstanceBitMaskBuffer, 0, bitmaskSizePerView * Renderer::Settings::MAX_VIEWS, 0); @@ -296,6 +296,7 @@ void TerrainRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderR Renderer::DescriptorSetResource debugSet; Renderer::DescriptorSetResource globalSet; + Renderer::DescriptorSetResource resetIndirectSet; Renderer::DescriptorSetResource cullingSet; }; @@ -317,6 +318,7 @@ void TerrainRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderR data.debugSet = builder.Use(_debugRenderer->GetDebugDescriptorSet()); data.globalSet = builder.Use(resources.globalDescriptorSet); + data.resetIndirectSet = builder.Use(_resetIndirectDescriptorSet); data.cullingSet = builder.Use(_cullingPassDescriptorSet); _debugRenderer->RegisterCullingPassBufferUsage(builder); @@ -341,10 +343,10 @@ void TerrainRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderR ResetIndirectBufferConstants* resetConstants = graphResources.FrameNew(); resetConstants->moveCountToFirst = 0; // This lets us continue building the instance buffer with - commandList.PushConstant(resetConstants, 0, 4); + commandList.PushConstant(resetConstants, 0, sizeof(ResetIndirectBufferConstants)); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, data.cullingSet, frameIndex); + commandList.BindDescriptorSet(data.resetIndirectSet, frameIndex); commandList.Dispatch(1, 1, 1); @@ -389,10 +391,10 @@ void TerrainRenderer::AddCullingPass(Renderer::RenderGraph* renderGraph, RenderR data.cullingSet.Bind("_culledInstancesBitMask"_h, data.currentInstanceBitMaskBuffer); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::DEBUG, data.debugSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, data.globalSet, frameIndex); + commandList.BindDescriptorSet(data.debugSet, frameIndex); + commandList.BindDescriptorSet(data.globalSet, frameIndex); //commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, &resources.shadowDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN, data.cullingSet, frameIndex); + commandList.BindDescriptorSet(data.cullingSet, frameIndex); commandList.Dispatch((cellCount + 31) / 32, 1, 1); @@ -437,7 +439,7 @@ void TerrainRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, Render Renderer::DescriptorSetResource geometryPassSet; }; - renderGraph->AddPass("TerrainGeometry", + renderGraph->AddPass("Terrain Geometry", [this, &resources, frameIndex, cullingEnabled, numCascades](Data& data, Renderer::RenderGraphBuilder& builder) { using BufferUsage = Renderer::BufferPassUsage; @@ -465,8 +467,8 @@ void TerrainRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, Render data.occluderDrawCountReadBackBuffer = builder.Write(_occluderDrawCountReadBackBuffer, BufferUsage::TRANSFER); data.globalSet = builder.Use(resources.globalDescriptorSet); - data.fillSet = builder.Use(_fillPassDescriptorSet); - data.geometryPassSet = builder.Use(_geometryPassDescriptorSet); + data.fillSet = builder.Use(_geometryFillPassDescriptorSet); + data.geometryPassSet = builder.Use(resources.terrainDescriptorSet); return true; // Return true from setup to enable this pass, return false to disable it }, @@ -839,17 +841,22 @@ void TerrainRenderer::RegisterMaterialPassBufferUsage(Renderer::RenderGraphBuild void TerrainRenderer::CreatePermanentResources() { ZoneScoped; + CreatePipelines(); + InitDescriptorSets(); + + RenderResources& resources = _gameRenderer->GetRenderResources(); + Renderer::TextureArrayDesc textureArrayDesc; textureArrayDesc.size = Renderer::Settings::MAX_TEXTURES; _textures = _renderer->CreateTextureArray(textureArrayDesc); - _materialPassDescriptorSet.Bind("_terrainColorTextures", _textures); + resources.terrainDescriptorSet.Bind("_terrainColorTextures", _textures); Renderer::TextureArrayDesc textureAlphaArrayDesc; textureAlphaArrayDesc.size = Terrain::CHUNK_NUM_PER_MAP; _alphaTextures = _renderer->CreateTextureArray(textureAlphaArrayDesc); - _materialPassDescriptorSet.Bind("_terrainAlphaTextures", _alphaTextures); + resources.terrainDescriptorSet.Bind("_terrainAlphaTextures", _alphaTextures); // Create and load a 1x1 RGBA8 unorm texture with a white color Renderer::DataTextureDesc defaultTextureDesc; @@ -880,18 +887,7 @@ void TerrainRenderer::CreatePermanentResources() alphaSamplerDesc.shaderVisibility = Renderer::ShaderVisibility::PIXEL; _alphaSampler = _renderer->CreateSampler(alphaSamplerDesc); - _materialPassDescriptorSet.Bind("_alphaSampler"_h, _alphaSampler); - - Renderer::SamplerDesc colorSamplerDesc; - colorSamplerDesc.enabled = true; - colorSamplerDesc.filter = Renderer::SamplerFilter::MIN_MAG_MIP_LINEAR; - colorSamplerDesc.addressU = Renderer::TextureAddressMode::WRAP; - colorSamplerDesc.addressV = Renderer::TextureAddressMode::WRAP; - colorSamplerDesc.addressW = Renderer::TextureAddressMode::CLAMP; - colorSamplerDesc.shaderVisibility = Renderer::ShaderVisibility::PIXEL; - - _colorSampler = _renderer->CreateSampler(colorSamplerDesc); - _materialPassDescriptorSet.Bind("_colorSampler"_h, _colorSampler); + resources.terrainDescriptorSet.Bind("_alphaSampler"_h, _alphaSampler); Renderer::SamplerDesc occlusionSamplerDesc; occlusionSamplerDesc.filter = Renderer::SamplerFilter::MINIMUM_MIN_MAG_MIP_LINEAR; @@ -921,8 +917,9 @@ void TerrainRenderer::CreatePermanentResources() memset(uploadBuffer->mappedMemory, 0, desc.size); static_cast(uploadBuffer->mappedMemory)[0] = Terrain::CELL_NUM_INDICES; - _fillPassDescriptorSet.Bind("_drawCount"_h, _argumentBuffer); - _cullingPassDescriptorSet.Bind("_arguments"_h, _argumentBuffer); + _occluderFillPassDescriptorSet.Bind("_drawCount"_h, _argumentBuffer); + _geometryFillPassDescriptorSet.Bind("_drawCount"_h, _argumentBuffer); + _resetIndirectDescriptorSet.Bind("_arguments"_h, _argumentBuffer); desc.size = sizeof(u32) * Renderer::Settings::MAX_VIEWS; desc.usage = Renderer::BufferUsage::STORAGE_BUFFER | Renderer::BufferUsage::TRANSFER_DESTINATION; @@ -988,22 +985,17 @@ void TerrainRenderer::CreatePermanentResources() _chunkDatas.SetDebugName("TerrainChunkData"); _chunkDatas.SetUsage(Renderer::BufferUsage::STORAGE_BUFFER); - - CreateTerrainPipelines(); } -void TerrainRenderer::CreateTerrainPipelines() +void TerrainRenderer::CreatePipelines() { - bool supportsExtendedTextures = _renderer->HasExtendedTextureSupport(); - // Reset Indirect Buffer { Renderer::ComputePipelineDesc pipelineDesc; pipelineDesc.debugName = "Terrain Reset indirect"; Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Utils/ResetIndirectBuffer.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Utils/ResetIndirectBuffer.cs.hlsl"; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Utils/ResetIndirectBuffer.cs"_h, "Utils/ResetIndirectBuffer.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); _resetIndirectBufferPipeline = _renderer->CreatePipeline(pipelineDesc); @@ -1014,8 +1006,7 @@ void TerrainRenderer::CreateTerrainPipelines() pipelineDesc.debugName = "Terrain Fill Draw Calls"; Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Terrain/FillDrawCalls.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Terrain/FillDrawCalls.cs.hlsl"; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Terrain/FillDrawCalls.cs"_h, "Terrain/FillDrawCalls.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); _fillDrawCallsPipeline = _renderer->CreatePipeline(pipelineDesc); @@ -1026,8 +1017,7 @@ void TerrainRenderer::CreateTerrainPipelines() pipelineDesc.debugName = "Terrain Culling"; Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Terrain/Culling.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "Terrain/Culling.cs.hlsl"; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Terrain/Culling.cs"_h, "Terrain/Culling.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); _cullingPipeline = _renderer->CreatePipeline(pipelineDesc); @@ -1043,24 +1033,16 @@ void TerrainRenderer::CreateTerrainPipelines() std::vector permutationFields = { { "EDITOR_PASS", "0" }, - { "SHADOW_PASS", "0" }, - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } + { "SHADOW_PASS", "0" } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Terrain/Draw.vs.hlsl", permutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Terrain/Draw.vs.hlsl"; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Terrain/Draw.vs", permutationFields); + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Terrain/Draw.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); } Renderer::PixelShaderDesc pixelShaderDesc; { - std::vector permutationFields = - { - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } - }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Terrain/Draw.ps.hlsl", permutationFields); - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - pixelShaderDesc.shaderEntry.debugName = "Terrain/Draw.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Terrain/Draw.ps"_h, "Terrain/Draw.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); } @@ -1090,12 +1072,10 @@ void TerrainRenderer::CreateTerrainPipelines() std::vector permutationFields = { { "EDITOR_PASS", "0" }, - { "SHADOW_PASS", "1" }, - { "SUPPORTS_EXTENDED_TEXTURES", supportsExtendedTextures ? "1" : "0" } + { "SHADOW_PASS", "1" } }; - u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Terrain/Draw.vs.hlsl", permutationFields); - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash); - vertexShaderDesc.shaderEntry.debugName = "Terrain/Draw.vs.hlsl"; + u32 shaderEntryNameHash = Renderer::GetShaderEntryNameHash("Terrain/Draw.vs", permutationFields); + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry(shaderEntryNameHash, "Terrain/Draw.vs"); pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); } @@ -1117,20 +1097,36 @@ void TerrainRenderer::CreateTerrainPipelines() } } +void TerrainRenderer::InitDescriptorSets() +{ + _occluderFillPassDescriptorSet.RegisterPipeline(_renderer, _fillDrawCallsPipeline); + _occluderFillPassDescriptorSet.Init(_renderer); + + _resetIndirectDescriptorSet.RegisterPipeline(_renderer, _resetIndirectBufferPipeline); + _resetIndirectDescriptorSet.Init(_renderer); + + _cullingPassDescriptorSet.RegisterPipeline(_renderer, _cullingPipeline); + _cullingPassDescriptorSet.Init(_renderer); + + _geometryFillPassDescriptorSet.RegisterPipeline(_renderer, _fillDrawCallsPipeline); + _geometryFillPassDescriptorSet.Init(_renderer); +} + void TerrainRenderer::SyncToGPU() { ZoneScoped; + RenderResources& resources = _gameRenderer->GetRenderResources(); + if (_vertices.SyncToGPU(_renderer)) { - _geometryPassDescriptorSet.Bind("_packedTerrainVertices", _vertices.GetBuffer()); - _materialPassDescriptorSet.Bind("_packedTerrainVertices", _vertices.GetBuffer()); + resources.terrainDescriptorSet.Bind("_packedTerrainVertices", _vertices.GetBuffer()); } if (_instanceDatas.SyncToGPU(_renderer)) { - _geometryPassDescriptorSet.Bind("_instanceDatas", _instanceDatas.GetBuffer()); - _materialPassDescriptorSet.Bind("_instanceDatas", _instanceDatas.GetBuffer()); - _fillPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); + resources.terrainDescriptorSet.Bind("_instanceDatas", _instanceDatas.GetBuffer()); + _occluderFillPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); + _geometryFillPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); _cullingPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); { @@ -1141,26 +1137,25 @@ void TerrainRenderer::SyncToGPU() _culledInstanceBuffer = _renderer->CreateBuffer(_culledInstanceBuffer, desc); _cullingPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); - _fillPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); + _occluderFillPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); + _geometryFillPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); } } if (_cellDatas.SyncToGPU(_renderer)) { - _geometryPassDescriptorSet.Bind("_packedCellData", _cellDatas.GetBuffer()); - _materialPassDescriptorSet.Bind("_packedCellData", _cellDatas.GetBuffer()); + resources.terrainDescriptorSet.Bind("_packedCellData", _cellDatas.GetBuffer()); { - Renderer::BufferDesc desc; - desc.name = "TerrainCulledInstanceBitMaskBuffer"; - _culledInstanceBitMaskBufferSizePerView = RenderUtils::CalcCullingBitmaskSize(_cellDatas.Capacity()); + Renderer::BufferDesc desc; desc.size = _culledInstanceBitMaskBufferSizePerView * Renderer::Settings::MAX_VIEWS; desc.usage = Renderer::BufferUsage::STORAGE_BUFFER | Renderer::BufferUsage::TRANSFER_DESTINATION; for (u32 i = 0; i < _culledInstanceBitMaskBuffer.Num; i++) { + desc.name = "TerrainCulledInstanceBitMaskBuffer" + std::to_string(i); _culledInstanceBitMaskBuffer.Get(i) = _renderer->CreateAndFillBuffer(_culledInstanceBitMaskBuffer.Get(i), desc, [](void* mappedMemory, size_t size) { memset(mappedMemory, 0, size); @@ -1171,7 +1166,7 @@ void TerrainRenderer::SyncToGPU() if (_chunkDatas.SyncToGPU(_renderer)) { - _materialPassDescriptorSet.Bind("_chunkData", _chunkDatas.GetBuffer()); + resources.terrainDescriptorSet.Bind("_chunkData", _chunkDatas.GetBuffer()); } // Sync CellHeightRanges to GPU @@ -1215,12 +1210,11 @@ void TerrainRenderer::Draw(const RenderResources& resources, u8 frameIndex, Rend commandList.PushConstant(constants, 0, sizeof(PushConstants)); // Bind descriptors - params.drawDescriptorSet.Bind("_instanceDatas"_h, params.instanceBuffer); + params.drawDescriptorSet.Bind("_culledInstanceDatas"_h, params.instanceBuffer); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::GLOBAL, params.globalDescriptorSet, frameIndex); - //commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::SHADOWS, &resources.shadowDescriptorSet, frameIndex); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::TERRAIN, params.drawDescriptorSet, frameIndex); + commandList.BindDescriptorSet(params.globalDescriptorSet, frameIndex); + commandList.BindDescriptorSet(params.drawDescriptorSet, frameIndex); if (params.cullingEnabled) { @@ -1263,7 +1257,7 @@ void TerrainRenderer::FillDrawCalls(u8 frameIndex, Renderer::RenderGraphResource params.fillSet.Bind("_prevCulledInstancesBitMask"_h, params.prevCulledInstanceBitMaskBuffer); // Bind descriptorset - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, params.fillSet, frameIndex); + commandList.BindDescriptorSet(params.fillSet, frameIndex); commandList.Dispatch((params.cellCount + 31) / 32, 1, 1); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.h index db83993..9c6edf3 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.h @@ -56,7 +56,6 @@ class TerrainRenderer u32 AddChunk(u32 chunkHash, Map::Chunk* chunk, ivec2 chunkGridPos); u32 AddChunk(u32 chunkHash, Map::Chunk* chunk, ivec2 chunkGridPos, u32 chunkDataStartOffset, u32 cellDataStartOffset, u32 vertexDataStartOffset); - Renderer::DescriptorSet& GetMaterialPassDescriptorSet() { return _materialPassDescriptorSet; } void RegisterMaterialPassBufferUsage(Renderer::RenderGraphBuilder& builder); // Drawcall stats @@ -71,7 +70,8 @@ class TerrainRenderer private: void CreatePermanentResources(); - void CreateTerrainPipelines(); + void CreatePipelines(); + void InitDescriptorSets(); void SyncToGPU(); @@ -186,10 +186,10 @@ class TerrainRenderer Renderer::SamplerID _alphaSampler; Renderer::SamplerID _occlusionSampler; - Renderer::DescriptorSet _fillPassDescriptorSet; + Renderer::DescriptorSet _occluderFillPassDescriptorSet; + Renderer::DescriptorSet _resetIndirectDescriptorSet; Renderer::DescriptorSet _cullingPassDescriptorSet; - Renderer::DescriptorSet _geometryPassDescriptorSet; - Renderer::DescriptorSet _materialPassDescriptorSet; + Renderer::DescriptorSet _geometryFillPassDescriptorSet; std::vector _cellBoundingBoxes; std::vector _chunkBoundingBoxes; diff --git a/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp index 60231d9..c052010 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp @@ -34,7 +34,6 @@ TextureRenderer::TextureRenderer(Renderer::Renderer* renderer, GameRenderer* gam : _renderer(renderer) , _gameRenderer(gameRenderer) , _debugRenderer(debugRenderer) - , _descriptorSet(Renderer::DescriptorSetSlot::PER_PASS) , _mipResolveDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) { CreatePermanentResources(); @@ -122,7 +121,8 @@ void TextureRenderer::AddTexturePass(Renderer::RenderGraph* renderGraph, RenderR { struct Data { - Renderer::DescriptorSetResource descriptorSet; + u32 numRenderTextureToTextureRequests; + robin_hood::unordered_map descriptorSets; Renderer::DescriptorSetResource mipResolveDescriptorSet; }; renderGraph->AddPass("TextureRenderer", @@ -130,7 +130,26 @@ void TextureRenderer::AddTexturePass(Renderer::RenderGraph* renderGraph, RenderR { using BufferUsage = Renderer::BufferPassUsage; - data.descriptorSet = builder.Use(_descriptorSet); + // Init pipelines + data.numRenderTextureToTextureRequests = static_cast(_renderTextureToTextureRequests.try_dequeue_bulk(_renderTextureToTextureWork.begin(), 256)); + for(u32 i = 0; i < data.numRenderTextureToTextureRequests; i++) + { + RenderTextureToTextureRequest& request = _renderTextureToTextureWork[i]; + + // Make sure the pipeline for this format exists + Renderer::ImageFormat format = _renderer->GetDesc(request.dst).format; + GetPipelineForFormat(format); + + // Add textures to array + _renderTextureToTextureWorkTextureArrayIndex[i] = _renderer->AddTextureToArray(request.src, _sourceTextures); + } + _renderer->FlushTextureArrayDescriptors(_sourceTextures); + + for(auto& [format, descriptorSet] : _descriptorSets) + { + data.descriptorSets[format] = builder.Use(descriptorSet); + } + data.mipResolveDescriptorSet = builder.Use(_mipResolveDescriptorSet); builder.Write(_mipAtomicBuffer, BufferUsage::COMPUTE); @@ -141,14 +160,14 @@ void TextureRenderer::AddTexturePass(Renderer::RenderGraph* renderGraph, RenderR { GPU_SCOPED_PROFILER_ZONE(commandList, TextureRendering); - u32 numRenderTextureToTextureRequests = static_cast(_renderTextureToTextureRequests.try_dequeue_bulk(_renderTextureToTextureWork.begin(), 256)); - if (numRenderTextureToTextureRequests > 0) + if (data.numRenderTextureToTextureRequests > 0) { ZoneScopedN("Render Texture To Texture Requests"); - for (u32 i = 0; i < numRenderTextureToTextureRequests; i++) + for (u32 i = 0; i < data.numRenderTextureToTextureRequests; i++) { RenderTextureToTextureRequest& request = _renderTextureToTextureWork[i]; - RenderTextureToTexture(graphResources, commandList, frameIndex, data.descriptorSet, request.dst, request.dstRectMin, request.dstRectMax, request.src, request.srcRectMin, request.srcRectMax); + u32 srcArrayIndex = _renderTextureToTextureWorkTextureArrayIndex[i]; + RenderTextureToTexture(graphResources, commandList, frameIndex, data.descriptorSets, request.dst, request.dstRectMin, request.dstRectMax, srcArrayIndex, request.srcRectMin, request.srcRectMax); } // Resolve mips @@ -162,13 +181,16 @@ void TextureRenderer::AddTexturePass(Renderer::RenderGraph* renderGraph, RenderR vec2 renderSize = _renderer->GetRenderSize(); commandList.SetViewport(0, 0, renderSize.x, renderSize.y, 0.0f, 1.0f); commandList.SetScissorRect(0, static_cast(renderSize.x), 0, static_cast(renderSize.y)); + + // DEBUG: Enable this to keep rendering requests every frame for easier capture + //_renderTextureToTextureRequests.enqueue_bulk(&_renderTextureToTextureWork[0], data.numRenderTextureToTextureRequests); } }); } Renderer::TextureID TextureRenderer::MakeRenderableCopy(Renderer::TextureID texture, u32 width, u32 height) { - Renderer::TextureBaseDesc textureBaseDesc = _renderer->GetTextureDesc(texture); + Renderer::TextureBaseDesc textureBaseDesc = _renderer->GetDesc(texture); Renderer::DataTextureDesc desc; desc.width = width > 0 ? width : textureBaseDesc.width; @@ -202,7 +224,15 @@ void TextureRenderer::RequestRenderTextureToTexture(Renderer::TextureID dst, con void TextureRenderer::CreatePermanentResources() { + CreatePipelines(); + InitDescriptorSets(); + + Renderer::TextureArrayDesc textureArrayDesc; + textureArrayDesc.size = 4096; + _sourceTextures = _renderer->CreateTextureArray(textureArrayDesc); + _renderTextureToTextureWork.resize(256); + _renderTextureToTextureWorkTextureArrayIndex.resize(256); // Mip resolve atomic buffer Renderer::BufferDesc mipAtomicBufferDesc; @@ -226,7 +256,6 @@ void TextureRenderer::CreatePermanentResources() blitSamplerDesc.maxLOD = 16.f; _blitSampler = _renderer->CreateSampler(blitSamplerDesc); - _descriptorSet.Bind("_sampler"_h, _blitSampler); // Mip resolve sampler Renderer::SamplerDesc mipDownSamplerDesc; @@ -239,22 +268,30 @@ void TextureRenderer::CreatePermanentResources() _mipResolveSampler = _renderer->CreateSampler(mipDownSamplerDesc); _mipResolveDescriptorSet.Bind("srcSampler", _mipResolveSampler); +} +void TextureRenderer::CreatePipelines() +{ // Mip resolve compute pipeline Renderer::ComputePipelineDesc pipelineDesc; pipelineDesc.debugName = "Downsample Mips"; Renderer::ComputeShaderDesc shaderDesc; - shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("DownSampler/SinglePassDownsampler.cs.hlsl"_h); - shaderDesc.shaderEntry.debugName = "DownSampler/SinglePassDownsampler.cs.hlsl"; + shaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("DownSampler/SinglePassDownsampler.cs"_h, "DownSampler/SinglePassDownsampler.cs"); pipelineDesc.computeShader = _renderer->LoadShader(shaderDesc); _mipDownsamplerPipeline = _renderer->CreatePipeline(pipelineDesc); } -void TextureRenderer::RenderTextureToTexture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, Renderer::DescriptorSetResource& descriptorSet, Renderer::TextureID dst, const vec2& dstRectMin, const vec2& dstRectMax, Renderer::TextureID src, const vec2& srcRectMin, const vec2& srcRectMax) +void TextureRenderer::InitDescriptorSets() { - Renderer::TextureBaseDesc destinationDesc = _renderer->GetTextureDesc(dst); + _mipResolveDescriptorSet.RegisterPipeline(_renderer, _mipDownsamplerPipeline); + _mipResolveDescriptorSet.Init(_renderer); +} + +void TextureRenderer::RenderTextureToTexture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, robin_hood::unordered_map& descriptorSets, Renderer::TextureID dst, const vec2& dstRectMin, const vec2& dstRectMax, u32 srcArrayIndex, const vec2& srcRectMin, const vec2& srcRectMax) +{ + Renderer::TextureBaseDesc destinationDesc = _renderer->GetDesc(dst); vec2 dstSize = vec2(destinationDesc.width, destinationDesc.height); Renderer::TextureRenderPassDesc renderPassDesc; @@ -279,12 +316,14 @@ void TextureRenderer::RenderTextureToTexture(Renderer::RenderGraphResources& gra static_cast(pixelOffset.y + pixelExtent.y) ); - Renderer::ImageFormat format = _renderer->GetTextureDesc(dst).format; + Renderer::ImageFormat format = _renderer->GetDesc(dst).format; Renderer::GraphicsPipelineID pipeline = GetPipelineForFormat(format); commandList.BeginPipeline(pipeline); - descriptorSet.BindRead("_texture", src); - commandList.BindDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS, descriptorSet, frameIndex); + Renderer::DescriptorSetResource& descriptorSet = descriptorSets[format]; + + //descriptorSet.Bind2("_texture", src); + commandList.BindDescriptorSet(descriptorSet, frameIndex); struct BlitConstant { @@ -292,6 +331,7 @@ void TextureRenderer::RenderTextureToTexture(Renderer::RenderGraphResources& gra vec4 additiveColor; vec4 uvOffsetAndExtent; u32 channelRedirectors; + u32 textureIndex; }; BlitConstant* constants = graphResources.FrameNew(); @@ -300,6 +340,7 @@ void TextureRenderer::RenderTextureToTexture(Renderer::RenderGraphResources& gra constants->uvOffsetAndExtent = vec4(srcRectMin, srcRectMax - srcRectMin); constants->channelRedirectors = 0x03020100; + constants->textureIndex = srcArrayIndex; commandList.PushConstant(constants, 0, sizeof(BlitConstant)); @@ -313,7 +354,7 @@ void TextureRenderer::RenderTextureToTexture(Renderer::RenderGraphResources& gra void TextureRenderer::ResolveMips(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, Renderer::DescriptorSetResource& descriptorSet, Renderer::TextureID textureID) { - Renderer::TextureBaseDesc textureDesc = _renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc textureDesc = _renderer->GetDesc(textureID); Renderer::TextureRenderPassDesc renderPassDesc; renderPassDesc.renderTargets[0] = textureID; @@ -321,16 +362,18 @@ void TextureRenderer::ResolveMips(Renderer::RenderGraphResources& graphResources commandList.BeginTextureComputeWritePass(renderPassDesc); commandList.BeginPipeline(_mipDownsamplerPipeline); - descriptorSet.BindReadWrite("imgSrc", textureID);// , 0); - descriptorSet.BindWrite("imgDst", textureID, 1, 12); - descriptorSet.BindWrite("imgDst5", textureID, 6); - varAU2(dispatchThreadGroupCountXY); varAU2(workGroupOffset); varAU2(numWorkGroupsAndMips); varAU4(rectInfo) = initAU4(0, 0, static_cast(textureDesc.width), static_cast(textureDesc.height)); // left, top, width, height SpdSetup(dispatchThreadGroupCountXY, workGroupOffset, numWorkGroupsAndMips, rectInfo); + numWorkGroupsAndMips[1] = numWorkGroupsAndMips[1] - 1; // We seem to disagree how many mips we have... + + descriptorSet.Bind("imgSrc", textureID); + descriptorSet.Bind("imgDst", textureID, 1, numWorkGroupsAndMips[1]); + descriptorSet.Bind("imgDst5", textureID, 6); + struct Constants { u32 mips; @@ -349,7 +392,7 @@ void TextureRenderer::ResolveMips(Renderer::RenderGraphResources& graphResources commandList.PushConstant(constants, 0, sizeof(Constants)); - commandList.BindDescriptorSet(Renderer::PER_PASS, descriptorSet, frameIndex); + commandList.BindDescriptorSet(descriptorSet, frameIndex); commandList.Dispatch(dispatchThreadGroupCountXY[0], dispatchThreadGroupCountXY[1], 1); @@ -364,10 +407,7 @@ Renderer::GraphicsPipelineID TextureRenderer::GetPipelineForFormat(Renderer::Ima return _pipelines[format]; } - Renderer::GraphicsPipelineID pipeline = CreatePipeline(format); - _pipelines[format] = pipeline; - - return pipeline; + return CreatePipeline(format); } Renderer::GraphicsPipelineID TextureRenderer::CreatePipeline(Renderer::ImageFormat format) @@ -376,13 +416,11 @@ Renderer::GraphicsPipelineID TextureRenderer::CreatePipeline(Renderer::ImageForm // Shaders Renderer::VertexShaderDesc vertexShaderDesc; - vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Blitting/Blit.vs.hlsl"_h); - vertexShaderDesc.shaderEntry.debugName = "Blitting/Blit.vs.hlsl"; + vertexShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Blitting/Blit.vs"_h, "Blitting/Blit.vs");; pipelineDesc.states.vertexShader = _renderer->LoadShader(vertexShaderDesc); Renderer::PixelShaderDesc pixelShaderDesc; - pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Blitting/BlitSample.ps.hlsl"_h); - pixelShaderDesc.shaderEntry.debugName = "Blitting/BlitSample.ps.hlsl"; + pixelShaderDesc.shaderEntry = _gameRenderer->GetShaderEntry("Blitting/BlitSampleTexArray.ps"_h, "Blitting/BlitSampleTexArray.ps"); pipelineDesc.states.pixelShader = _renderer->LoadShader(pixelShaderDesc); // Depth state @@ -403,5 +441,18 @@ Renderer::GraphicsPipelineID TextureRenderer::CreatePipeline(Renderer::ImageForm pipelineDesc.states.blendState.renderTargets[0].destBlendAlpha = Renderer::BlendMode::ONE; pipelineDesc.states.blendState.renderTargets[0].blendOpAlpha = Renderer::BlendOp::MAX; - return _renderer->CreatePipeline(pipelineDesc); // This will compile the pipeline and return the ID, or just return ID of cached pipeline + Renderer::GraphicsPipelineID pipeline = _renderer->CreatePipeline(pipelineDesc); + _pipelines[format] = pipeline; + + // Create descriptor set for this pipeline + auto [it, inserted] = _descriptorSets.try_emplace(format, Renderer::DescriptorSet(Renderer::DescriptorSetSlot::PER_PASS)); + + Renderer::DescriptorSet& descriptorSet = it->second; + descriptorSet.RegisterPipeline(_renderer, pipeline); + descriptorSet.Init(_renderer); + + descriptorSet.Bind("_sampler"_h, _blitSampler); + descriptorSet.Bind("_textures"_h, _sourceTextures); + + return pipeline; } diff --git a/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.h index e3710a6..421a953 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.h @@ -42,8 +42,10 @@ class TextureRenderer private: void CreatePermanentResources(); + void CreatePipelines(); + void InitDescriptorSets(); - void RenderTextureToTexture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, Renderer::DescriptorSetResource& descriptorSet, Renderer::TextureID dst, const vec2& dstRectMin, const vec2& dstRectMax, Renderer::TextureID src, const vec2& srcRectMin, const vec2& srcRectMax); + void RenderTextureToTexture(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, robin_hood::unordered_map& descriptorSets, Renderer::TextureID dst, const vec2& dstRectMin, const vec2& dstRectMax, u32 srcArrayIndex, const vec2& srcRectMin, const vec2& srcRectMax); void ResolveMips(Renderer::RenderGraphResources& graphResources, Renderer::CommandList& commandList, u32 frameIndex, Renderer::DescriptorSetResource& descriptorSet, Renderer::TextureID textureID); Renderer::GraphicsPipelineID GetPipelineForFormat(Renderer::ImageFormat format); @@ -72,17 +74,21 @@ class TextureRenderer DebugRenderer* _debugRenderer; robin_hood::unordered_map _pipelines; + robin_hood::unordered_map _descriptorSets; Renderer::ComputePipelineID _mipDownsamplerPipeline; Renderer::BufferID _mipAtomicBuffer; Renderer::SamplerID _blitSampler; Renderer::SamplerID _mipResolveSampler; - - Renderer::DescriptorSet _descriptorSet; + + Renderer::TextureArrayID _sourceTextures; + + //Renderer::DescriptorSet _descriptorSet; Renderer::DescriptorSet _mipResolveDescriptorSet; moodycamel::ConcurrentQueue _renderTextureToTextureRequests; std::vector _renderTextureToTextureWork; + std::vector _renderTextureToTextureWorkTextureArrayIndex; robin_hood::unordered_set _texturesNeedingMipResolve; }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.cpp index a1b2b1d..f4b4ac8 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.cpp @@ -15,9 +15,6 @@ UIRenderer::UIRenderer(Renderer::Renderer* renderer) : _renderer(renderer) - , _passDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) - , _drawImageDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) - , _drawTextDescriptorSet(Renderer::DescriptorSetSlot::PER_PASS) { CreatePermanentResources(); } @@ -68,47 +65,6 @@ void UIRenderer::AddImguiPass(Renderer::RenderGraph* renderGraph, RenderResource void UIRenderer::CreatePermanentResources() { - // Sampler - Renderer::SamplerDesc samplerDesc; - samplerDesc.enabled = true; - samplerDesc.filter = Renderer::SamplerFilter::MIN_MAG_MIP_LINEAR; - samplerDesc.addressU = Renderer::TextureAddressMode::CLAMP; - samplerDesc.addressV = Renderer::TextureAddressMode::CLAMP; - samplerDesc.addressW = Renderer::TextureAddressMode::CLAMP; - samplerDesc.shaderVisibility = Renderer::ShaderVisibility::PIXEL; - - _linearSampler = _renderer->CreateSampler(samplerDesc); - _passDescriptorSet.Bind("_sampler"_h, _linearSampler); - - // Index buffer - static const u32 indexBufferSize = sizeof(u16) * 6; - - Renderer::BufferDesc bufferDesc; - bufferDesc.name = "IndexBuffer"; - bufferDesc.size = indexBufferSize; - bufferDesc.usage = Renderer::BufferUsage::INDEX_BUFFER | Renderer::BufferUsage::TRANSFER_DESTINATION; - bufferDesc.cpuAccess = Renderer::BufferCPUAccess::AccessNone; - - _indexBuffer = _renderer->CreateBuffer(bufferDesc); - - Renderer::BufferDesc stagingBufferDesc; - stagingBufferDesc.name = "StagingBuffer"; - stagingBufferDesc.size = indexBufferSize; - stagingBufferDesc.usage = Renderer::BufferUsage::INDEX_BUFFER | Renderer::BufferUsage::TRANSFER_SOURCE; - stagingBufferDesc.cpuAccess = Renderer::BufferCPUAccess::WriteOnly; - - Renderer::BufferID stagingBuffer = _renderer->CreateBuffer(stagingBufferDesc); - - u16* index = static_cast(_renderer->MapBuffer(stagingBuffer)); - index[0] = 0; - index[1] = 1; - index[2] = 2; - index[3] = 1; - index[4] = 3; - index[5] = 2; - _renderer->UnmapBuffer(stagingBuffer); - - _renderer->QueueDestroyBuffer(stagingBuffer); - _renderer->CopyBuffer(_indexBuffer, 0, stagingBuffer, 0, indexBufferSize); + } diff --git a/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.h b/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.h index 9e659b8..dd48cb3 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.h +++ b/Source/Game-Lib/Game-Lib/Rendering/UIRenderer.h @@ -26,11 +26,4 @@ class UIRenderer private: Renderer::Renderer* _renderer; - - Renderer::SamplerID _linearSampler; - Renderer::BufferID _indexBuffer; - - Renderer::DescriptorSet _passDescriptorSet; - Renderer::DescriptorSet _drawImageDescriptorSet; - Renderer::DescriptorSet _drawTextDescriptorSet; }; \ No newline at end of file diff --git a/Source/Game-Lib/Game-Lib/Scripting/Handlers/UIHandler.cpp b/Source/Game-Lib/Game-Lib/Scripting/Handlers/UIHandler.cpp index f38c91b..4ddc0a8 100644 --- a/Source/Game-Lib/Game-Lib/Scripting/Handlers/UIHandler.cpp +++ b/Source/Game-Lib/Game-Lib/Scripting/Handlers/UIHandler.cpp @@ -545,7 +545,7 @@ namespace Scripting::UI textureDesc.path = texturePath; Renderer::TextureID textureID = renderer->LoadTexture(textureDesc); - Renderer::TextureBaseDesc baseDesc = renderer->GetTextureDesc(textureID); + Renderer::TextureBaseDesc baseDesc = renderer->GetDesc(textureID); zenith->Push(baseDesc.width); zenith->Push(baseDesc.height); } diff --git a/Source/Game-Lib/Game-Lib/Util/PhysicsUtil.cpp b/Source/Game-Lib/Game-Lib/Util/PhysicsUtil.cpp index 603b49f..f9e35e1 100644 --- a/Source/Game-Lib/Game-Lib/Util/PhysicsUtil.cpp +++ b/Source/Game-Lib/Game-Lib/Util/PhysicsUtil.cpp @@ -21,6 +21,7 @@ namespace Util { bool GetMouseWorldPosition(Editor::Viewport* viewport, vec3& outMouseWorldPosition) { + ZoneScoped; vec2 mousePosition; if (viewport->GetMousePosition(mousePosition)) { @@ -66,6 +67,7 @@ namespace Util bool CastRay(JPH::PhysicsSystem& physicsSystem, vec3& start, vec3& direction, JPH::RayCastResult& result) { + ZoneScoped; JPH::Vec3 joltStart = JPH::Vec3(start.x, start.y, start.z); JPH::Vec3 joltDirection = JPH::Vec3(direction.x, direction.y, direction.z); diff --git a/Source/ShaderCookerStandalone/main.cpp b/Source/ShaderCookerStandalone/main.cpp index cbc3e47..c649acd 100644 --- a/Source/ShaderCookerStandalone/main.cpp +++ b/Source/ShaderCookerStandalone/main.cpp @@ -87,11 +87,11 @@ i32 main(int argc, char* argv[]) if (!dirEntry.is_regular_file()) continue; - // Skip non .hlsl files - if (!StringUtils::EndsWith(path.filename().string(), ".hlsl")) + // Skip non .slang files + if (!StringUtils::EndsWith(path.filename().string(), ".slang")) continue; - if (!StringUtils::EndsWith(path.filename().string(), ".inc.hlsl")) + if (!StringUtils::EndsWith(path.filename().string(), ".inc.slang")) numNonIncludeShaders++; // Add this file to our list of shaders to compile @@ -126,6 +126,6 @@ i32 main(int argc, char* argv[]) u32 numCompiledShaders = compiler.GetNumCompiledShaders(); u32 numSkippedShaders = numNonIncludeShaders - numCompiledShaders - numFailedShaders; - NC_LOG_INFO("Compiled {0} shaders ({1} up to date) in {2}s", numCompiledShaders, numSkippedShaders, duration.count()); + NC_LOG_INFO("Compiled {0} shaders ({1} failed, {2} up to date) in {3}s", numCompiledShaders, numFailedShaders, numSkippedShaders, duration.count()); return 0; } \ No newline at end of file diff --git a/Source/Shaders/Shaders.lua b/Source/Shaders/Shaders.lua index 9500deb..feabfea 100644 --- a/Source/Shaders/Shaders.lua +++ b/Source/Shaders/Shaders.lua @@ -11,7 +11,7 @@ Solution.Util.CreateProject(mod.Name, "Utility", Solution.Projects.Current.BinDi local files = { sourceDir .. "/main.cpp", - sourceDir .. "/**.hlsl", + sourceDir .. "/**.slang", mod.Path .. "/" .. mod.Name .. ".lua" } Solution.Util.SetFiles(files) @@ -24,7 +24,7 @@ Solution.Util.CreateProject(mod.Name, "Utility", Solution.Projects.Current.BinDi BuildSettings:Add("Shader Source Dir", sourceDir) - Solution.Util.SetFilter("files:**.hlsl", function() + Solution.Util.SetFilter("files:**.slang", function() flags("ExcludeFromBuild") end) diff --git a/Source/Shaders/Shaders/Blitting/Blit.ps.hlsl b/Source/Shaders/Shaders/Blitting/Blit.ps.slang similarity index 97% rename from Source/Shaders/Shaders/Blitting/Blit.ps.hlsl rename to Source/Shaders/Shaders/Blitting/Blit.ps.slang index 6f8b963..875b078 100644 --- a/Source/Shaders/Shaders/Blitting/Blit.ps.hlsl +++ b/Source/Shaders/Shaders/Blitting/Blit.ps.slang @@ -1,6 +1,6 @@ permutation TEX_TYPE = [float, float2, float3, float4, int, int2, int3, int4, uint, uint2, uint3, uint4]; -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" [[vk::binding(0, PER_PASS)]] SamplerState _sampler; [[vk::binding(1, PER_PASS)]] Texture2D _texture; diff --git a/Source/Shaders/Shaders/Blitting/Blit.vs.hlsl b/Source/Shaders/Shaders/Blitting/Blit.vs.slang similarity index 100% rename from Source/Shaders/Shaders/Blitting/Blit.vs.hlsl rename to Source/Shaders/Shaders/Blitting/Blit.vs.slang diff --git a/Source/Shaders/Shaders/Blitting/BlitDepth.cs.hlsl b/Source/Shaders/Shaders/Blitting/BlitDepth.cs.slang similarity index 100% rename from Source/Shaders/Shaders/Blitting/BlitDepth.cs.hlsl rename to Source/Shaders/Shaders/Blitting/BlitDepth.cs.slang diff --git a/Source/Shaders/Shaders/Blitting/BlitSample.ps.hlsl b/Source/Shaders/Shaders/Blitting/BlitSample.ps.slang similarity index 97% rename from Source/Shaders/Shaders/Blitting/BlitSample.ps.hlsl rename to Source/Shaders/Shaders/Blitting/BlitSample.ps.slang index a565ef6..23da265 100644 --- a/Source/Shaders/Shaders/Blitting/BlitSample.ps.hlsl +++ b/Source/Shaders/Shaders/Blitting/BlitSample.ps.slang @@ -1,5 +1,5 @@ -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" [[vk::binding(0, PER_PASS)]] SamplerState _sampler; [[vk::binding(1, PER_PASS)]] Texture2D _texture; diff --git a/Source/Shaders/Shaders/Blitting/BlitSampleTexArray.ps.slang b/Source/Shaders/Shaders/Blitting/BlitSampleTexArray.ps.slang new file mode 100644 index 0000000..49aab60 --- /dev/null +++ b/Source/Shaders/Shaders/Blitting/BlitSampleTexArray.ps.slang @@ -0,0 +1,48 @@ + +#include "Include/Common.inc.slang" + +[[vk::binding(0, PER_PASS)]] SamplerState _sampler; +[[vk::binding(1, PER_PASS)]] Texture2D _textures[4096]; + +struct Constants +{ + float4 colorMultiplier; + float4 additiveColor; + float4 uvOffsetAndExtent; + uint channelRedirectors; + uint sourceTextureIndex; +}; + +[[vk::push_constant]] Constants _constants; + +struct VSOutput +{ + float2 uv : TEXCOORD0; +}; + +[shader("fragment")] +float4 main(VSOutput input) : SV_Target +{ + float2 dimensions; + _textures[_constants.sourceTextureIndex].GetDimensions(dimensions.x, dimensions.y); + + float2 uv = float2(input.uv.x, 1.0 - input.uv.y); + uv = uv * _constants.uvOffsetAndExtent.zw + _constants.uvOffsetAndExtent.xy; + + float4 color = _textures[_constants.sourceTextureIndex].SampleLevel(_sampler, uv, 0); + + int rRedirector = _constants.channelRedirectors & 0xFF; + int gRedirector = (_constants.channelRedirectors >> 8) & 0xFF; + int bRedirector = (_constants.channelRedirectors >> 16) & 0xFF; + int aRedirector = (_constants.channelRedirectors >> 24) & 0xFF; + + color = color * _constants.colorMultiplier + _constants.additiveColor; + + float4 redirectedColor = float4(0, 0, 0, 0); + redirectedColor.r = color[rRedirector]; + redirectedColor.g = color[gRedirector]; + redirectedColor.b = color[bRedirector]; + redirectedColor.a = color[aRedirector]; + + return redirectedColor; +} \ No newline at end of file diff --git a/Source/Shaders/Shaders/Debug/Debug2D.ps.hlsl b/Source/Shaders/Shaders/Debug/Debug2D.ps.slang similarity index 100% rename from Source/Shaders/Shaders/Debug/Debug2D.ps.hlsl rename to Source/Shaders/Shaders/Debug/Debug2D.ps.slang diff --git a/Source/Shaders/Shaders/Debug/Debug2D.vs.hlsl b/Source/Shaders/Shaders/Debug/Debug2D.vs.slang similarity index 95% rename from Source/Shaders/Shaders/Debug/Debug2D.vs.hlsl rename to Source/Shaders/Shaders/Debug/Debug2D.vs.slang index e01e53d..f8e5b2f 100644 --- a/Source/Shaders/Shaders/Debug/Debug2D.vs.hlsl +++ b/Source/Shaders/Shaders/Debug/Debug2D.vs.slang @@ -1,4 +1,6 @@ +#include "DescriptorSet/Debug.inc.slang" + struct Vertex2D { float2 pos; diff --git a/Source/Shaders/Shaders/Debug/Debug3D.ps.hlsl b/Source/Shaders/Shaders/Debug/Debug3D.ps.slang similarity index 100% rename from Source/Shaders/Shaders/Debug/Debug3D.ps.hlsl rename to Source/Shaders/Shaders/Debug/Debug3D.ps.slang diff --git a/Source/Shaders/Shaders/Debug/Debug3D.vs.hlsl b/Source/Shaders/Shaders/Debug/Debug3D.vs.slang similarity index 90% rename from Source/Shaders/Shaders/Debug/Debug3D.vs.hlsl rename to Source/Shaders/Shaders/Debug/Debug3D.vs.slang index ebff032..d0612a2 100644 --- a/Source/Shaders/Shaders/Debug/Debug3D.vs.hlsl +++ b/Source/Shaders/Shaders/Debug/Debug3D.vs.slang @@ -1,5 +1,6 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Debug.inc.slang" +#include "DescriptorSet/Global.inc.slang" struct Vertex3D { diff --git a/Source/Shaders/Shaders/Debug/DebugSolid3D.ps.hlsl b/Source/Shaders/Shaders/Debug/DebugSolid3D.ps.slang similarity index 100% rename from Source/Shaders/Shaders/Debug/DebugSolid3D.ps.hlsl rename to Source/Shaders/Shaders/Debug/DebugSolid3D.ps.slang diff --git a/Source/Shaders/Shaders/Debug/DebugSolid3D.vs.hlsl b/Source/Shaders/Shaders/Debug/DebugSolid3D.vs.slang similarity index 95% rename from Source/Shaders/Shaders/Debug/DebugSolid3D.vs.hlsl rename to Source/Shaders/Shaders/Debug/DebugSolid3D.vs.slang index 23b04a9..175ffbf 100644 --- a/Source/Shaders/Shaders/Debug/DebugSolid3D.vs.hlsl +++ b/Source/Shaders/Shaders/Debug/DebugSolid3D.vs.slang @@ -1,5 +1,5 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" struct Vertex3D { diff --git a/Source/Shaders/Shaders/DescriptorSet/Debug.inc.hlsl b/Source/Shaders/Shaders/DescriptorSet/Debug.inc.slang similarity index 54% rename from Source/Shaders/Shaders/DescriptorSet/Debug.inc.hlsl rename to Source/Shaders/Shaders/DescriptorSet/Debug.inc.slang index fc250f9..4907410 100644 --- a/Source/Shaders/Shaders/DescriptorSet/Debug.inc.hlsl +++ b/Source/Shaders/Shaders/DescriptorSet/Debug.inc.slang @@ -1,6 +1,21 @@ #ifndef DEBUG_SET_INCLUDED #define DEBUG_SET_INCLUDED +struct DebugVertex2D +{ + float2 pos; + uint color; +}; + +struct DebugVertex3D +{ + float3 pos; + uint color; +}; + +// WARNING: For now, when you change this file, make sure you recompile ALL shaders or you might get descriptor set reflection issues +// This will be fixed later when we have better dependency tracking + [[vk::binding(0, DEBUG)]] RWStructuredBuffer _debugVertices2D; [[vk::binding(1, DEBUG)]] RWByteAddressBuffer _debugVertices2DCount; [[vk::binding(2, DEBUG)]] RWStructuredBuffer _debugVertices3D; diff --git a/Source/Shaders/Shaders/DescriptorSet/Global.inc.hlsl b/Source/Shaders/Shaders/DescriptorSet/Global.inc.hlsl deleted file mode 100644 index 267281a..0000000 --- a/Source/Shaders/Shaders/DescriptorSet/Global.inc.hlsl +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef GLOBAL_SET_INCLUDED -#define GLOBAL_SET_INCLUDED - -#include "Include/Camera.inc.hlsl" - -[[vk::binding(0, GLOBAL)]] StructuredBuffer _cameras; - -#endif // GLOBAL_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Global.inc.slang b/Source/Shaders/Shaders/DescriptorSet/Global.inc.slang new file mode 100644 index 0000000..f1d12d9 --- /dev/null +++ b/Source/Shaders/Shaders/DescriptorSet/Global.inc.slang @@ -0,0 +1,11 @@ +#ifndef GLOBAL_SET_INCLUDED +#define GLOBAL_SET_INCLUDED + +#include "Include/Camera.inc.slang" + +// WARNING: For now, when you change this file, make sure you recompile ALL shaders or you might get descriptor set reflection issues +// This will be fixed later when we have better dependency tracking + +[[vk::binding(0, GLOBAL)]] StructuredBuffer _cameras; + +#endif // GLOBAL_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Light.inc.hlsl b/Source/Shaders/Shaders/DescriptorSet/Light.inc.hlsl deleted file mode 100644 index 13ca73f..0000000 --- a/Source/Shaders/Shaders/DescriptorSet/Light.inc.hlsl +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef LIGHT_SET_INCLUDED -#define LIGHT_SET_INCLUDED - -#ifndef MAX_SHADOW_CASCADES -#define MAX_SHADOW_CASCADES 8 // Has to be kept in sync with the one in RenderSettings.h -#endif - -[[vk::binding(0, LIGHT)]] SamplerComparisonState _shadowCmpSampler; -[[vk::binding(1, LIGHT)]] SamplerState _shadowPointClampSampler; -[[vk::binding(2, LIGHT)]] Texture2D _shadowCascadeRTs[MAX_SHADOW_CASCADES]; -[[vk::binding(3, LIGHT)]] StructuredBuffer _packedDecals; // All decals in the world - -#endif // LIGHT_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Light.inc.slang b/Source/Shaders/Shaders/DescriptorSet/Light.inc.slang new file mode 100644 index 0000000..a2e51a3 --- /dev/null +++ b/Source/Shaders/Shaders/DescriptorSet/Light.inc.slang @@ -0,0 +1,17 @@ +#ifndef LIGHT_SET_INCLUDED +#define LIGHT_SET_INCLUDED + +#ifndef MAX_SHADOW_CASCADES +#define MAX_SHADOW_CASCADES 8 // Has to be kept in sync with the one in RenderSettings.h +#endif + +// WARNING: For now, when you change this file, make sure you recompile ALL shaders or you might get descriptor set reflection issues +// This will be fixed later when we have better dependency tracking + +[[vk::binding(0, LIGHT)]] StructuredBuffer _entityTiles; +[[vk::binding(1, LIGHT)]] SamplerComparisonState _shadowCmpSampler; +[[vk::binding(2, LIGHT)]] SamplerState _shadowPointClampSampler; +[[vk::binding(3, LIGHT)]] Texture2D _shadowCascadeRTs[MAX_SHADOW_CASCADES]; +[[vk::binding(4, LIGHT)]] StructuredBuffer _packedDecals; // All decals in the world + +#endif // LIGHT_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Model.inc.hlsl b/Source/Shaders/Shaders/DescriptorSet/Model.inc.hlsl deleted file mode 100644 index bac0b78..0000000 --- a/Source/Shaders/Shaders/DescriptorSet/Model.inc.hlsl +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MODEL_SET_INCLUDED -#define MODEL_SET_INCLUDED - -#include "Include/Common.inc.hlsl" - -#define MAX_MODEL_SAMPLERS 4 - -[[vk::binding(0, MODEL)]] StructuredBuffer _culledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered -[[vk::binding(1, MODEL)]] StructuredBuffer _instanceRefTable; -[[vk::binding(2, MODEL)]] StructuredBuffer _modelDrawCallDatas; -[[vk::binding(3, MODEL)]] StructuredBuffer _packedModelTextureDatas; -[[vk::binding(4, MODEL)]] StructuredBuffer _packedModelVertices; -[[vk::binding(5, MODEL)]] StructuredBuffer _modelInstanceDatas; -[[vk::binding(6, MODEL)]] StructuredBuffer _modelInstanceMatrices; -[[vk::binding(7, MODEL)]] StructuredBuffer _instanceBoneMatrices; -[[vk::binding(8, MODEL)]] StructuredBuffer _instanceTextureTransformMatrices; -[[vk::binding(9, MODEL)]] RWStructuredBuffer _animatedModelVertexPositions; -[[vk::binding(10, MODEL)]] StructuredBuffer _modelDraws; -[[vk::binding(11, MODEL)]] StructuredBuffer _modelIndices; -[[vk::binding(12, MODEL)]] StructuredBuffer _modelTextureUnits; -[[vk::binding(13, MODEL)]] SamplerState _samplers[MAX_MODEL_SAMPLERS]; -[[vk::binding(20, MODEL)]] Texture2D _modelTextures[MAX_TEXTURES]; // We give this index 20 because it always needs to be last in this descriptor set - -#endif // MODEL_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang b/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang new file mode 100644 index 0000000..13c5940 --- /dev/null +++ b/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang @@ -0,0 +1,26 @@ +#ifndef MODEL_SET_INCLUDED +#define MODEL_SET_INCLUDED + +#include "Include/Common.inc.slang" + +#define MAX_MODEL_SAMPLERS 4 + +// WARNING: For now, when you change this file, make sure you recompile ALL shaders or you might get descriptor set reflection issues +// This will be fixed later when we have better dependency tracking + +[[vk::binding(0, MODEL)]] StructuredBuffer _opaqueCulledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered +[[vk::binding(1, MODEL)]] StructuredBuffer _opaqueInstanceRefTable; +[[vk::binding(2, MODEL)]] StructuredBuffer _packedModelTextureDatas; +[[vk::binding(3, MODEL)]] StructuredBuffer _packedModelVertices; +[[vk::binding(4, MODEL)]] StructuredBuffer _modelInstanceDatas; +[[vk::binding(5, MODEL)]] StructuredBuffer _modelInstanceMatrices; +[[vk::binding(6, MODEL)]] StructuredBuffer _instanceBoneMatrices; +[[vk::binding(7, MODEL)]] StructuredBuffer _instanceTextureTransformMatrices; +[[vk::binding(8, MODEL)]] RWStructuredBuffer _animatedModelVertexPositions; +[[vk::binding(9, MODEL)]] StructuredBuffer _modelDraws; +[[vk::binding(10, MODEL)]] StructuredBuffer _modelIndices; +[[vk::binding(11, MODEL)]] StructuredBuffer _modelTextureUnits; +[[vk::binding(12, MODEL)]] SamplerState _samplers[MAX_MODEL_SAMPLERS]; +[[vk::binding(13, MODEL)]] Texture2D _modelTextures[]; // IMPORTANT: This has to be the last element in this set! + +#endif // MODEL_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Terrain.inc.hlsl b/Source/Shaders/Shaders/DescriptorSet/Terrain.inc.hlsl deleted file mode 100644 index 0cfbb63..0000000 --- a/Source/Shaders/Shaders/DescriptorSet/Terrain.inc.hlsl +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef TERRAIN_SET_INCLUDED -#define TERRAIN_SET_INCLUDED - -#include "Include/Common.inc.hlsl" - -#define NUM_CHUNKS_PER_MAP_SIDE (64) - -[[vk::binding(0, TERRAIN)]] StructuredBuffer _packedCellData; -[[vk::binding(1, TERRAIN)]] StructuredBuffer _packedTerrainVertices; -[[vk::binding(2, TERRAIN)]] StructuredBuffer _instanceDatas; -[[vk::binding(3, TERRAIN)]] StructuredBuffer _chunkData; -[[vk::binding(4, TERRAIN)]] SamplerState _alphaSampler; -[[vk::binding(7, TERRAIN)]] Texture2D _terrainColorTextures[MAX_TEXTURES]; -[[vk::binding(8, TERRAIN)]] Texture2DArray _terrainAlphaTextures[NUM_CHUNKS_PER_MAP_SIDE * NUM_CHUNKS_PER_MAP_SIDE]; - -#endif // TERRAIN_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Terrain.inc.slang b/Source/Shaders/Shaders/DescriptorSet/Terrain.inc.slang new file mode 100644 index 0000000..86a557c --- /dev/null +++ b/Source/Shaders/Shaders/DescriptorSet/Terrain.inc.slang @@ -0,0 +1,20 @@ +#ifndef TERRAIN_SET_INCLUDED +#define TERRAIN_SET_INCLUDED + +#include "Include/Common.inc.slang" + +#define NUM_CHUNKS_PER_MAP_SIDE (64) + +// WARNING: For now, when you change this file, make sure you recompile ALL shaders or you might get descriptor set reflection issues +// This will be fixed later when we have better dependency tracking + +[[vk::binding(0, TERRAIN)]] StructuredBuffer _packedCellData; +[[vk::binding(1, TERRAIN)]] StructuredBuffer _packedTerrainVertices; +[[vk::binding(2, TERRAIN)]] StructuredBuffer _instanceDatas; +[[vk::binding(3, TERRAIN)]] StructuredBuffer _culledInstanceDatas; +[[vk::binding(4, TERRAIN)]] StructuredBuffer _chunkData; +[[vk::binding(5, TERRAIN)]] SamplerState _alphaSampler; +[[vk::binding(6, TERRAIN)]] Texture2DArray _terrainAlphaTextures[NUM_CHUNKS_PER_MAP_SIDE * NUM_CHUNKS_PER_MAP_SIDE]; +[[vk::binding(7, TERRAIN)]] Texture2D _terrainColorTextures[]; // IMPORTANT: This has to be the last element in this set! + +#endif // TERRAIN_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Tiles.inc.hlsl b/Source/Shaders/Shaders/DescriptorSet/Tiles.inc.hlsl deleted file mode 100644 index 7f329cb..0000000 --- a/Source/Shaders/Shaders/DescriptorSet/Tiles.inc.hlsl +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TILES_SET_INCLUDED -#define TILES_SET_INCLUDED - -[[vk::binding(0, TILES)]] StructuredBuffer _entityTiles; - -#endif // TILES_SET_INCLUDED \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/_IncludeAll.cs.slang b/Source/Shaders/Shaders/DescriptorSet/_IncludeAll.cs.slang new file mode 100644 index 0000000..336c521 --- /dev/null +++ b/Source/Shaders/Shaders/DescriptorSet/_IncludeAll.cs.slang @@ -0,0 +1,21 @@ + +// This file includes all descriptor set includes and provides a dummy compute shader that we can use to init our descriptor sets and bind them. +// If you add more descriptor sets, please include them here. + +#include "Debug.inc.slang" +#include "Global.inc.slang" +#include "Light.inc.slang" +#include "Model.inc.slang" +#include "Terrain.inc.slang" + +// Includes that provide types used by descriptor sets +#include "Light/LightShared.inc.slang" +#include "Model/ModelShared.inc.slang" +#include "Terrain/TerrainShared.inc.slang" + +[shader("compute")] +[numthreads(8, 8, 1)] +void main(uint3 dispatchThreadId: SV_DispatchThreadID) +{ + // This is a placeholder compute shader that does nothing except for including all descriptor set files. +} \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/_IncludeAll.vs.slang b/Source/Shaders/Shaders/DescriptorSet/_IncludeAll.vs.slang new file mode 100644 index 0000000..2149fd5 --- /dev/null +++ b/Source/Shaders/Shaders/DescriptorSet/_IncludeAll.vs.slang @@ -0,0 +1,27 @@ + +// This file includes all descriptor set includes and provides a dummy vertex shader that we can use to init our descriptor sets and bind them. +// If you add more descriptor sets, please include them here. + +#include "Debug.inc.slang" +#include "Global.inc.slang" +#include "Light.inc.slang" +#include "Model.inc.slang" +#include "Terrain.inc.slang" + +// Includes that provide types used by descriptor sets +#include "Light/LightShared.inc.slang" +#include "Model/ModelShared.inc.slang" +#include "Terrain/TerrainShared.inc.slang" + +struct VSOut +{ + float4 Position : SV_Position; +}; + +[shader("vertex")] +VSOut main(uint vertexId: SV_VertexID) +{ + VSOut o; + o.Position = float4(0.0, 0.0, 0.0, 1.0); + return o; +} \ No newline at end of file diff --git a/Source/Shaders/Shaders/DownSampler/SinglePassDownsampler.cs.hlsl b/Source/Shaders/Shaders/DownSampler/SinglePassDownsampler.cs.slang similarity index 98% rename from Source/Shaders/Shaders/DownSampler/SinglePassDownsampler.cs.hlsl rename to Source/Shaders/Shaders/DownSampler/SinglePassDownsampler.cs.slang index 4b29ea2..a386eb1 100644 --- a/Source/Shaders/Shaders/DownSampler/SinglePassDownsampler.cs.hlsl +++ b/Source/Shaders/Shaders/DownSampler/SinglePassDownsampler.cs.slang @@ -53,7 +53,7 @@ struct SpdGlobalAtomicBuffer #define A_GPU #define A_HLSL -#include "DownSampler/ffx_a.inc.hlsl" +#include "DownSampler/ffx_a.inc.slang" groupshared AU1 spdCounter; @@ -171,7 +171,7 @@ AH4 SpdReduce4H(AH4 v0, AH4 v1, AH4 v2, AH4 v3) #define SPD_LINEAR_SAMPLER -#include "DownSampler/ffx_spd.inc.hlsl" +#include "DownSampler/ffx_spd.inc.slang" // Main function //-------------------------------------------------------------------------------------- diff --git a/Source/Shaders/Shaders/DownSampler/ffx_a.inc.hlsl b/Source/Shaders/Shaders/DownSampler/ffx_a.inc.slang similarity index 100% rename from Source/Shaders/Shaders/DownSampler/ffx_a.inc.hlsl rename to Source/Shaders/Shaders/DownSampler/ffx_a.inc.slang diff --git a/Source/Shaders/Shaders/DownSampler/ffx_spd.inc.hlsl b/Source/Shaders/Shaders/DownSampler/ffx_spd.inc.slang similarity index 100% rename from Source/Shaders/Shaders/DownSampler/ffx_spd.inc.hlsl rename to Source/Shaders/Shaders/DownSampler/ffx_spd.inc.slang diff --git a/Source/Shaders/Shaders/Editor/WorldGrid.ps.hlsl b/Source/Shaders/Shaders/Editor/WorldGrid.ps.slang similarity index 97% rename from Source/Shaders/Shaders/Editor/WorldGrid.ps.hlsl rename to Source/Shaders/Shaders/Editor/WorldGrid.ps.slang index 0365611..83041f5 100644 --- a/Source/Shaders/Shaders/Editor/WorldGrid.ps.hlsl +++ b/Source/Shaders/Shaders/Editor/WorldGrid.ps.slang @@ -1,5 +1,5 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Editor/WorldGrid.vs.hlsl b/Source/Shaders/Shaders/Editor/WorldGrid.vs.slang similarity index 95% rename from Source/Shaders/Shaders/Editor/WorldGrid.vs.hlsl rename to Source/Shaders/Shaders/Editor/WorldGrid.vs.slang index 4f19e1e..c0a5e46 100644 --- a/Source/Shaders/Shaders/Editor/WorldGrid.vs.hlsl +++ b/Source/Shaders/Shaders/Editor/WorldGrid.vs.slang @@ -1,5 +1,5 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" struct VertexInput { diff --git a/Source/Shaders/Shaders/Include/Camera.inc.hlsl b/Source/Shaders/Shaders/Include/Camera.inc.slang similarity index 100% rename from Source/Shaders/Shaders/Include/Camera.inc.hlsl rename to Source/Shaders/Shaders/Include/Camera.inc.slang diff --git a/Source/Shaders/Shaders/Include/Common.inc.hlsl b/Source/Shaders/Shaders/Include/Common.inc.slang similarity index 93% rename from Source/Shaders/Shaders/Include/Common.inc.hlsl rename to Source/Shaders/Shaders/Include/Common.inc.slang index b6a472e..37d1091 100644 --- a/Source/Shaders/Shaders/Include/Common.inc.hlsl +++ b/Source/Shaders/Shaders/Include/Common.inc.slang @@ -7,19 +7,6 @@ #define SIZEOF_UINT4 16 #define SIZEOF_DRAW_INDIRECT_ARGUMENTS 16 -#define MAX_TEXTURES_NORMAL 4096 // Don't increase this or we get issues with certain graphics cards not supporting enough textures -#define MAX_TEXTURES_EXTENDED 8192 // Keep this synced with RenderSettings.h - -#ifndef SUPPORTS_EXTENDED_TEXTURES -#define SUPPORTS_EXTENDED_TEXTURES 0 -#endif - -#if SUPPORTS_EXTENDED_TEXTURES -#define MAX_TEXTURES MAX_TEXTURES_EXTENDED -#else -#define MAX_TEXTURES MAX_TEXTURES_NORMAL -#endif - float2 OctWrap(float2 v) { return (1.0 - abs(v.yx)) * (select(v.xy >= 0.0, 1.0, -1.0)); diff --git a/Source/Shaders/Shaders/Include/Culling.inc.hlsl b/Source/Shaders/Shaders/Include/Culling.inc.slang similarity index 99% rename from Source/Shaders/Shaders/Include/Culling.inc.hlsl rename to Source/Shaders/Shaders/Include/Culling.inc.slang index 335557d..6116e86 100644 --- a/Source/Shaders/Shaders/Include/Culling.inc.hlsl +++ b/Source/Shaders/Shaders/Include/Culling.inc.slang @@ -1,8 +1,8 @@ #ifndef CULLING_INCLUDED #define CULLING_INCLUDED -#include "DescriptorSet/Global.inc.hlsl" -#include "Include/Common.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" +#include "Include/Common.inc.slang" struct AABBMinMax { diff --git a/Source/Shaders/Shaders/Include/Debug.inc.hlsl b/Source/Shaders/Shaders/Include/Debug.inc.slang similarity index 98% rename from Source/Shaders/Shaders/Include/Debug.inc.hlsl rename to Source/Shaders/Shaders/Include/Debug.inc.slang index 498b167..3c792c6 100644 --- a/Source/Shaders/Shaders/Include/Debug.inc.hlsl +++ b/Source/Shaders/Shaders/Include/Debug.inc.slang @@ -1,8 +1,8 @@ #ifndef DEBUG_INCLUDED #define DEBUG_INCLUDED -#include "DescriptorSet/Debug.inc.hlsl" -#include "Include/Culling.inc.hlsl" +#include "DescriptorSet/Debug.inc.slang" +#include "Include/Culling.inc.slang" static const float PI = 3.14159265f; @@ -36,12 +36,6 @@ struct DebugDrawContext2D uint offset; }; -struct DebugVertex2D -{ - float2 pos; - uint color; -}; - // The debug vertices need to be continuous in memory, so we have to allocate them upfront DebugDrawContext2D StartDraw2D(uint numVertices) { @@ -92,12 +86,6 @@ struct DebugDrawContext3D uint offset; }; -struct DebugVertex3D -{ - float3 pos; - uint color; -}; - // The debug vertices need to be continuous in memory, so we have to allocate them upfront DebugDrawContext3D StartDraw3D(uint numVertices) { diff --git a/Source/Shaders/Shaders/Include/Editor.inc.hlsl b/Source/Shaders/Shaders/Include/Editor.inc.slang similarity index 98% rename from Source/Shaders/Shaders/Include/Editor.inc.hlsl rename to Source/Shaders/Shaders/Include/Editor.inc.slang index 28e090a..4b228ca 100644 --- a/Source/Shaders/Shaders/Include/Editor.inc.hlsl +++ b/Source/Shaders/Shaders/Include/Editor.inc.slang @@ -1,7 +1,7 @@ #ifndef EDITOR_INCLUDED #define EDITOR_INCLUDED -#include "Include/VisibilityBuffers.inc.hlsl" +#include "Include/VisibilityBuffers.inc.slang" float sdCapsule(float3 p, float3 a, float3 b) { diff --git a/Source/Shaders/Shaders/Include/Lighting.inc.hlsl b/Source/Shaders/Shaders/Include/Lighting.inc.slang similarity index 97% rename from Source/Shaders/Shaders/Include/Lighting.inc.hlsl rename to Source/Shaders/Shaders/Include/Lighting.inc.slang index c08150c..9e5ca24 100644 --- a/Source/Shaders/Shaders/Include/Lighting.inc.hlsl +++ b/Source/Shaders/Shaders/Include/Lighting.inc.slang @@ -1,8 +1,8 @@ #ifndef LIGHTING_INCLUDED #define LIGHTING_INCLUDED -#include "Include/Shadows.inc.hlsl" -#include "Include/VisibilityBuffers.inc.hlsl" +#include "Include/Shadows.inc.slang" +#include "Include/VisibilityBuffers.inc.slang" struct DirectionalLight { diff --git a/Source/Shaders/Shaders/Include/OIT.inc.hlsl b/Source/Shaders/Shaders/Include/OIT.inc.slang similarity index 91% rename from Source/Shaders/Shaders/Include/OIT.inc.hlsl rename to Source/Shaders/Shaders/Include/OIT.inc.slang index 4c62f9d..a93b230 100644 --- a/Source/Shaders/Shaders/Include/OIT.inc.hlsl +++ b/Source/Shaders/Shaders/Include/OIT.inc.slang @@ -1,7 +1,7 @@ #ifndef OIT_INC_INCLUDED #define OIT_INC_INCLUDED -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" #define MODE 0 diff --git a/Source/Shaders/Shaders/Include/PyramidCulling.inc.hlsl b/Source/Shaders/Shaders/Include/PyramidCulling.inc.slang similarity index 100% rename from Source/Shaders/Shaders/Include/PyramidCulling.inc.hlsl rename to Source/Shaders/Shaders/Include/PyramidCulling.inc.slang diff --git a/Source/Shaders/Shaders/Include/Shadows.inc.hlsl b/Source/Shaders/Shaders/Include/Shadows.inc.slang similarity index 98% rename from Source/Shaders/Shaders/Include/Shadows.inc.hlsl rename to Source/Shaders/Shaders/Include/Shadows.inc.slang index 020218c..3763f4b 100644 --- a/Source/Shaders/Shaders/Include/Shadows.inc.hlsl +++ b/Source/Shaders/Shaders/Include/Shadows.inc.slang @@ -1,8 +1,8 @@ #ifndef SHADOWS_INCLUDED #define SHADOWS_INCLUDED -#include "DescriptorSet/Global.inc.hlsl" -#include "DescriptorSet/Light.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Light.inc.slang" struct ShadowSettings { diff --git a/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.hlsl b/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang similarity index 98% rename from Source/Shaders/Shaders/Include/VisibilityBuffers.inc.hlsl rename to Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang index 8b5cda4..100772b 100644 --- a/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.hlsl +++ b/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang @@ -1,10 +1,10 @@ #ifndef VISIBILITYBUFFERS_INCLUDED #define VISIBILITYBUFFERS_INCLUDED -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Model/ModelShared.inc.hlsl" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Model/ModelShared.inc.slang" +#include "Terrain/TerrainShared.inc.slang" // Choose barycentric reconstruction method method (default = plane). For ray, define RECONSTRUCT_BARY_RAY. //#define RECONSTRUCT_BARY_RAY @@ -423,7 +423,7 @@ PixelVertexData GetPixelVertexDataTerrain(const uint2 pixelPos, const Visibility PixelVertexData GetPixelVertexDataModel(const uint2 pixelPos, const VisibilityBuffer vBuffer, const uint cameraIndex, float2 renderSize) { - InstanceRef instanceRef = GetModelInstanceID(vBuffer.instanceID); + InstanceRef instanceRef = GetOpaqueModelInstanceID(vBuffer.instanceID); uint instanceID = instanceRef.instanceID; uint drawID = instanceRef.drawID; diff --git a/Source/Shaders/Shaders/Jolt/Draw.ps.hlsl b/Source/Shaders/Shaders/Jolt/Draw.ps.slang similarity index 93% rename from Source/Shaders/Shaders/Jolt/Draw.ps.hlsl rename to Source/Shaders/Shaders/Jolt/Draw.ps.slang index ffbdd6d..95fa316 100644 --- a/Source/Shaders/Shaders/Jolt/Draw.ps.hlsl +++ b/Source/Shaders/Shaders/Jolt/Draw.ps.slang @@ -1,5 +1,5 @@ -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" struct PSInput { diff --git a/Source/Shaders/Shaders/Jolt/Draw.vs.hlsl b/Source/Shaders/Shaders/Jolt/Draw.vs.slang similarity index 93% rename from Source/Shaders/Shaders/Jolt/Draw.vs.hlsl rename to Source/Shaders/Shaders/Jolt/Draw.vs.slang index f60cb45..df79012 100644 --- a/Source/Shaders/Shaders/Jolt/Draw.vs.hlsl +++ b/Source/Shaders/Shaders/Jolt/Draw.vs.slang @@ -1,5 +1,5 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" struct PackedVertex { @@ -24,6 +24,12 @@ struct InstanceRef uint padding; }; +struct DrawCallData +{ + uint baseInstanceLookupOffset; + uint padding; +}; + [[vk::binding(0, PER_PASS)]] StructuredBuffer _vertices; [[vk::binding(1, PER_PASS)]] StructuredBuffer _culledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered [[vk::binding(2, PER_PASS)]] StructuredBuffer _instanceRefTable; diff --git a/Source/Shaders/Shaders/Light/Classification.cs.hlsl b/Source/Shaders/Shaders/Light/Classification.cs.slang similarity index 98% rename from Source/Shaders/Shaders/Light/Classification.cs.hlsl rename to Source/Shaders/Shaders/Light/Classification.cs.slang index 1d530af..e81ff7d 100644 --- a/Source/Shaders/Shaders/Light/Classification.cs.hlsl +++ b/Source/Shaders/Shaders/Light/Classification.cs.slang @@ -1,12 +1,12 @@ // Based on the work of WickedEngine, thank you! https://github.com/turanszkij/WickedEngine/ // https://github.com/turanszkij/WickedEngine/blob/master/WickedEngine/shaders/lightCullingCS.hlsl -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/Debug.inc.hlsl" -#include "Light/LightShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/Debug.inc.slang" +#include "Light/LightShared.inc.slang" //#define DEBUG_TILEDLIGHTCULLING #define ADVANCED_CULLING diff --git a/Source/Shaders/Shaders/Light/LightShared.inc.hlsl b/Source/Shaders/Shaders/Light/LightShared.inc.slang similarity index 99% rename from Source/Shaders/Shaders/Light/LightShared.inc.hlsl rename to Source/Shaders/Shaders/Light/LightShared.inc.slang index a974524..bdda9fb 100644 --- a/Source/Shaders/Shaders/Light/LightShared.inc.hlsl +++ b/Source/Shaders/Shaders/Light/LightShared.inc.slang @@ -1,6 +1,6 @@ #ifndef LIGHT_SHARED_INCLUDED #define LIGHT_SHARED_INCLUDED -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" static const uint TILED_CULLING_BLOCKSIZE = 16; static const uint TILED_CULLING_THREADSIZE = 8; diff --git a/Source/Shaders/Shaders/Liquid/Draw.ps.hlsl b/Source/Shaders/Shaders/Liquid/Draw.ps.slang similarity index 97% rename from Source/Shaders/Shaders/Liquid/Draw.ps.hlsl rename to Source/Shaders/Shaders/Liquid/Draw.ps.slang index 2a6ce1c..64d4d3c 100644 --- a/Source/Shaders/Shaders/Liquid/Draw.ps.hlsl +++ b/Source/Shaders/Shaders/Liquid/Draw.ps.slang @@ -1,8 +1,8 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/OIT.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/OIT.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Liquid/Draw.vs.hlsl b/Source/Shaders/Shaders/Liquid/Draw.vs.slang similarity index 97% rename from Source/Shaders/Shaders/Liquid/Draw.vs.hlsl rename to Source/Shaders/Shaders/Liquid/Draw.vs.slang index 398c116..10df1da 100644 --- a/Source/Shaders/Shaders/Liquid/Draw.vs.hlsl +++ b/Source/Shaders/Shaders/Liquid/Draw.vs.slang @@ -1,7 +1,7 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Terrain/TerrainShared.inc.slang" struct PackedDrawCallData { diff --git a/Source/Shaders/Shaders/Material/MaterialPass.cs.hlsl b/Source/Shaders/Shaders/Material/MaterialPass.cs.slang similarity index 97% rename from Source/Shaders/Shaders/Material/MaterialPass.cs.hlsl rename to Source/Shaders/Shaders/Material/MaterialPass.cs.slang index ac47c86..2236999 100644 --- a/Source/Shaders/Shaders/Material/MaterialPass.cs.hlsl +++ b/Source/Shaders/Shaders/Material/MaterialPass.cs.slang @@ -1,19 +1,18 @@ permutation DEBUG_ID = [0, 1, 2, 3, 4]; permutation SHADOW_FILTER_MODE = [0, 1, 2]; // Off, PCF, PCSS -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; permutation EDITOR_MODE = [0, 1]; // Off, Terrain -#include "DescriptorSet/Global.inc.hlsl" -#include "DescriptorSet/Light.inc.hlsl" -#include "DescriptorSet/Tiles.inc.hlsl" - -#include "Include/Common.inc.hlsl" -#include "Include/Editor.inc.hlsl" -#include "Include/Lighting.inc.hlsl" -#include "Include/VisibilityBuffers.inc.hlsl" -#include "Light/LightShared.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" -#include "Terrain/TerrainShared.inc.hlsl" +#include "DescriptorSet/Debug.inc.slang" +#include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Light.inc.slang" + +#include "Include/Common.inc.slang" +#include "Include/Editor.inc.slang" +#include "Include/Lighting.inc.slang" +#include "Include/VisibilityBuffers.inc.slang" +#include "Light/LightShared.inc.slang" +#include "Model/ModelShared.inc.slang" +#include "Terrain/TerrainShared.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Material/PreEffectsPass.cs.hlsl b/Source/Shaders/Shaders/Material/PreEffectsPass.cs.slang similarity index 89% rename from Source/Shaders/Shaders/Material/PreEffectsPass.cs.hlsl rename to Source/Shaders/Shaders/Material/PreEffectsPass.cs.slang index 72a216e..c263d33 100644 --- a/Source/Shaders/Shaders/Material/PreEffectsPass.cs.hlsl +++ b/Source/Shaders/Shaders/Material/PreEffectsPass.cs.slang @@ -1,8 +1,8 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/VisibilityBuffers.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/VisibilityBuffers.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Model/Draw.ps.hlsl b/Source/Shaders/Shaders/Model/Draw.ps.slang similarity index 92% rename from Source/Shaders/Shaders/Model/Draw.ps.hlsl rename to Source/Shaders/Shaders/Model/Draw.ps.slang index 2c773e0..aea5e5d 100644 --- a/Source/Shaders/Shaders/Model/Draw.ps.hlsl +++ b/Source/Shaders/Shaders/Model/Draw.ps.slang @@ -1,12 +1,11 @@ permutation SHADOW_PASS = [0, 1]; -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; #define GEOMETRY_PASS 1 -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/VisibilityBuffers.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/VisibilityBuffers.inc.slang" +#include "Model/ModelShared.inc.slang" struct PSInput { diff --git a/Source/Shaders/Shaders/Model/Draw.vs.hlsl b/Source/Shaders/Shaders/Model/Draw.vs.slang similarity index 91% rename from Source/Shaders/Shaders/Model/Draw.vs.hlsl rename to Source/Shaders/Shaders/Model/Draw.vs.slang index e0f3616..cf68c21 100644 --- a/Source/Shaders/Shaders/Model/Draw.vs.hlsl +++ b/Source/Shaders/Shaders/Model/Draw.vs.slang @@ -1,12 +1,11 @@ permutation EDITOR_PASS = [0, 1]; permutation SHADOW_PASS = [0, 1]; -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; #define GEOMETRY_PASS 1 -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Model/ModelShared.inc.slang" struct Constants { @@ -33,8 +32,8 @@ struct VSOutput [shader("vertex")] VSOutput main(VSInput input) { - uint instanceRefID = GetInstanceRefID(input.culledInstanceID); - InstanceRef instanceRef = GetModelInstanceID(instanceRefID); + uint instanceRefID = GetOpaqueInstanceRefID(input.culledInstanceID); + InstanceRef instanceRef = GetOpaqueModelInstanceID(instanceRefID); uint instanceID = instanceRef.instanceID; uint drawID = instanceRef.drawID; diff --git a/Source/Shaders/Shaders/Model/DrawSkybox.ps.hlsl b/Source/Shaders/Shaders/Model/DrawSkybox.ps.slang similarity index 94% rename from Source/Shaders/Shaders/Model/DrawSkybox.ps.hlsl rename to Source/Shaders/Shaders/Model/DrawSkybox.ps.slang index d2f46a4..4dc03c7 100644 --- a/Source/Shaders/Shaders/Model/DrawSkybox.ps.hlsl +++ b/Source/Shaders/Shaders/Model/DrawSkybox.ps.slang @@ -1,12 +1,11 @@ -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; permutation TRANSPARENCY = [0, 1]; #define GEOMETRY_PASS 1 -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/OIT.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/OIT.inc.slang" +#include "Model/ModelShared.inc.slang" struct PSInput { diff --git a/Source/Shaders/Shaders/Model/DrawSkybox.vs.hlsl b/Source/Shaders/Shaders/Model/DrawSkybox.vs.slang similarity index 91% rename from Source/Shaders/Shaders/Model/DrawSkybox.vs.hlsl rename to Source/Shaders/Shaders/Model/DrawSkybox.vs.slang index c553de6..c10acfc 100644 --- a/Source/Shaders/Shaders/Model/DrawSkybox.vs.hlsl +++ b/Source/Shaders/Shaders/Model/DrawSkybox.vs.slang @@ -1,9 +1,10 @@ -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Model/ModelShared.inc.slang" + +[[vk::binding(0, PER_PASS)]] StructuredBuffer _instanceRefTable; struct VSInput { @@ -23,7 +24,7 @@ struct VSOutput [shader("vertex")] VSOutput main(VSInput input) { - InstanceRef instanceRef = GetModelInstanceID(input.instanceRefIndex); + InstanceRef instanceRef = _instanceRefTable[input.instanceRefIndex]; uint instanceID = instanceRef.instanceID; uint drawID = instanceRef.drawID; uint textureDataID = instanceRef.extraID; diff --git a/Source/Shaders/Shaders/Model/DrawTransparent.ps.hlsl b/Source/Shaders/Shaders/Model/DrawTransparent.ps.slang similarity index 94% rename from Source/Shaders/Shaders/Model/DrawTransparent.ps.hlsl rename to Source/Shaders/Shaders/Model/DrawTransparent.ps.slang index fb30bd6..5954d10 100644 --- a/Source/Shaders/Shaders/Model/DrawTransparent.ps.hlsl +++ b/Source/Shaders/Shaders/Model/DrawTransparent.ps.slang @@ -1,11 +1,11 @@ -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; + #define GEOMETRY_PASS 1 -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/OIT.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/OIT.inc.slang" +#include "Model/ModelShared.inc.slang" struct PSInput { diff --git a/Source/Shaders/Shaders/Model/DrawTransparent.vs.hlsl b/Source/Shaders/Shaders/Model/DrawTransparent.vs.slang similarity index 85% rename from Source/Shaders/Shaders/Model/DrawTransparent.vs.hlsl rename to Source/Shaders/Shaders/Model/DrawTransparent.vs.slang index 2f39608..5f13919 100644 --- a/Source/Shaders/Shaders/Model/DrawTransparent.vs.hlsl +++ b/Source/Shaders/Shaders/Model/DrawTransparent.vs.slang @@ -1,9 +1,11 @@ -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Model/ModelShared.inc.slang" + +[[vk::binding(0, PER_PASS)]] StructuredBuffer _culledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered +[[vk::binding(1, PER_PASS)]] StructuredBuffer _instanceRefTable; struct VSInput { @@ -23,8 +25,8 @@ struct VSOutput [shader("vertex")] VSOutput main(VSInput input) { - uint instanceRefID = GetInstanceRefID(input.culledInstanceID); - InstanceRef instanceRef = GetModelInstanceID(instanceRefID); + uint instanceRefID = _culledInstanceLookupTable[input.culledInstanceID]; + InstanceRef instanceRef = _instanceRefTable[instanceRefID]; uint instanceID = instanceRef.instanceID; uint drawID = instanceRef.drawID; uint textureDataID = instanceRef.extraID; diff --git a/Source/Shaders/Shaders/Model/ModelShared.inc.hlsl b/Source/Shaders/Shaders/Model/ModelShared.inc.slang similarity index 97% rename from Source/Shaders/Shaders/Model/ModelShared.inc.hlsl rename to Source/Shaders/Shaders/Model/ModelShared.inc.slang index 3a1f269..6f9b43c 100644 --- a/Source/Shaders/Shaders/Model/ModelShared.inc.hlsl +++ b/Source/Shaders/Shaders/Model/ModelShared.inc.slang @@ -1,9 +1,9 @@ #ifndef MODEL_SHARED_INCLUDED #define MODEL_SHARED_INCLUDED -#include "DescriptorSet/Model.inc.hlsl" +#include "DescriptorSet/Model.inc.slang" -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" #ifndef GEOMETRY_PASS #define GEOMETRY_PASS 0 @@ -21,12 +21,6 @@ struct ModelInstanceData uint padding0; }; -struct ModelDrawCallData -{ - uint baseInstanceLookupOffset; - uint modelID; -}; - struct PackedTextureData { uint textureUnitOffset; @@ -48,19 +42,14 @@ struct InstanceRef uint padding; }; -uint GetInstanceRefID(uint culledInstanceID) -{ - return _culledInstanceLookupTable[culledInstanceID]; -} - -InstanceRef GetModelInstanceID(uint instanceRefID) +uint GetOpaqueInstanceRefID(uint culledInstanceID) { - return _instanceRefTable[instanceRefID]; + return _opaqueCulledInstanceLookupTable[culledInstanceID]; } -ModelDrawCallData LoadModelDrawCallData(uint drawCallID) +InstanceRef GetOpaqueModelInstanceID(uint instanceRefID) { - return _modelDrawCallDatas[drawCallID]; + return _opaqueInstanceRefTable[instanceRefID]; } TextureData LoadModelTextureData(uint textureDataID) diff --git a/Source/Shaders/Shaders/PostProcess/FullscreenTriangle.vs.hlsl b/Source/Shaders/Shaders/PostProcess/FullscreenTriangle.vs.slang similarity index 100% rename from Source/Shaders/Shaders/PostProcess/FullscreenTriangle.vs.hlsl rename to Source/Shaders/Shaders/PostProcess/FullscreenTriangle.vs.slang diff --git a/Source/Shaders/Shaders/PostProcess/SAO/Blur.cs.hlsl b/Source/Shaders/Shaders/PostProcess/SAO/Blur.cs.slang similarity index 100% rename from Source/Shaders/Shaders/PostProcess/SAO/Blur.cs.hlsl rename to Source/Shaders/Shaders/PostProcess/SAO/Blur.cs.slang diff --git a/Source/Shaders/Shaders/PostProcess/SAO/DownsampleDepth.cs.hlsl b/Source/Shaders/Shaders/PostProcess/SAO/DownsampleDepth.cs.slang similarity index 100% rename from Source/Shaders/Shaders/PostProcess/SAO/DownsampleDepth.cs.hlsl rename to Source/Shaders/Shaders/PostProcess/SAO/DownsampleDepth.cs.slang diff --git a/Source/Shaders/Shaders/PostProcess/SAO/LinearizeDepth.cs.hlsl b/Source/Shaders/Shaders/PostProcess/SAO/LinearizeDepth.cs.slang similarity index 100% rename from Source/Shaders/Shaders/PostProcess/SAO/LinearizeDepth.cs.hlsl rename to Source/Shaders/Shaders/PostProcess/SAO/LinearizeDepth.cs.slang diff --git a/Source/Shaders/Shaders/PostProcess/SAO/RawAO.cs.hlsl b/Source/Shaders/Shaders/PostProcess/SAO/RawAO.cs.slang similarity index 99% rename from Source/Shaders/Shaders/PostProcess/SAO/RawAO.cs.hlsl rename to Source/Shaders/Shaders/PostProcess/SAO/RawAO.cs.slang index d767595..8e27119 100644 --- a/Source/Shaders/Shaders/PostProcess/SAO/RawAO.cs.hlsl +++ b/Source/Shaders/Shaders/PostProcess/SAO/RawAO.cs.slang @@ -28,7 +28,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" // Total number of direct samples to take at each pixel #define NUM_SAMPLES (11) diff --git a/Source/Shaders/Shaders/Skybox/Skybox.ps.hlsl b/Source/Shaders/Shaders/Skybox/Skybox.ps.slang similarity index 95% rename from Source/Shaders/Shaders/Skybox/Skybox.ps.hlsl rename to Source/Shaders/Shaders/Skybox/Skybox.ps.slang index 9dc0aff..0b8a932 100644 --- a/Source/Shaders/Shaders/Skybox/Skybox.ps.hlsl +++ b/Source/Shaders/Shaders/Skybox/Skybox.ps.slang @@ -1,7 +1,7 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" struct SkybandColors { diff --git a/Source/Shaders/Shaders/Sorting/FFX_ParallelSort.inc.hlsl b/Source/Shaders/Shaders/Sorting/FFX_ParallelSort.inc.slang similarity index 100% rename from Source/Shaders/Shaders/Sorting/FFX_ParallelSort.inc.hlsl rename to Source/Shaders/Shaders/Sorting/FFX_ParallelSort.inc.slang diff --git a/Source/Shaders/Shaders/Sorting/SortCount.cs.hlsl b/Source/Shaders/Shaders/Sorting/SortCount.cs.slang similarity index 97% rename from Source/Shaders/Shaders/Sorting/SortCount.cs.hlsl rename to Source/Shaders/Shaders/Sorting/SortCount.cs.slang index 04b2470..a2ae2ce 100644 --- a/Source/Shaders/Shaders/Sorting/SortCount.cs.hlsl +++ b/Source/Shaders/Shaders/Sorting/SortCount.cs.slang @@ -18,7 +18,7 @@ //-------------------------------------------------------------------------------------- // ParallelSort Shaders/Includes //-------------------------------------------------------------------------------------- -#include "Sorting/FFX_ParallelSort.inc.hlsl" +#include "Sorting/FFX_ParallelSort.inc.slang" struct CountCB { diff --git a/Source/Shaders/Shaders/Sorting/SortCountReduce.cs.hlsl b/Source/Shaders/Shaders/Sorting/SortCountReduce.cs.slang similarity index 97% rename from Source/Shaders/Shaders/Sorting/SortCountReduce.cs.hlsl rename to Source/Shaders/Shaders/Sorting/SortCountReduce.cs.slang index 01489a7..ff5e797 100644 --- a/Source/Shaders/Shaders/Sorting/SortCountReduce.cs.hlsl +++ b/Source/Shaders/Shaders/Sorting/SortCountReduce.cs.slang @@ -18,7 +18,7 @@ //-------------------------------------------------------------------------------------- // ParallelSort Shaders/Includes //-------------------------------------------------------------------------------------- -#include "Sorting/FFX_ParallelSort.inc.hlsl" +#include "Sorting/FFX_ParallelSort.inc.slang" [[vk::binding(0, PER_PASS)]] ConstantBuffer _constants; // Constant Buffer [[vk::binding(1, PER_PASS)]] RWStructuredBuffer _sumTable; // The sum table we will write sums to diff --git a/Source/Shaders/Shaders/Sorting/SortScan.cs.hlsl b/Source/Shaders/Shaders/Sorting/SortScan.cs.slang similarity index 97% rename from Source/Shaders/Shaders/Sorting/SortScan.cs.hlsl rename to Source/Shaders/Shaders/Sorting/SortScan.cs.slang index 3da44d2..baf962e 100644 --- a/Source/Shaders/Shaders/Sorting/SortScan.cs.hlsl +++ b/Source/Shaders/Shaders/Sorting/SortScan.cs.slang @@ -18,7 +18,7 @@ //-------------------------------------------------------------------------------------- // ParallelSort Shaders/Includes //-------------------------------------------------------------------------------------- -#include "Sorting/FFX_ParallelSort.inc.hlsl" +#include "Sorting/FFX_ParallelSort.inc.slang" [[vk::binding(0, PER_PASS)]] ConstantBuffer _constants; // Constant Buffer [[vk::binding(1, PER_PASS)]] RWStructuredBuffer _scanSrc; // Source for Scan Data diff --git a/Source/Shaders/Shaders/Sorting/SortScanAdd.cs.hlsl b/Source/Shaders/Shaders/Sorting/SortScanAdd.cs.slang similarity index 98% rename from Source/Shaders/Shaders/Sorting/SortScanAdd.cs.hlsl rename to Source/Shaders/Shaders/Sorting/SortScanAdd.cs.slang index 2861d1e..f024284 100644 --- a/Source/Shaders/Shaders/Sorting/SortScanAdd.cs.hlsl +++ b/Source/Shaders/Shaders/Sorting/SortScanAdd.cs.slang @@ -18,7 +18,7 @@ //-------------------------------------------------------------------------------------- // ParallelSort Shaders/Includes //-------------------------------------------------------------------------------------- -#include "Sorting/FFX_ParallelSort.inc.hlsl" +#include "Sorting/FFX_ParallelSort.inc.slang" [[vk::binding(0, PER_PASS)]] ConstantBuffer _constants; // Constant Buffer [[vk::binding(1, PER_PASS)]] RWStructuredBuffer _scanSrc; // Source for Scan Data diff --git a/Source/Shaders/Shaders/Sorting/SortScatter.cs.hlsl b/Source/Shaders/Shaders/Sorting/SortScatter.cs.slang similarity index 98% rename from Source/Shaders/Shaders/Sorting/SortScatter.cs.hlsl rename to Source/Shaders/Shaders/Sorting/SortScatter.cs.slang index 5a36256..97446ff 100644 --- a/Source/Shaders/Shaders/Sorting/SortScatter.cs.hlsl +++ b/Source/Shaders/Shaders/Sorting/SortScatter.cs.slang @@ -18,7 +18,7 @@ //-------------------------------------------------------------------------------------- // ParallelSort Shaders/Includes //-------------------------------------------------------------------------------------- -#include "Sorting/FFX_ParallelSort.inc.hlsl" +#include "Sorting/FFX_ParallelSort.inc.slang" struct ScatterCB { diff --git a/Source/Shaders/Shaders/Sorting/SortSetupIndirectParameters.cs.hlsl b/Source/Shaders/Shaders/Sorting/SortSetupIndirectParameters.cs.slang similarity index 97% rename from Source/Shaders/Shaders/Sorting/SortSetupIndirectParameters.cs.hlsl rename to Source/Shaders/Shaders/Sorting/SortSetupIndirectParameters.cs.slang index b4e78de..302d46d 100644 --- a/Source/Shaders/Shaders/Sorting/SortSetupIndirectParameters.cs.hlsl +++ b/Source/Shaders/Shaders/Sorting/SortSetupIndirectParameters.cs.slang @@ -18,7 +18,7 @@ //-------------------------------------------------------------------------------------- // ParallelSort Shaders/Includes //-------------------------------------------------------------------------------------- -#include "Sorting/FFX_ParallelSort.inc.hlsl" +#include "Sorting/FFX_ParallelSort.inc.slang" struct SetupCB { diff --git a/Source/Shaders/Shaders/Terrain/Culling.cs.hlsl b/Source/Shaders/Shaders/Terrain/Culling.cs.slang similarity index 85% rename from Source/Shaders/Shaders/Terrain/Culling.cs.hlsl rename to Source/Shaders/Shaders/Terrain/Culling.cs.slang index 31694a8..4b002d1 100644 --- a/Source/Shaders/Shaders/Terrain/Culling.cs.hlsl +++ b/Source/Shaders/Shaders/Terrain/Culling.cs.slang @@ -1,11 +1,11 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/Debug.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/Debug.inc.slang" +#include "Include/PyramidCulling.inc.slang" +#include "Terrain/TerrainShared.inc.slang" struct Constants { @@ -25,16 +25,16 @@ struct HeightRange [[vk::push_constant]] Constants _constants; // Inputs -[[vk::binding(0, TERRAIN)]] StructuredBuffer _instances; -[[vk::binding(1, TERRAIN)]] StructuredBuffer _heightRanges; -[[vk::binding(2, TERRAIN)]] SamplerState _depthSampler; -[[vk::binding(3, TERRAIN)]] Texture2D _depthPyramid; -[[vk::binding(4, TERRAIN)]] StructuredBuffer _prevCulledInstancesBitMask; +[[vk::binding(0, PER_PASS)]] StructuredBuffer _instances; +[[vk::binding(1, PER_PASS)]] StructuredBuffer _heightRanges; +[[vk::binding(2, PER_PASS)]] SamplerState _depthSampler; +[[vk::binding(3, PER_PASS)]] Texture2D _depthPyramid; +[[vk::binding(4, PER_PASS)]] StructuredBuffer _prevCulledInstancesBitMask; // Outputs -[[vk::binding(5, TERRAIN)]] RWStructuredBuffer _culledInstancesBitMask; -[[vk::binding(6, TERRAIN)]] RWByteAddressBuffer _arguments; -[[vk::binding(7, TERRAIN)]] RWByteAddressBuffer _culledInstances; +[[vk::binding(5, PER_PASS)]] RWStructuredBuffer _culledInstancesBitMask; +[[vk::binding(6, PER_PASS)]] RWByteAddressBuffer _arguments; +[[vk::binding(7, PER_PASS)]] RWByteAddressBuffer _culledInstances; float2 ReadHeightRange(uint instanceIndex) { diff --git a/Source/Shaders/Shaders/Terrain/Draw.ps.hlsl b/Source/Shaders/Shaders/Terrain/Draw.ps.slang similarity index 64% rename from Source/Shaders/Shaders/Terrain/Draw.ps.hlsl rename to Source/Shaders/Shaders/Terrain/Draw.ps.slang index d42ab7a..6cfb974 100644 --- a/Source/Shaders/Shaders/Terrain/Draw.ps.hlsl +++ b/Source/Shaders/Shaders/Terrain/Draw.ps.slang @@ -1,11 +1,10 @@ -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; #define GEOMETRY_PASS 1 -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/VisibilityBuffers.inc.hlsl" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/VisibilityBuffers.inc.slang" +#include "Terrain/TerrainShared.inc.slang" struct PSInput { diff --git a/Source/Shaders/Shaders/Terrain/Draw.vs.hlsl b/Source/Shaders/Shaders/Terrain/Draw.vs.slang similarity index 86% rename from Source/Shaders/Shaders/Terrain/Draw.vs.hlsl rename to Source/Shaders/Shaders/Terrain/Draw.vs.slang index 37f3fad..10f506f 100644 --- a/Source/Shaders/Shaders/Terrain/Draw.vs.hlsl +++ b/Source/Shaders/Shaders/Terrain/Draw.vs.slang @@ -1,11 +1,10 @@ permutation EDITOR_PASS = [0, 1]; permutation SHADOW_PASS = [0, 1]; -permutation SUPPORTS_EXTENDED_TEXTURES = [0, 1]; #define GEOMETRY_PASS 1 -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Terrain/TerrainShared.inc.slang" struct Constants { @@ -31,7 +30,7 @@ struct VSOutput [shader("vertex")] VSOutput main(VSInput input) { - InstanceData instanceData = _instanceDatas[input.culledInstanceID]; + InstanceData instanceData = _culledInstanceDatas[input.culledInstanceID]; VSOutput output; diff --git a/Source/Shaders/Shaders/Terrain/FillDrawCalls.cs.hlsl b/Source/Shaders/Shaders/Terrain/FillDrawCalls.cs.slang similarity index 87% rename from Source/Shaders/Shaders/Terrain/FillDrawCalls.cs.hlsl rename to Source/Shaders/Shaders/Terrain/FillDrawCalls.cs.slang index 23338fe..0bba494 100644 --- a/Source/Shaders/Shaders/Terrain/FillDrawCalls.cs.hlsl +++ b/Source/Shaders/Shaders/Terrain/FillDrawCalls.cs.slang @@ -1,10 +1,10 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/PyramidCulling.inc.slang" +#include "Terrain/TerrainShared.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Terrain/TerrainShared.inc.hlsl b/Source/Shaders/Shaders/Terrain/TerrainShared.inc.slang similarity index 98% rename from Source/Shaders/Shaders/Terrain/TerrainShared.inc.hlsl rename to Source/Shaders/Shaders/Terrain/TerrainShared.inc.slang index fd6d55e..dee7683 100644 --- a/Source/Shaders/Shaders/Terrain/TerrainShared.inc.hlsl +++ b/Source/Shaders/Shaders/Terrain/TerrainShared.inc.slang @@ -1,16 +1,15 @@ #ifndef TERRAIN_SHARED_INCLUDED #define TERRAIN_SHARED_INCLUDED -#include "DescriptorSet/Terrain.inc.hlsl" +#include "DescriptorSet/Terrain.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" #ifndef GEOMETRY_PASS #define GEOMETRY_PASS 0 #endif - #define NUM_CELLS_PER_CHUNK_SIDE (16) #define NUM_CELLS_PER_CHUNK (NUM_CELLS_PER_CHUNK_SIDE * NUM_CELLS_PER_CHUNK_SIDE) diff --git a/Source/Shaders/Shaders/UI/Panel.ps.hlsl b/Source/Shaders/Shaders/UI/Panel.ps.slang similarity index 99% rename from Source/Shaders/Shaders/UI/Panel.ps.hlsl rename to Source/Shaders/Shaders/UI/Panel.ps.slang index 137ada8..454a276 100644 --- a/Source/Shaders/Shaders/UI/Panel.ps.hlsl +++ b/Source/Shaders/Shaders/UI/Panel.ps.slang @@ -1,5 +1,5 @@ -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" struct PanelDrawData { diff --git a/Source/Shaders/Shaders/UI/Panel.vs.hlsl b/Source/Shaders/Shaders/UI/Panel.vs.slang similarity index 97% rename from Source/Shaders/Shaders/UI/Panel.vs.hlsl rename to Source/Shaders/Shaders/UI/Panel.vs.slang index f0fef04..c46a0b7 100644 --- a/Source/Shaders/Shaders/UI/Panel.vs.hlsl +++ b/Source/Shaders/Shaders/UI/Panel.vs.slang @@ -1,5 +1,5 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" [[vk::binding(0, PER_PASS)]] StructuredBuffer _vertices; [[vk::binding(1, PER_PASS)]] StructuredBuffer _widgetWorldPositions; diff --git a/Source/Shaders/Shaders/UI/Text.ps.hlsl b/Source/Shaders/Shaders/UI/Text.ps.slang similarity index 99% rename from Source/Shaders/Shaders/UI/Text.ps.hlsl rename to Source/Shaders/Shaders/UI/Text.ps.slang index 1d11471..3fa5ac3 100644 --- a/Source/Shaders/Shaders/UI/Text.ps.hlsl +++ b/Source/Shaders/Shaders/UI/Text.ps.slang @@ -1,5 +1,5 @@ -#include "Include/Common.inc.hlsl" +#include "Include/Common.inc.slang" struct CharDrawData { diff --git a/Source/Shaders/Shaders/UI/Text.vs.hlsl b/Source/Shaders/Shaders/UI/Text.vs.slang similarity index 97% rename from Source/Shaders/Shaders/UI/Text.vs.hlsl rename to Source/Shaders/Shaders/UI/Text.vs.slang index ccba843..dcd4a6d 100644 --- a/Source/Shaders/Shaders/UI/Text.vs.hlsl +++ b/Source/Shaders/Shaders/UI/Text.vs.slang @@ -1,5 +1,5 @@ -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" [[vk::binding(0, PER_PASS)]] StructuredBuffer _vertices; [[vk::binding(1, PER_PASS)]] StructuredBuffer _widgetWorldPositions; diff --git a/Source/Shaders/Shaders/Utils/CreateIndirectAfterCulling.cs.hlsl b/Source/Shaders/Shaders/Utils/CreateIndirectAfterCulling.cs.slang similarity index 93% rename from Source/Shaders/Shaders/Utils/CreateIndirectAfterCulling.cs.hlsl rename to Source/Shaders/Shaders/Utils/CreateIndirectAfterCulling.cs.slang index 2e0c94a..a16d1a1 100644 --- a/Source/Shaders/Shaders/Utils/CreateIndirectAfterCulling.cs.hlsl +++ b/Source/Shaders/Shaders/Utils/CreateIndirectAfterCulling.cs.slang @@ -1,12 +1,12 @@ permutation IS_INDEXED = [0, 1]; permutation DEBUG_ORDERED = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/Debug.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/Debug.inc.slang" +#include "Include/PyramidCulling.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Utils/Culling.cs.hlsl b/Source/Shaders/Shaders/Utils/Culling.cs.slang similarity index 97% rename from Source/Shaders/Shaders/Utils/Culling.cs.hlsl rename to Source/Shaders/Shaders/Utils/Culling.cs.slang index e716e02..71a08a3 100644 --- a/Source/Shaders/Shaders/Utils/Culling.cs.hlsl +++ b/Source/Shaders/Shaders/Utils/Culling.cs.slang @@ -1,11 +1,11 @@ permutation USE_BITMASKS = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/Debug.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/Debug.inc.slang" +#include "Include/PyramidCulling.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Utils/CullingInstanced.cs.hlsl b/Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang similarity index 98% rename from Source/Shaders/Shaders/Utils/CullingInstanced.cs.hlsl rename to Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang index 64c98c1..548471f 100644 --- a/Source/Shaders/Shaders/Utils/CullingInstanced.cs.hlsl +++ b/Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang @@ -1,11 +1,11 @@ permutation USE_BITMASKS = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/Debug.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/Debug.inc.slang" +#include "Include/PyramidCulling.inc.slang" struct Constants { @@ -54,13 +54,13 @@ struct CullingData [[vk::binding(5, PER_PASS)]] SamplerState _depthSampler; [[vk::binding(6, PER_PASS)]] Texture2D _depthPyramid; // TODO: Occlusion culling for shadow cascades? -#if USE_BITMASKS +//#if USE_BITMASKS // TODO: When instanceCounts resizes we need to invalidate (zero out) _prevCulledInstancesBitMask since a single index in current and prev would point to different actual drawcalls [[vk::binding(7, PER_PASS)]] StructuredBuffer _prevCulledDrawCallsBitMask; // TODO: Rename to _prevCulledInstancesBitMask, with instanced rendering we need to count these per instance instead of per draw // Outputs [[vk::binding(8, PER_PASS)]] RWStructuredBuffer _culledDrawCallsBitMask; // TODO: Rename to _culledInstancesBitMask, with instanced rendering we need to count these per instance instead of per draw -#endif +//#endif [[vk::binding(9, PER_PASS)]] RWByteAddressBuffer _culledInstanceCounts; // One uint per draw call [[vk::binding(12, PER_PASS)]] RWStructuredBuffer _culledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered diff --git a/Source/Shaders/Shaders/Utils/DispatchArguments1D.cs.hlsl b/Source/Shaders/Shaders/Utils/DispatchArguments1D.cs.slang similarity index 100% rename from Source/Shaders/Shaders/Utils/DispatchArguments1D.cs.hlsl rename to Source/Shaders/Shaders/Utils/DispatchArguments1D.cs.slang diff --git a/Source/Shaders/Shaders/Utils/FillDrawCallsFromBitmask.cs.hlsl b/Source/Shaders/Shaders/Utils/FillDrawCallsFromBitmask.cs.slang similarity index 92% rename from Source/Shaders/Shaders/Utils/FillDrawCallsFromBitmask.cs.hlsl rename to Source/Shaders/Shaders/Utils/FillDrawCallsFromBitmask.cs.slang index 38c07f4..c801149 100644 --- a/Source/Shaders/Shaders/Utils/FillDrawCallsFromBitmask.cs.hlsl +++ b/Source/Shaders/Shaders/Utils/FillDrawCallsFromBitmask.cs.slang @@ -1,10 +1,10 @@ permutation IS_INDEXED = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/PyramidCulling.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Utils/FillInstancedDrawCallsFromBitmask.cs.hlsl b/Source/Shaders/Shaders/Utils/FillInstancedDrawCallsFromBitmask.cs.slang similarity index 93% rename from Source/Shaders/Shaders/Utils/FillInstancedDrawCallsFromBitmask.cs.hlsl rename to Source/Shaders/Shaders/Utils/FillInstancedDrawCallsFromBitmask.cs.slang index 50a6a58..66407f5 100644 --- a/Source/Shaders/Shaders/Utils/FillInstancedDrawCallsFromBitmask.cs.hlsl +++ b/Source/Shaders/Shaders/Utils/FillInstancedDrawCallsFromBitmask.cs.slang @@ -1,10 +1,10 @@ permutation IS_INDEXED = [0, 1]; -#include "DescriptorSet/Global.inc.hlsl" +#include "DescriptorSet/Global.inc.slang" -#include "Include/Common.inc.hlsl" -#include "Include/Culling.inc.hlsl" -#include "Include/PyramidCulling.inc.hlsl" +#include "Include/Common.inc.slang" +#include "Include/Culling.inc.slang" +#include "Include/PyramidCulling.inc.slang" struct Constants { diff --git a/Source/Shaders/Shaders/Utils/ObjectQuery.cs.hlsl b/Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang similarity index 82% rename from Source/Shaders/Shaders/Utils/ObjectQuery.cs.hlsl rename to Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang index 2dd3583..0938f87 100644 --- a/Source/Shaders/Shaders/Utils/ObjectQuery.cs.hlsl +++ b/Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang @@ -1,7 +1,7 @@ -#include "Include/VisibilityBuffers.inc.hlsl" -#include "Model/ModelShared.inc.hlsl" -#include "Terrain/TerrainShared.inc.hlsl" +#include "Include/VisibilityBuffers.inc.slang" +#include "Model/ModelShared.inc.slang" +#include "Terrain/TerrainShared.inc.slang" struct Constants { @@ -41,7 +41,7 @@ void main(uint3 dispatchThreadId : SV_DispatchThreadID) } else { - InstanceRef instanceRef = GetModelInstanceID(vBuffer.instanceID); + InstanceRef instanceRef = GetOpaqueModelInstanceID(vBuffer.instanceID); objectID = instanceRef.instanceID; } diff --git a/Source/Shaders/Shaders/Utils/ResetIndirectBuffer.cs.hlsl b/Source/Shaders/Shaders/Utils/ResetIndirectBuffer.cs.slang similarity index 100% rename from Source/Shaders/Shaders/Utils/ResetIndirectBuffer.cs.hlsl rename to Source/Shaders/Shaders/Utils/ResetIndirectBuffer.cs.slang diff --git a/Source/Shaders/Shaders/slangdconfig.json b/Source/Shaders/Shaders/slangdconfig.json index 838fc6a..3d76ed5 100644 --- a/Source/Shaders/Shaders/slangdconfig.json +++ b/Source/Shaders/Shaders/slangdconfig.json @@ -1,15 +1,16 @@ { - "slang.predefinedMacros": [ - "DEBUG=0", - "GLOBAL=1", - "TILES=2", - "LIGHT=3", - "TERRAIN=4", - "MODEL=5", - "PER_PASS=6", - "PER_DRAW=7" - ], - "slang.additionalSearchPaths": [ - "/" - ] -} \ No newline at end of file + "slang.predefinedMacros": [ + "DEBUG=0", + "GLOBAL=1", + "TILES=2", + "LIGHT=3", + "TERRAIN=4", + "MODEL=5", + "PER_PASS=6", + "PER_DRAW=7" + ], + "slang.additionalSearchPaths": [ + "./", + "C:/Projects/Novus/Game/Source/Shaders/Shaders" + ] +} diff --git a/Submodules/Engine b/Submodules/Engine index db1cf18..f2c09cf 160000 --- a/Submodules/Engine +++ b/Submodules/Engine @@ -1 +1 @@ -Subproject commit db1cf18ee337cb5f7e09cf668626a204fec4bb73 +Subproject commit f2c09cf5c8858aa21db90ee9a404967f786bf62c