diff --git a/.gitignore b/.gitignore index b5a4b67..3296021 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,8 @@ *.obj *.a *.lib -*.dll *.so -*.dylib +*.dll *.exe *.out @@ -20,32 +19,11 @@ compile_commands.json # Dependencies vendor/ -external/ # Logs *.log -# Temporary files -*.tmp -*.temp - -# Environment -.env -.env.local -.env.* - -# Editors -.vscode/ -.idea/ -*.swp -*.swo - -# Coverage -coverage/ -htmlcov/ -.coverage - -# OS +# OS generated files .DS_Store Thumbs.db ``` \ No newline at end of file diff --git a/FarmEngine/CMakeLists.txt b/FarmEngine/CMakeLists.txt index 3d5310a..dd64f11 100644 --- a/FarmEngine/CMakeLists.txt +++ b/FarmEngine/CMakeLists.txt @@ -97,10 +97,10 @@ add_library(FarmEngineRenderer STATIC renderer/Renderer.cpp renderer/Renderer.h # Render Graph System - rendering/graph/RenderGraph.h - rendering/graph/RenderGraph.cpp - rendering/graph/RenderPipeline.h - rendering/graph/RenderPipeline.cpp + src/rendering/graph/RenderGraph.h + src/rendering/graph/RenderGraph.cpp + src/rendering/graph/RenderPipeline.h + src/rendering/graph/RenderPipeline.cpp ) target_include_directories(FarmEngineRenderer PUBLIC diff --git a/FarmEngine/src/rendering/graph/RenderGraph.cpp b/FarmEngine/src/rendering/graph/RenderGraph.cpp index 3a93930..22d7c4e 100644 --- a/FarmEngine/src/rendering/graph/RenderGraph.cpp +++ b/FarmEngine/src/rendering/graph/RenderGraph.cpp @@ -123,17 +123,14 @@ RenderGraphBuilder& RenderGraphBuilder::addDependency(uint32_t from, uint32_t to // ============================================================================ // RenderGraph Implementation // ============================================================================ - -RenderGraph::~RenderGraph() { - // Destructor - cleanup se hace explícitamente en cleanup() -} - -void RenderGraph::compile(RenderGraphBuilder&& builder) { - device = VK_NULL_HANDLE; // Se seteará cuando tengamos contexto Vulkan - // Copiar recursos y passes compiledRegistry.resources = std::move(builder.resources); + + // Limpiar estado previo antes de compilar + compiledPasses.clear(); + compiledPasses.resize(builder.passes.size()); + // Construir mapa nombre->índice for (size_t i = 0; i < compiledRegistry.resources.size(); ++i) { @@ -200,21 +197,9 @@ void RenderGraph::compile(RenderGraphBuilder&& builder) { // TODO: Implementar análisis de dependencias del grafo } - // Añadir dependencias explícitas - for (const auto& dep : builder.explicitDependencies) { - if (dep.from < compiledPasses.size() && dep.to < compiledPasses.size()) { - VkSubpassDependency vkDep{}; - vkDep.srcSubpass = dep.from; - vkDep.dstSubpass = dep.to; - vkDep.srcStageMask = dep.srcStageMask; - vkDep.dstStageMask = dep.dstStageMask; - vkDep.srcAccessMask = dep.srcAccessMask; - vkDep.dstAccessMask = dep.dstAccessMask; - vkDep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; - - compiledPasses[dep.to].dependencies.push_back(vkDep); - } - } + // Las dependencias entre passes separados se manejan mediante barreras de pipeline + // registradas durante la ejecución, no mediante VkSubpassDependency + // VkSubpassDependency solo es válido para subpasses dentro del mismo VkRenderPass } void RenderGraph::createRenderPasses(VkDevice dev) { @@ -251,21 +236,33 @@ void RenderGraph::createFramebuffers(VkDevice dev, VkExtent2D swapchainExtent) { // Obtener views de todos los attachments for (const auto& colorName : compiled.definition.colorAttachments) { const ResourceHandle* res = compiledRegistry.getResource(colorName); - if (res) { - attachments.push_back(res->imageView); - if (!res->isSwapchain) { - extent = res->extent; - } + if (!res) { + throw std::runtime_error("Color attachment not found: " + colorName); + } + if (res->imageView == VK_NULL_HANDLE) { + throw std::runtime_error("Color attachment has null imageView: " + colorName + + ". For external targets, use addExternalImage() instead of addColorTarget()."); + } + attachments.push_back(res->imageView); + if (!res->isSwapchain) { + extent = res->extent; } } if (!compiled.definition.depthAttachment.empty()) { const ResourceHandle* res = compiledRegistry.getResource(compiled.definition.depthAttachment); - if (res) { - attachments.push_back(res->imageView); + if (!res) { + throw std::runtime_error("Depth attachment not found: " + compiled.definition.depthAttachment); + } + if (res->imageView == VK_NULL_HANDLE) { + throw std::runtime_error("Depth attachment has null imageView: " + compiled.definition.depthAttachment); } + attachments.push_back(res->imageView); } + // Guardar el extent calculado en el CompiledPass para usarlo en execute() + compiled.extent = extent; + VkFramebufferCreateInfo fbInfo{}; fbInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; fbInfo.renderPass = compiled.vkRenderPass; @@ -311,18 +308,20 @@ void RenderGraph::execute(VkCommandBuffer cmd, ResourceRegistry& registry, uint3 rpBegin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; rpBegin.renderPass = compiled.vkRenderPass; rpBegin.framebuffer = compiled.framebuffer; - rpBegin.renderArea.extent = {compiled.attachments.empty() ? 0 : - registry.resources[0].extent.width, - compiled.attachments.empty() ? 0 : - registry.resources[0].extent.height}; + rpBegin.renderArea.extent = compiled.extent; - // Clear values + // Clear values - uno por cada attachment (color attachments primero, luego depth) std::vector clearValues; - if (!compiled.definition.colorAttachments.empty()) { + clearValues.reserve(compiled.attachments.size()); + + // Color attachments + for (size_t i = 0; i < compiled.definition.colorAttachments.size(); ++i) { VkClearValue colorClear{}; colorClear.color = compiled.definition.clearColorValue; clearValues.push_back(colorClear); } + + // Depth attachment if (!compiled.definition.depthAttachment.empty()) { VkClearValue depthClear{}; depthClear.depthStencil = compiled.definition.clearDepthValue; diff --git a/FarmEngine/src/rendering/graph/RenderGraph.h b/FarmEngine/src/rendering/graph/RenderGraph.h index e98286f..1c0a302 100644 --- a/FarmEngine/src/rendering/graph/RenderGraph.h +++ b/FarmEngine/src/rendering/graph/RenderGraph.h @@ -149,6 +149,9 @@ class RenderGraph { VkRenderPass vkRenderPass = VK_NULL_HANDLE; VkFramebuffer framebuffer = VK_NULL_HANDLE; + // Extent calculado durante la creación del framebuffer para usar en execute() + VkExtent2D extent = {0, 0}; + // Barreras de transición antes del pass std::vector prePassBarriers; }; diff --git a/FarmEngine/world/chunks/ChunkSystem.cpp b/FarmEngine/world/chunks/ChunkSystem.cpp index 5f88ccc..c0a4137 100644 --- a/FarmEngine/world/chunks/ChunkSystem.cpp +++ b/FarmEngine/world/chunks/ChunkSystem.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace FarmEngine {