From 13feaf4aab57a00a8d327dde9c8802f54c228f51 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 16 May 2021 23:13:00 +0200 Subject: [PATCH] Renderer: RenderWindow now requires a RenderDevice --- examples/DeferredShading/main.cpp | 8 +++--- examples/GraphicsTest/main.cpp | 6 ++--- examples/RenderTest/main.cpp | 6 ++--- include/Nazara/Graphics/Graphics.hpp | 2 +- include/Nazara/Graphics/Graphics.inl | 4 +-- include/Nazara/Graphics/MaterialSettings.inl | 2 +- .../OpenGLRenderer/OpenGLRenderWindow.hpp | 3 --- .../Nazara/OpenGLRenderer/OpenGLRenderer.hpp | 5 ++-- include/Nazara/Renderer/RenderWindow.hpp | 13 ++++----- include/Nazara/Renderer/RenderWindow.inl | 27 +++++++------------ include/Nazara/Renderer/RenderWindowImpl.hpp | 2 +- include/Nazara/Renderer/Renderer.hpp | 8 ++++++ include/Nazara/Renderer/RendererImpl.hpp | 2 +- .../Nazara/VulkanRenderer/VkRenderWindow.hpp | 2 -- .../Nazara/VulkanRenderer/VkRenderWindow.inl | 5 ---- .../Nazara/VulkanRenderer/VulkanRenderer.hpp | 3 ++- src/Nazara/Graphics/BakedFrameGraph.cpp | 10 +++---- src/Nazara/Graphics/FrameGraph.cpp | 4 +-- src/Nazara/Graphics/GraphicalMesh.cpp | 6 ++--- src/Nazara/Graphics/Graphics.cpp | 3 +-- src/Nazara/Graphics/Material.cpp | 2 +- src/Nazara/Graphics/MaterialPipeline.cpp | 2 +- src/Nazara/Graphics/ModelInstance.cpp | 2 +- src/Nazara/Graphics/UberShader.cpp | 2 +- .../OpenGLRenderer/OpenGLRenderWindow.cpp | 9 ++----- src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp | 16 ++++++----- src/Nazara/Renderer/RenderWindow.cpp | 27 ++++++++++++------- src/Nazara/Renderer/Renderer.cpp | 25 +++++++++++++++++ src/Nazara/VulkanRenderer/VkRenderWindow.cpp | 10 ++++--- src/Nazara/VulkanRenderer/VulkanRenderer.cpp | 23 ++++++++-------- 30 files changed, 132 insertions(+), 107 deletions(-) diff --git a/examples/DeferredShading/main.cpp b/examples/DeferredShading/main.cpp index b8858be8f..8ae4f12df 100644 --- a/examples/DeferredShading/main.cpp +++ b/examples/DeferredShading/main.cpp @@ -57,16 +57,16 @@ int main() meshParams.matrix = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, 90.f, 180.f)) * Nz::Matrix4f::Scale(Nz::Vector3f(0.002f)); meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ_Normal_UV); + std::shared_ptr device = Nz::Graphics::Instance()->GetRenderDevice(); + const Nz::RenderDeviceInfo& deviceInfo = device->GetDeviceInfo(); + std::string windowTitle = "Graphics Test"; - if (!window.Create(Nz::VideoMode(1280, 720, 32), windowTitle)) + if (!window.Create(device, Nz::VideoMode(1280, 720, 32), windowTitle)) { std::cout << "Failed to create Window" << std::endl; return __LINE__; } - std::shared_ptr device = window.GetRenderDevice(); - const Nz::RenderDeviceInfo& deviceInfo = device->GetDeviceInfo(); - Nz::MeshRef drfreak = Nz::Mesh::LoadFromFile(resourceDir / "Spaceship/spaceship.obj", meshParams); if (!drfreak) { diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp index 29f7ed023..2700e3605 100644 --- a/examples/GraphicsTest/main.cpp +++ b/examples/GraphicsTest/main.cpp @@ -31,15 +31,15 @@ int main() meshParams.matrix = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, 90.f, 180.f)) * Nz::Matrix4f::Scale(Nz::Vector3f(0.002f)); meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ_Normal_UV); + std::shared_ptr device = Nz::Graphics::Instance()->GetRenderDevice(); + std::string windowTitle = "Graphics Test"; - if (!window.Create(Nz::VideoMode(800, 600, 32), windowTitle)) + if (!window.Create(device, Nz::VideoMode(800, 600, 32), windowTitle)) { std::cout << "Failed to create Window" << std::endl; return __LINE__; } - std::shared_ptr device = window.GetRenderDevice(); - Nz::MeshRef drfreak = Nz::Mesh::LoadFromFile(resourceDir / "Spaceship/spaceship.obj", meshParams); if (!drfreak) { diff --git a/examples/RenderTest/main.cpp b/examples/RenderTest/main.cpp index 89986304b..335eba093 100644 --- a/examples/RenderTest/main.cpp +++ b/examples/RenderTest/main.cpp @@ -90,15 +90,15 @@ int main() meshParams.matrix = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, 90.f, 180.f)) * Nz::Matrix4f::Scale(Nz::Vector3f(0.002f)); meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ_Normal_UV); + std::shared_ptr device = Nz::Renderer::Instance()->InstanciateRenderDevice(0); + std::string windowTitle = "Render Test"; - if (!window.Create(Nz::VideoMode(800, 600, 32), windowTitle)) + if (!window.Create(device, Nz::VideoMode(800, 600, 32), windowTitle)) { std::cout << "Failed to create Window" << std::endl; return __LINE__; } - std::shared_ptr device = window.GetRenderDevice(); - Nz::ShaderWriter::States states; states.enabledOptions = 0; states.optimize = true; diff --git a/include/Nazara/Graphics/Graphics.hpp b/include/Nazara/Graphics/Graphics.hpp index 4f6f5115b..ec2d57238 100644 --- a/include/Nazara/Graphics/Graphics.hpp +++ b/include/Nazara/Graphics/Graphics.hpp @@ -31,7 +31,7 @@ namespace Nz Graphics(Config config); ~Graphics(); - inline RenderDevice& GetRenderDevice(); + inline const std::shared_ptr& GetRenderDevice() const; inline TextureSamplerCache& GetSamplerCache(); inline const std::shared_ptr& GetViewerDataUBO(); diff --git a/include/Nazara/Graphics/Graphics.inl b/include/Nazara/Graphics/Graphics.inl index a4e581e5a..3362436ee 100644 --- a/include/Nazara/Graphics/Graphics.inl +++ b/include/Nazara/Graphics/Graphics.inl @@ -7,9 +7,9 @@ namespace Nz { - inline RenderDevice& Graphics::GetRenderDevice() + inline const std::shared_ptr& Graphics::GetRenderDevice() const { - return *m_renderDevice; + return m_renderDevice; } inline TextureSamplerCache& Graphics::GetSamplerCache() diff --git a/include/Nazara/Graphics/MaterialSettings.inl b/include/Nazara/Graphics/MaterialSettings.inl index e631e1509..b91f84ef5 100644 --- a/include/Nazara/Graphics/MaterialSettings.inl +++ b/include/Nazara/Graphics/MaterialSettings.inl @@ -51,7 +51,7 @@ namespace Nz }); } - m_pipelineLayout = Graphics::Instance()->GetRenderDevice().InstantiateRenderPipelineLayout(std::move(info)); + m_pipelineLayout = Graphics::Instance()->GetRenderDevice()->InstantiateRenderPipelineLayout(std::move(info)); } inline auto MaterialSettings::GetBuilderData() const -> const Builder& diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp index cfaf3cf1a..71443475c 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp @@ -37,13 +37,10 @@ namespace Nz const OpenGLFramebuffer& GetFramebuffer() const override; const OpenGLRenderPass& GetRenderPass() const override; - std::shared_ptr GetRenderDevice() override; - void Present(); private: std::size_t m_currentFrame; - std::shared_ptr m_device; std::vector> m_renderImage; std::unique_ptr m_context; OpenGLRenderPass m_renderPass; diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp b/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp index 8a6570283..4ca7ee683 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp @@ -19,7 +19,7 @@ namespace Nz class NAZARA_OPENGLRENDERER_API OpenGLRenderer : public RendererImpl { public: - OpenGLRenderer() = default; + OpenGLRenderer(); ~OpenGLRenderer(); std::unique_ptr CreateRenderSurfaceImpl() override; @@ -30,7 +30,7 @@ namespace Nz RenderAPI QueryAPI() const override; std::string QueryAPIString() const override; UInt32 QueryAPIVersion() const override; - std::vector QueryRenderDevices() const override; + const std::vector& QueryRenderDevices() const override; bool Prepare(const ParameterList& parameters) override; @@ -39,6 +39,7 @@ namespace Nz std::shared_ptr m_device; std::unique_ptr m_loader; + std::vector m_deviceInfos; }; } diff --git a/include/Nazara/Renderer/RenderWindow.hpp b/include/Nazara/Renderer/RenderWindow.hpp index d02e37323..c4534c2ea 100644 --- a/include/Nazara/Renderer/RenderWindow.hpp +++ b/include/Nazara/Renderer/RenderWindow.hpp @@ -25,19 +25,19 @@ namespace Nz { public: inline RenderWindow(); - inline RenderWindow(VideoMode mode, const std::string& title, WindowStyleFlags style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters()); - inline explicit RenderWindow(void* handle, const RenderWindowParameters ¶meters = RenderWindowParameters()); + inline RenderWindow(std::shared_ptr renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters()); + inline RenderWindow(std::shared_ptr renderDevice, void* handle, const RenderWindowParameters& parameters = RenderWindowParameters()); inline ~RenderWindow(); - inline bool Create(VideoMode mode, const std::string& title, WindowStyleFlags style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters()); - inline bool Create(void* handle, const RenderWindowParameters ¶meters = RenderWindowParameters()); + bool Create(std::shared_ptr renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters()); + bool Create(std::shared_ptr renderDevice, void* handle, const RenderWindowParameters ¶meters = RenderWindowParameters()); void Display(); void EnableVerticalSync(bool enabled); inline RenderWindowImpl* GetImpl(); - std::shared_ptr GetRenderDevice(); + inline const std::shared_ptr& GetRenderDevice() const; inline RenderSurface* GetSurface(); inline bool IsValid() const; @@ -53,9 +53,10 @@ namespace Nz void OnWindowResized() override; private: + std::shared_ptr m_renderDevice; + std::unique_ptr m_surface; std::unique_ptr m_impl; Clock m_clock; - std::unique_ptr m_surface; RenderWindowParameters m_parameters; unsigned int m_framerateLimit; }; diff --git a/include/Nazara/Renderer/RenderWindow.inl b/include/Nazara/Renderer/RenderWindow.inl index 9179ef577..7f458577f 100644 --- a/include/Nazara/Renderer/RenderWindow.inl +++ b/include/Nazara/Renderer/RenderWindow.inl @@ -12,19 +12,19 @@ namespace Nz { } - inline RenderWindow::RenderWindow(VideoMode mode, const std::string& title, WindowStyleFlags style, const RenderWindowParameters& parameters) : + inline RenderWindow::RenderWindow(std::shared_ptr renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style, const RenderWindowParameters& parameters) : RenderWindow() { ErrorFlags errFlags(ErrorFlag_ThrowException, true); - Create(mode, title, style, parameters); + Create(std::move(renderDevice), mode, title, style, parameters); } - inline RenderWindow::RenderWindow(void* handle, const RenderWindowParameters& parameters) + inline RenderWindow::RenderWindow(std::shared_ptr renderDevice, void* handle, const RenderWindowParameters& parameters) { ErrorFlags errFlags(ErrorFlag_ThrowException, true); - Create(handle, parameters); + Create(std::move(renderDevice), handle, parameters); } inline RenderWindow::~RenderWindow() @@ -32,25 +32,16 @@ namespace Nz Destroy(); } - inline bool RenderWindow::Create(VideoMode mode, const std::string& title, WindowStyleFlags style, const RenderWindowParameters& parameters) - { - m_parameters = parameters; - - return Window::Create(mode, title, style); - } - - inline bool RenderWindow::Create(void* handle, const RenderWindowParameters& parameters) - { - m_parameters = parameters; - - return Window::Create(handle); - } - inline RenderWindowImpl* RenderWindow::GetImpl() { return m_impl.get(); } + inline const std::shared_ptr& RenderWindow::GetRenderDevice() const + { + return m_renderDevice; + } + inline RenderSurface* RenderWindow::GetSurface() { return m_surface.get(); diff --git a/include/Nazara/Renderer/RenderWindowImpl.hpp b/include/Nazara/Renderer/RenderWindowImpl.hpp index dec071274..b016fbd21 100644 --- a/include/Nazara/Renderer/RenderWindowImpl.hpp +++ b/include/Nazara/Renderer/RenderWindowImpl.hpp @@ -20,6 +20,7 @@ namespace Nz class CommandPool; class Framebuffer; class RendererImpl; + class RenderDevice; class RenderPass; class RenderSurface; @@ -35,7 +36,6 @@ namespace Nz virtual std::shared_ptr CreateCommandPool(QueueType queueType) = 0; virtual const Framebuffer& GetFramebuffer() const = 0; - virtual std::shared_ptr GetRenderDevice() = 0; virtual const RenderPass& GetRenderPass() const = 0; }; } diff --git a/include/Nazara/Renderer/Renderer.hpp b/include/Nazara/Renderer/Renderer.hpp index 72d51b3a7..a314790d6 100644 --- a/include/Nazara/Renderer/Renderer.hpp +++ b/include/Nazara/Renderer/Renderer.hpp @@ -34,6 +34,14 @@ namespace Nz inline RendererImpl* GetRendererImpl(); + std::shared_ptr InstanciateRenderDevice(std::size_t deviceIndex); + + RenderAPI QueryAPI() const; + std::string QueryAPIString() const; + UInt32 QueryAPIVersion() const; + + const std::vector& QueryRenderDevices() const; + struct Config { Nz::RenderAPI preferredAPI = Nz::RenderAPI::Unknown; diff --git a/include/Nazara/Renderer/RendererImpl.hpp b/include/Nazara/Renderer/RendererImpl.hpp index 8bff2d8a2..54518ece8 100644 --- a/include/Nazara/Renderer/RendererImpl.hpp +++ b/include/Nazara/Renderer/RendererImpl.hpp @@ -43,7 +43,7 @@ namespace Nz virtual std::string QueryAPIString() const = 0; virtual UInt32 QueryAPIVersion() const = 0; - virtual std::vector QueryRenderDevices() const = 0; + virtual const std::vector& QueryRenderDevices() const = 0; virtual bool Prepare(const ParameterList& parameters) = 0; }; diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.hpp b/include/Nazara/VulkanRenderer/VkRenderWindow.hpp index 6eee7bc49..98d8a238a 100644 --- a/include/Nazara/VulkanRenderer/VkRenderWindow.hpp +++ b/include/Nazara/VulkanRenderer/VkRenderWindow.hpp @@ -55,8 +55,6 @@ namespace Nz inline const VulkanRenderPass& GetRenderPass() const override; inline const Vk::Swapchain& GetSwapchain() const; - inline std::shared_ptr GetRenderDevice() override; - void Present(UInt32 imageIndex, VkSemaphore waitSemaphore = VK_NULL_HANDLE); VkRenderWindow& operator=(const VkRenderWindow&) = delete; diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.inl b/include/Nazara/VulkanRenderer/VkRenderWindow.inl index 5daff2463..e108bc8ac 100644 --- a/include/Nazara/VulkanRenderer/VkRenderWindow.inl +++ b/include/Nazara/VulkanRenderer/VkRenderWindow.inl @@ -36,11 +36,6 @@ namespace Nz { return m_swapchain; } - - inline std::shared_ptr VkRenderWindow::GetRenderDevice() - { - return m_device; - } } #include diff --git a/include/Nazara/VulkanRenderer/VulkanRenderer.hpp b/include/Nazara/VulkanRenderer/VulkanRenderer.hpp index 881118bfe..bd772716b 100644 --- a/include/Nazara/VulkanRenderer/VulkanRenderer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanRenderer.hpp @@ -33,7 +33,7 @@ namespace Nz RenderAPI QueryAPI() const override; std::string QueryAPIString() const override; UInt32 QueryAPIVersion() const override; - std::vector QueryRenderDevices() const override; + const std::vector& QueryRenderDevices() const override; bool Prepare(const ParameterList& parameters) override; @@ -41,6 +41,7 @@ namespace Nz private: std::list m_devices; + std::vector m_deviceInfos; ParameterList m_initializationParameters; Vk::Instance m_instance; }; diff --git a/src/Nazara/Graphics/BakedFrameGraph.cpp b/src/Nazara/Graphics/BakedFrameGraph.cpp index 0984290ca..89a13d1df 100644 --- a/src/Nazara/Graphics/BakedFrameGraph.cpp +++ b/src/Nazara/Graphics/BakedFrameGraph.cpp @@ -16,8 +16,8 @@ namespace Nz m_attachmentToTextureMapping(std::move(attachmentIdToTextureMapping)), m_passIdToPhysicalPassMapping(std::move(passIdToPhysicalPassMapping)) { - RenderDevice& renderDevice = Graphics::Instance()->GetRenderDevice(); - m_commandPool = renderDevice.InstantiateCommandPool(QueueType::Graphics); + const std::shared_ptr& renderDevice = Graphics::Instance()->GetRenderDevice(); + m_commandPool = renderDevice->InstantiateCommandPool(QueueType::Graphics); } void BakedFrameGraph::Execute(RenderFrame& renderFrame) @@ -115,7 +115,7 @@ namespace Nz void BakedFrameGraph::Resize(unsigned int width, unsigned int height) { - RenderDevice& renderDevice = Graphics::Instance()->GetRenderDevice(); + const std::shared_ptr& renderDevice = Graphics::Instance()->GetRenderDevice(); // Delete previous textures to make some room in VRAM for (auto& passData : m_passes) @@ -136,7 +136,7 @@ namespace Nz textureCreationParams.usageFlags = textureData.usage; textureCreationParams.pixelFormat = textureData.format; - textureData.texture = renderDevice.InstantiateTexture(textureCreationParams); + textureData.texture = renderDevice->InstantiateTexture(textureCreationParams); } std::vector> textures; @@ -160,7 +160,7 @@ namespace Nz passData.renderRect.Set(0, 0, int(framebufferWidth), int(framebufferHeight)); - passData.framebuffer = renderDevice.InstantiateFramebuffer(framebufferWidth, framebufferHeight, passData.renderPass, textures); + passData.framebuffer = renderDevice->InstantiateFramebuffer(framebufferWidth, framebufferHeight, passData.renderPass, textures); } } } diff --git a/src/Nazara/Graphics/FrameGraph.cpp b/src/Nazara/Graphics/FrameGraph.cpp index 63ff914a6..ac9bbf0da 100644 --- a/src/Nazara/Graphics/FrameGraph.cpp +++ b/src/Nazara/Graphics/FrameGraph.cpp @@ -612,7 +612,7 @@ namespace Nz void FrameGraph::BuildPhysicalPasses() { - RenderDevice& renderDevice = Graphics::Instance()->GetRenderDevice(); + const std::shared_ptr& renderDevice = Graphics::Instance()->GetRenderDevice(); std::unordered_map textureLayouts; @@ -845,7 +845,7 @@ namespace Nz BuildPhysicalPassDependencies(colorAttachmentCount, depthStencilAttachmentIndex.has_value(), renderPassAttachments, subpassesDesc, subpassesDeps); - m_pending.renderPasses.push_back(renderDevice.InstantiateRenderPass(std::move(renderPassAttachments), std::move(subpassesDesc), std::move(subpassesDeps))); + m_pending.renderPasses.push_back(renderDevice->InstantiateRenderPass(std::move(renderPassAttachments), std::move(subpassesDesc), std::move(subpassesDeps))); physicalPassIndex++; } diff --git a/src/Nazara/Graphics/GraphicalMesh.cpp b/src/Nazara/Graphics/GraphicalMesh.cpp index a3042155c..a15980189 100644 --- a/src/Nazara/Graphics/GraphicalMesh.cpp +++ b/src/Nazara/Graphics/GraphicalMesh.cpp @@ -15,7 +15,7 @@ namespace Nz { assert(mesh->GetAnimationType() == AnimationType_Static); - RenderDevice& renderDevice = Graphics::Instance()->GetRenderDevice(); + const std::shared_ptr& renderDevice = Graphics::Instance()->GetRenderDevice(); m_subMeshes.reserve(mesh->GetSubMeshCount()); for (std::size_t i = 0; i < mesh->GetSubMeshCount(); ++i) @@ -34,7 +34,7 @@ namespace Nz const SoftwareBuffer* vertexBufferContent = static_cast(vertexBuffer->GetBuffer()->GetImpl()); auto& submeshData = m_subMeshes.emplace_back(); - submeshData.indexBuffer = renderDevice.InstantiateBuffer(BufferType_Index); + submeshData.indexBuffer = renderDevice->InstantiateBuffer(BufferType_Index); if (!submeshData.indexBuffer->Initialize(indexBuffer->GetStride() * indexBuffer->GetIndexCount(), BufferUsage_DeviceLocal)) throw std::runtime_error("failed to create index buffer"); @@ -43,7 +43,7 @@ namespace Nz submeshData.indexCount = indexBuffer->GetIndexCount(); - submeshData.vertexBuffer = renderDevice.InstantiateBuffer(BufferType_Vertex); + submeshData.vertexBuffer = renderDevice->InstantiateBuffer(BufferType_Vertex); if (!submeshData.vertexBuffer->Initialize(vertexBuffer->GetStride() * vertexBuffer->GetVertexCount(), BufferUsage_DeviceLocal)) throw std::runtime_error("failed to create vertex buffer"); diff --git a/src/Nazara/Graphics/Graphics.cpp b/src/Nazara/Graphics/Graphics.cpp index ebbd447d7..1bea6b54d 100644 --- a/src/Nazara/Graphics/Graphics.cpp +++ b/src/Nazara/Graphics/Graphics.cpp @@ -19,7 +19,6 @@ namespace Nz ModuleBase("Graphics", this) { Renderer* renderer = Renderer::Instance(); - RendererImpl* rendererImpl = renderer->GetRendererImpl(); //< FIXME std::vector renderDeviceInfo = rendererImpl->QueryRenderDevices(); if (renderDeviceInfo.empty()) throw std::runtime_error("no render device available"); @@ -35,7 +34,7 @@ namespace Nz } } - m_renderDevice = rendererImpl->InstanciateRenderDevice(bestRenderDeviceIndex); + m_renderDevice = renderer->InstanciateRenderDevice(bestRenderDeviceIndex); if (!m_renderDevice) throw std::runtime_error("failed to instantiate render device"); diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index f0170b1c2..a7f41fc9e 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -43,7 +43,7 @@ namespace Nz { auto& uniformBuffer = m_uniformBuffers.emplace_back(); - uniformBuffer.buffer = Graphics::Instance()->GetRenderDevice().InstantiateBuffer(Nz::BufferType_Uniform); + uniformBuffer.buffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(Nz::BufferType_Uniform); if (!uniformBuffer.buffer->Initialize(uniformBufferInfo.blockSize, BufferUsage_Dynamic)) throw std::runtime_error("failed to initialize UBO memory"); diff --git a/src/Nazara/Graphics/MaterialPipeline.cpp b/src/Nazara/Graphics/MaterialPipeline.cpp index 3ed157abc..a713ac4b5 100644 --- a/src/Nazara/Graphics/MaterialPipeline.cpp +++ b/src/Nazara/Graphics/MaterialPipeline.cpp @@ -56,7 +56,7 @@ namespace Nz renderPipelineInfo.vertexBuffers = vertexBuffers; - return m_renderPipelines.emplace_back(Graphics::Instance()->GetRenderDevice().InstantiateRenderPipeline(std::move(renderPipelineInfo))); + return m_renderPipelines.emplace_back(Graphics::Instance()->GetRenderDevice()->InstantiateRenderPipeline(std::move(renderPipelineInfo))); } /*! * \brief Returns a reference to a MaterialPipeline built with MaterialPipelineInfo diff --git a/src/Nazara/Graphics/ModelInstance.cpp b/src/Nazara/Graphics/ModelInstance.cpp index 96479ea0b..c17219614 100644 --- a/src/Nazara/Graphics/ModelInstance.cpp +++ b/src/Nazara/Graphics/ModelInstance.cpp @@ -15,7 +15,7 @@ namespace Nz { Nz::PredefinedInstanceData instanceUboOffsets = Nz::PredefinedInstanceData::GetOffsets(); - m_instanceDataBuffer = Graphics::Instance()->GetRenderDevice().InstantiateBuffer(BufferType_Uniform); + m_instanceDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType_Uniform); if (!m_instanceDataBuffer->Initialize(instanceUboOffsets.totalSize, Nz::BufferUsage_DeviceLocal | Nz::BufferUsage_Dynamic)) throw std::runtime_error("failed to initialize viewer data UBO"); diff --git a/src/Nazara/Graphics/UberShader.cpp b/src/Nazara/Graphics/UberShader.cpp index dfdc22848..ff2d07d1d 100644 --- a/src/Nazara/Graphics/UberShader.cpp +++ b/src/Nazara/Graphics/UberShader.cpp @@ -61,7 +61,7 @@ namespace Nz states.enabledOptions = combination; states.sanitized = true; - std::shared_ptr stage = Graphics::Instance()->GetRenderDevice().InstantiateShaderModule(m_shaderStage, m_shaderAst, std::move(states)); + std::shared_ptr stage = Graphics::Instance()->GetRenderDevice()->InstantiateShaderModule(m_shaderStage, m_shaderAst, std::move(states)); it = m_combinations.emplace(combination, std::move(stage)).first; } diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp index e0ddf9185..a1e95b460 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderWindow.cpp @@ -41,11 +41,11 @@ namespace Nz DummySurface* dummySurface = static_cast(surface); OpenGLRenderer* glRenderer = static_cast(renderer); - m_device = std::static_pointer_cast(glRenderer->InstanciateRenderDevice(0)); + OpenGLDevice& device = static_cast(*m_owner.GetRenderDevice()); GL::ContextParams contextParams; - m_context = m_device->CreateContext(contextParams, dummySurface->GetWindowHandle()); + m_context = device.CreateContext(contextParams, dummySurface->GetWindowHandle()); if (!m_context) return false; @@ -75,11 +75,6 @@ namespace Nz return m_renderPass; } - std::shared_ptr OpenGLRenderWindow::GetRenderDevice() - { - return m_device; - } - void OpenGLRenderWindow::Present() { m_context->SwapBuffers(); diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp index 63e061bb2..bced38769 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp @@ -24,6 +24,13 @@ namespace Nz { + OpenGLRenderer::OpenGLRenderer() + { + auto& dummyDevice = m_deviceInfos.emplace_back(); + dummyDevice.name = "OpenGL Default Device"; + dummyDevice.type = RenderDeviceType::Unknown; + } + OpenGLRenderer::~OpenGLRenderer() { m_device.reset(); @@ -107,13 +114,8 @@ namespace Nz return 300; } - std::vector OpenGLRenderer::QueryRenderDevices() const + const std::vector& OpenGLRenderer::QueryRenderDevices() const { - std::vector devices; - auto& dummyDevice = devices.emplace_back(); - dummyDevice.name = "OpenGL Default Device"; - dummyDevice.type = RenderDeviceType::Unknown; - - return devices; + return m_deviceInfos; } } diff --git a/src/Nazara/Renderer/RenderWindow.cpp b/src/Nazara/Renderer/RenderWindow.cpp index 48a218ab8..ea4412526 100644 --- a/src/Nazara/Renderer/RenderWindow.cpp +++ b/src/Nazara/Renderer/RenderWindow.cpp @@ -11,6 +11,22 @@ namespace Nz { + bool RenderWindow::Create(std::shared_ptr renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style, const RenderWindowParameters& parameters) + { + m_parameters = parameters; + m_renderDevice = std::move(renderDevice); + + return Window::Create(mode, title, style); + } + + bool RenderWindow::Create(std::shared_ptr renderDevice, void* handle, const RenderWindowParameters& parameters) + { + m_parameters = parameters; + m_renderDevice = std::move(renderDevice); + + return Window::Create(handle); + } + void RenderWindow::Display() { if (m_framerateLimit > 0) @@ -28,17 +44,9 @@ namespace Nz ///TODO } - std::shared_ptr RenderWindow::GetRenderDevice() - { - if (!m_impl) - return std::shared_ptr(); - - return m_impl->GetRenderDevice(); - } - bool RenderWindow::OnWindowCreated() { - RendererImpl *rendererImpl = Renderer::Instance()->GetRendererImpl(); + RendererImpl* rendererImpl = Renderer::Instance()->GetRendererImpl(); auto surface = rendererImpl->CreateRenderSurfaceImpl(); if (!surface->Create(GetSystemHandle())) { @@ -64,6 +72,7 @@ namespace Nz void RenderWindow::OnWindowDestroy() { m_impl.reset(); + m_renderDevice.reset(); m_surface.reset(); } diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 04fa06029..b1d11de7c 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -134,5 +134,30 @@ namespace Nz m_rendererImpl.reset(); } + std::shared_ptr Renderer::InstanciateRenderDevice(std::size_t deviceIndex) + { + return m_rendererImpl->InstanciateRenderDevice(deviceIndex); + } + + RenderAPI Renderer::QueryAPI() const + { + return m_rendererImpl->QueryAPI(); + } + + std::string Renderer::QueryAPIString() const + { + return m_rendererImpl->QueryAPIString(); + } + + UInt32 Renderer::QueryAPIVersion() const + { + return m_rendererImpl->QueryAPIVersion(); + } + + const std::vector& Renderer::QueryRenderDevices() const + { + return m_rendererImpl->QueryRenderDevices(); + } + Renderer* Renderer::s_instance = nullptr; } diff --git a/src/Nazara/VulkanRenderer/VkRenderWindow.cpp b/src/Nazara/VulkanRenderer/VkRenderWindow.cpp index 1eef29351..0950eba33 100644 --- a/src/Nazara/VulkanRenderer/VkRenderWindow.cpp +++ b/src/Nazara/VulkanRenderer/VkRenderWindow.cpp @@ -105,14 +105,16 @@ namespace Nz bool VkRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters) { - const auto& deviceInfo = Vulkan::GetPhysicalDevices()[0]; + VulkanDevice& referenceDevice = static_cast(*m_owner.GetRenderDevice()); + + const auto& physDeviceInfo = referenceDevice.GetPhysicalDeviceInfo(); Vk::Surface& vulkanSurface = static_cast(surface)->GetSurface(); UInt32 graphicsFamilyQueueIndex; UInt32 presentableFamilyQueueIndex; UInt32 transferFamilyQueueIndex; - m_device = Vulkan::SelectDevice(deviceInfo, vulkanSurface, &graphicsFamilyQueueIndex, &presentableFamilyQueueIndex, &transferFamilyQueueIndex); + m_device = Vulkan::SelectDevice(physDeviceInfo, vulkanSurface, &graphicsFamilyQueueIndex, &presentableFamilyQueueIndex, &transferFamilyQueueIndex); if (!m_device) { NazaraError("Failed to get compatible Vulkan device"); @@ -124,7 +126,7 @@ namespace Nz m_transferQueue = m_device->GetQueue(transferFamilyQueueIndex, 0); std::vector surfaceFormats; - if (!vulkanSurface.GetFormats(deviceInfo.physDevice, &surfaceFormats)) + if (!vulkanSurface.GetFormats(physDeviceInfo.physDevice, &surfaceFormats)) { NazaraError("Failed to query supported surface formats"); return false; @@ -192,7 +194,7 @@ namespace Nz if (m_depthStencilFormat != VK_FORMAT_MAX_ENUM) { - VkFormatProperties formatProperties = m_device->GetInstance().GetPhysicalDeviceFormatProperties(deviceInfo.physDevice, m_depthStencilFormat); + VkFormatProperties formatProperties = m_device->GetInstance().GetPhysicalDeviceFormatProperties(physDeviceInfo.physDevice, m_depthStencilFormat); if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) break; //< Found it diff --git a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp index 4fa5604e1..ab9db0069 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp @@ -40,7 +40,16 @@ namespace Nz bool VulkanRenderer::Prepare(const ParameterList& parameters) { - return Vulkan::Initialize(APIVersion, parameters); + if (!Vulkan::Initialize(APIVersion, parameters)) + return false; + + const auto& physDevices = Vulkan::GetPhysicalDevices(); + + m_deviceInfos.reserve(physDevices.size()); + for (const Vk::PhysicalDevice& physDevice : physDevices) + m_deviceInfos.push_back(Vulkan::BuildRenderDeviceInfo(physDevice)); + + return true; } RenderAPI VulkanRenderer::QueryAPI() const @@ -61,16 +70,8 @@ namespace Nz return APIVersion; } - std::vector VulkanRenderer::QueryRenderDevices() const + const std::vector& VulkanRenderer::QueryRenderDevices() const { - const auto& physDevices = Vulkan::GetPhysicalDevices(); - - std::vector devices; - devices.reserve(physDevices.size()); - - for (const Vk::PhysicalDevice& physDevice : physDevices) - devices.push_back(Vulkan::BuildRenderDeviceInfo(physDevice)); - - return devices; + return m_deviceInfos; } }