diff --git a/.gitignore b/.gitignore index 3296021..318f799 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,66 @@ ``` -# Build artifacts +# Compiled and binary files *.o *.obj -*.a -*.lib -*.so -*.dll *.exe +*.dll +*.so +*.a *.out -# CMake build directories -build/ -cmake-build-*/ -CMakeFiles/ -CMakeCache.txt -Makefile -compile_commands.json - # Dependencies -vendor/ +node_modules/ +venv/ +.venv/ +__pycache__/ +dist/ +build/ +target/ +.gradle/ -# Logs -*.log +# Editors/IDE +.vscode/ +.idea/ +*.swp +*.swo -# OS generated files +# System/Environment .DS_Store Thumbs.db +.env +.env.local +*.env.* + +# Logs and temp files +*.log +*.tmp + +# Coverage +coverage/ +htmlcov/ +.coverage + +# Compressed files +*.zip +*.gz +*.tar +*.tgz +*.bz2 +*.xz +*.7z +*.rar +*.zst +*.lz4 +*.lzh +*.cab +*.arj +*.rpm +*.deb +*.Z +*.lz +*.lzo +*.tar.gz +*.tar.bz2 +*.tar.xz +*.tar.zst ``` \ No newline at end of file diff --git a/FarmEngine/src/rendering/graph/RenderGraph.cpp b/FarmEngine/src/rendering/graph/RenderGraph.cpp index 22d7c4e..8b4c11b 100644 --- a/FarmEngine/src/rendering/graph/RenderGraph.cpp +++ b/FarmEngine/src/rendering/graph/RenderGraph.cpp @@ -13,6 +13,10 @@ const ResourceHandle* ResourceRegistry::getResource(const std::string& name) con if (it == nameToIndex.end()) { return nullptr; } + // Defensive bounds check to prevent out-of-bounds access with stale indices + if (it->second >= resources.size()) { + return nullptr; + } return &resources[it->second]; } @@ -123,10 +127,13 @@ RenderGraphBuilder& RenderGraphBuilder::addDependency(uint32_t from, uint32_t to // ============================================================================ // RenderGraph Implementation // ============================================================================ + +void RenderGraph::compile(RenderGraphBuilder&& builder) { // Copiar recursos y passes compiledRegistry.resources = std::move(builder.resources); // Limpiar estado previo antes de compilar + compiledRegistry.nameToIndex.clear(); compiledPasses.clear(); compiledPasses.resize(builder.passes.size()); @@ -197,9 +204,29 @@ RenderGraphBuilder& RenderGraphBuilder::addDependency(uint32_t from, uint32_t to // TODO: Implementar análisis de dependencias del grafo } - // 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 + // Procesar dependencias explícitas y convertirlas en barreras por-pass + for (const auto& dep : builder.explicitDependencies) { + if (dep.to < compiledPasses.size()) { + VkImageMemoryBarrier barrier{}; + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.srcAccessMask = dep.srcAccessMask; + barrier.dstAccessMask = dep.dstAccessMask; + barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.image = VK_NULL_HANDLE; // Se establecerá durante la ejecución + barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; + + compiledPasses[dep.to].prePassBarriers.push_back(barrier); + } + } +} + +void RenderGraph::build(VkDevice dev, VkExtent2D swapchainExtent) { + device = dev; + createRenderPasses(device); + createFramebuffers(device, swapchainExtent); } void RenderGraph::createRenderPasses(VkDevice dev) { @@ -308,7 +335,25 @@ 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.extent; + // Usar el extent del CompiledPass (calculado en createFramebuffers) + // Si es {0,0}, calcularlo dinámicamente desde los attachments como fallback + if (compiled.extent.width == 0 || compiled.extent.height == 0) { + VkExtent2D fallbackExtent = {800, 600}; // Default fallback + if (!compiled.definition.colorAttachments.empty()) { + const ResourceHandle* res = compiledRegistry.getResource(compiled.definition.colorAttachments[0]); + if (res && !res->isSwapchain) { + fallbackExtent = res->extent; + } + } else if (!compiled.definition.depthAttachment.empty()) { + const ResourceHandle* res = compiledRegistry.getResource(compiled.definition.depthAttachment); + if (res) { + fallbackExtent = res->extent; + } + } + rpBegin.renderArea.extent = fallbackExtent; + } else { + rpBegin.renderArea.extent = compiled.extent; + } // Clear values - uno por cada attachment (color attachments primero, luego depth) std::vector clearValues; diff --git a/FarmEngine/src/rendering/graph/RenderGraph.h b/FarmEngine/src/rendering/graph/RenderGraph.h index 1c0a302..dcb78e1 100644 --- a/FarmEngine/src/rendering/graph/RenderGraph.h +++ b/FarmEngine/src/rendering/graph/RenderGraph.h @@ -131,7 +131,9 @@ class RenderGraph { RenderGraph() = default; ~RenderGraph(); + void setDevice(VkDevice dev) { device = dev; } void compile(RenderGraphBuilder&& builder); + void build(VkDevice dev, VkExtent2D swapchainExtent); void execute(VkCommandBuffer cmd, ResourceRegistry& registry, uint32_t frameIndex); // Acceso a recursos compilados