#include #include namespace XCEngine { namespace Rendering { void RenderGraph::Reset() { m_textures.clear(); m_passes.clear(); } RenderGraphPassBuilder::RenderGraphPassBuilder( RenderGraph* graph, RenderGraphPassHandle passHandle) : m_graph(graph) , m_passHandle(passHandle) { } void RenderGraphPassBuilder::ReadTexture(RenderGraphTextureHandle texture) { if (m_graph == nullptr || !m_passHandle.IsValid()) { return; } RenderGraph::TextureAccess access = {}; access.texture = texture; access.mode = RenderGraphAccessMode::Read; access.aspect = RenderGraphTextureAspect::Color; m_graph->m_passes[m_passHandle.index].accesses.push_back(access); } void RenderGraphPassBuilder::WriteTexture(RenderGraphTextureHandle texture) { if (m_graph == nullptr || !m_passHandle.IsValid()) { return; } RenderGraph::TextureAccess access = {}; access.texture = texture; access.mode = RenderGraphAccessMode::Write; access.aspect = RenderGraphTextureAspect::Color; m_graph->m_passes[m_passHandle.index].accesses.push_back(access); } void RenderGraphPassBuilder::ReadDepthTexture(RenderGraphTextureHandle texture) { if (m_graph == nullptr || !m_passHandle.IsValid()) { return; } RenderGraph::TextureAccess access = {}; access.texture = texture; access.mode = RenderGraphAccessMode::Read; access.aspect = RenderGraphTextureAspect::Depth; m_graph->m_passes[m_passHandle.index].accesses.push_back(access); } void RenderGraphPassBuilder::WriteDepthTexture(RenderGraphTextureHandle texture) { if (m_graph == nullptr || !m_passHandle.IsValid()) { return; } RenderGraph::TextureAccess access = {}; access.texture = texture; access.mode = RenderGraphAccessMode::Write; access.aspect = RenderGraphTextureAspect::Depth; m_graph->m_passes[m_passHandle.index].accesses.push_back(access); } void RenderGraphPassBuilder::SetExecuteCallback(RenderGraphExecuteCallback callback) { if (m_graph == nullptr || !m_passHandle.IsValid()) { return; } m_graph->m_passes[m_passHandle.index].executeCallback = std::move(callback); } void RenderGraphBuilder::Reset() { m_graph.Reset(); } RenderGraphTextureHandle RenderGraphBuilder::ImportTexture( const Containers::String& name, const RenderGraphTextureDesc& desc, RHI::RHIResourceView* importedView, const RenderGraphImportedTextureOptions& importedOptions) { RenderGraph::TextureResource resource = {}; resource.name = name; resource.desc = desc; resource.kind = RenderGraphTextureKind::Imported; resource.importedView = importedView; resource.importedOptions = importedOptions; m_graph.m_textures.push_back(resource); RenderGraphTextureHandle handle = {}; handle.index = static_cast(m_graph.m_textures.size() - 1u); return handle; } RenderGraphTextureHandle RenderGraphBuilder::CreateTransientTexture( const Containers::String& name, const RenderGraphTextureDesc& desc) { RenderGraph::TextureResource resource = {}; resource.name = name; resource.desc = desc; resource.kind = RenderGraphTextureKind::Transient; resource.importedView = nullptr; m_graph.m_textures.push_back(resource); RenderGraphTextureHandle handle = {}; handle.index = static_cast(m_graph.m_textures.size() - 1u); return handle; } void RenderGraphBuilder::MergeImportedTextureOptions( RenderGraphTextureHandle handle, const RenderGraphImportedTextureOptions& importedOptions) { if (!handle.IsValid() || handle.index >= m_graph.m_textures.size()) { return; } RenderGraph::TextureResource& resource = m_graph.m_textures[handle.index]; if (resource.kind != RenderGraphTextureKind::Imported) { return; } resource.importedOptions.graphOwnsTransitions = resource.importedOptions.graphOwnsTransitions || importedOptions.graphOwnsTransitions; resource.importedOptions.finalState = importedOptions.finalState; } RenderGraphPassHandle RenderGraphBuilder::AddRasterPass( const Containers::String& name, const std::function& setup) { return AddPass(name, RenderGraphPassType::Raster, setup); } RenderGraphPassHandle RenderGraphBuilder::AddComputePass( const Containers::String& name, const std::function& setup) { return AddPass(name, RenderGraphPassType::Compute, setup); } RenderGraphPassHandle RenderGraphBuilder::AddPass( const Containers::String& name, RenderGraphPassType type, const std::function& setup) { RenderGraph::PassNode pass = {}; pass.name = name; pass.type = type; m_graph.m_passes.push_back(pass); RenderGraphPassHandle handle = {}; handle.index = static_cast(m_graph.m_passes.size() - 1u); if (setup) { RenderGraphPassBuilder passBuilder(&m_graph, handle); setup(passBuilder); } return handle; } } // namespace Rendering } // namespace XCEngine