/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #include "Base/Render/IRenderer.hpp" #include "Base/UI/IWindow.hpp" #include "Base/Logger.hpp" #include "Context.hpp" #include "UiRenderer.hpp" #include "Resources/ResourceManager.hpp" #include "Data/ReadOnlyAtomicArrayQueue.hpp" #include "CommandHelper.hpp" #include "Base/EngineConfiguration.hpp" #include #include namespace openVulkanoCpp::Vulkan { struct WaitSemaphores { std::vector renderReady, renderComplete; }; class Renderer final : public IRenderer { Context context; std::shared_ptr logger; std::vector waitSemaphores; Scene::Scene* scene = nullptr; ResourceManager resourceManager; uint32_t currentImageId = -1; std::vector threadPool; std::vector> commands; std::vector> submitBuffers; UiRenderer uiRenderer; VulkanShader* shader; public: Renderer() = default; ~Renderer() override = default; void Init(IGraphicsAppManager* graphicsAppManager, IWindow* window) override; void Tick() override; void Close() override; std::string GetMainRenderDeviceName() override; void Resize(uint32_t newWidth, uint32_t newHeight) override; void SetScene(Scene::Scene* scene) override { this->scene = scene; } Scene::Scene* GetScene() override { return scene; } void SetActiveUi(Scene::UI::Ui* ui) override { uiRenderer.SetActiveUi(ui); } Scene::UI::Ui* GetActiveUi() override { return uiRenderer.GetActiveUi(); } CommandHelper* GetCommandData(uint32_t poolId); static void RunThread(Renderer* renderer, Data::ReadOnlyAtomicArrayQueue* jobQueue, uint32_t id); void StartThreads(Data::ReadOnlyAtomicArrayQueue* jobQueue); void RecordPrimaryBuffer(); void Submit(); void Render(); void RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue* jobQueue, uint32_t poolId); }; }