diff --git a/include/Nazara/Renderer.hpp b/include/Nazara/Renderer.hpp index b57d4c5a5..52519d374 100644 --- a/include/Nazara/Renderer.hpp +++ b/include/Nazara/Renderer.hpp @@ -1,4 +1,4 @@ -// This file was automatically generated on 24 Jun 2015 at 13:55:50 +// This file was automatically generated on 15 Sep 2016 at 00:43:26 /* Nazara Engine - Renderer module @@ -30,26 +30,12 @@ #define NAZARA_GLOBAL_RENDERER_HPP #include -#include -#include -#include #include -#include -#include -#include +#include #include -#include -#include -#include -#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include #endif // NAZARA_GLOBAL_RENDERER_HPP diff --git a/include/Nazara/Renderer/RenderWindow.hpp b/include/Nazara/Renderer/RenderWindow.hpp index 5435cebaf..a0d5859e4 100644 --- a/include/Nazara/Renderer/RenderWindow.hpp +++ b/include/Nazara/Renderer/RenderWindow.hpp @@ -1,9 +1,7 @@ -// Copyright (C) 2015 Jérôme Leclercq +// Copyright (C) 2016 Jérôme Leclercq // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp -// Interface inspirée de la SFML par Laurent Gomila - #pragma once #ifndef NAZARA_RENDERWINDOW_HPP @@ -13,66 +11,52 @@ #include #include #include +#include +#include #include -#include +#include namespace Nz { - class AbstractImage; - class Context; - class Texture; - struct ContextParameters; - - class NAZARA_RENDERER_API RenderWindow : public RenderTarget, public Window + class NAZARA_RENDERER_API RenderWindow : public Window { public: - RenderWindow() = default; - RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); - RenderWindow(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); + inline RenderWindow(); + inline RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters()); + inline RenderWindow(WindowHandle handle, const RenderWindowParameters& parameters = RenderWindowParameters()); RenderWindow(const RenderWindow&) = delete; RenderWindow(RenderWindow&&) = delete; ///TODO virtual ~RenderWindow(); - bool CopyToImage(AbstractImage* image, const Vector3ui& dstPos = Vector3ui(0U)) const; - bool CopyToImage(AbstractImage* image, const Rectui& rect, const Vector3ui& dstPos = Vector3ui(0U)) const; - - bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); - bool Create(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); + inline bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters()); + inline bool Create(WindowHandle handle, const RenderWindowParameters& parameters = RenderWindowParameters()); void Display(); void EnableVerticalSync(bool enabled); - unsigned int GetHeight() const override; - RenderTargetParameters GetParameters() const override; - unsigned int GetWidth() const override; + inline RenderWindowImpl* GetImpl(); - bool IsRenderable() const override; - bool IsValid() const; + inline bool IsValid() const; - void SetFramerateLimit(unsigned int limit); - - // Fonctions OpenGL - ContextParameters GetContextParameters() const; - bool HasContext() const override; + inline void SetFramerateLimit(unsigned int limit); RenderWindow& operator=(const RenderWindow&) = delete; RenderWindow& operator=(RenderWindow&&) = delete; ///TODO protected: - bool Activate() const override; - void EnsureTargetUpdated() const override; bool OnWindowCreated() override; void OnWindowDestroy() override; void OnWindowResized() override; private: - mutable std::vector m_buffer; + std::unique_ptr m_impl; Clock m_clock; - ContextParameters m_parameters; - mutable Context* m_context = nullptr; - unsigned int m_framerateLimit = 0; + RenderWindowParameters m_parameters; + unsigned int m_framerateLimit; }; } +#include + #endif // NAZARA_RENDERWINDOW_HPP diff --git a/include/Nazara/Renderer/RenderWindow.inl b/include/Nazara/Renderer/RenderWindow.inl index 1cda9d63d..a7ff34c62 100644 --- a/include/Nazara/Renderer/RenderWindow.inl +++ b/include/Nazara/Renderer/RenderWindow.inl @@ -2,80 +2,57 @@ // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp -// Interface inspirée de la SFML par Laurent Gomila - -#pragma once - -#ifndef NAZARA_RENDERWINDOW_HPP -#define NAZARA_RENDERWINDOW_HPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include namespace Nz { - class AbstractImage; - class Context; - class Texture; - struct ContextParameters; - - class NAZARA_RENDERER_API RenderWindow : public RenderTarget, public Window + inline RenderWindow::RenderWindow() : + m_framerateLimit(0U) { - public: - RenderWindow() = default; - RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); - RenderWindow(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); - RenderWindow(const RenderWindow&) = delete; - RenderWindow(RenderWindow&&) = delete; ///TODO - virtual ~RenderWindow(); + } - bool CopyToImage(AbstractImage* image, const Vector3ui& dstPos = Vector3ui(0U)) const; - bool CopyToImage(AbstractImage* image, const Rectui& rect, const Vector3ui& dstPos = Vector3ui(0U)) const; + inline RenderWindow::RenderWindow(VideoMode mode, const String& title, UInt32 style, const RenderWindowParameters& parameters) : + RenderWindow() + { + ErrorFlags errFlags(ErrorFlag_ThrowException, true); - bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); - bool Create(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); + Create(mode, title, style, parameters); + } - void Display(); + inline RenderWindow::RenderWindow(WindowHandle handle, const RenderWindowParameters& parameters) + { + ErrorFlags errFlags(ErrorFlag_ThrowException, true); - void EnableVerticalSync(bool enabled); + Create(handle, parameters); + } - unsigned int GetHeight() const override; - RenderTargetParameters GetParameters() const override; - unsigned int GetWidth() const override; + inline bool RenderWindow::Create(VideoMode mode, const String& title, UInt32 style, const RenderWindowParameters& parameters) + { + m_parameters = parameters; - bool IsRenderable() const override; - bool IsValid() const; + return Window::Create(mode, title, style); + } - void SetFramerateLimit(unsigned int limit); + inline bool RenderWindow::Create(WindowHandle handle, const RenderWindowParameters& parameters) + { + m_parameters = parameters; - // Fonctions OpenGL - ContextParameters GetContextParameters() const; - bool HasContext() const override; + return Window::Create(handle); + } - RenderWindow& operator=(const RenderWindow&) = delete; - RenderWindow& operator=(RenderWindow&&) = delete; ///TODO + inline RenderWindowImpl* Nz::RenderWindow::GetImpl() + { + return m_impl.get(); + } - protected: - bool Activate() const override; - void EnsureTargetUpdated() const override; - bool OnWindowCreated() override; - void OnWindowDestroy() override; - void OnWindowResized() override; + inline bool RenderWindow::IsValid() const + { + return m_impl != nullptr; + } - private: - mutable std::vector m_buffer; - Clock m_clock; - ContextParameters m_parameters; - mutable Context* m_context = nullptr; - unsigned int m_framerateLimit = 0; - }; + inline void RenderWindow::SetFramerateLimit(unsigned int limit) + { + m_framerateLimit = limit; + } } - -#endif // NAZARA_RENDERWINDOW_HPP diff --git a/include/Nazara/Renderer/RenderWindowImpl.hpp b/include/Nazara/Renderer/RenderWindowImpl.hpp index 1cda9d63d..19a831773 100644 --- a/include/Nazara/Renderer/RenderWindowImpl.hpp +++ b/include/Nazara/Renderer/RenderWindowImpl.hpp @@ -2,80 +2,28 @@ // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp -// Interface inspirée de la SFML par Laurent Gomila - #pragma once -#ifndef NAZARA_RENDERWINDOW_HPP -#define NAZARA_RENDERWINDOW_HPP +#ifndef NAZARA_RENDERWINDOWIMPL_HPP +#define NAZARA_RENDERWINDOWIMPL_HPP #include -#include -#include -#include +#include #include -#include -#include -#include +#include +#include #include namespace Nz { - class AbstractImage; - class Context; - class Texture; - struct ContextParameters; - - class NAZARA_RENDERER_API RenderWindow : public RenderTarget, public Window + class NAZARA_RENDERER_API RenderWindowImpl { public: - RenderWindow() = default; - RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); - RenderWindow(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); - RenderWindow(const RenderWindow&) = delete; - RenderWindow(RenderWindow&&) = delete; ///TODO - virtual ~RenderWindow(); + RenderWindowImpl() = default; + virtual ~RenderWindowImpl(); - bool CopyToImage(AbstractImage* image, const Vector3ui& dstPos = Vector3ui(0U)) const; - bool CopyToImage(AbstractImage* image, const Rectui& rect, const Vector3ui& dstPos = Vector3ui(0U)) const; - - bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); - bool Create(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); - - void Display(); - - void EnableVerticalSync(bool enabled); - - unsigned int GetHeight() const override; - RenderTargetParameters GetParameters() const override; - unsigned int GetWidth() const override; - - bool IsRenderable() const override; - bool IsValid() const; - - void SetFramerateLimit(unsigned int limit); - - // Fonctions OpenGL - ContextParameters GetContextParameters() const; - bool HasContext() const override; - - RenderWindow& operator=(const RenderWindow&) = delete; - RenderWindow& operator=(RenderWindow&&) = delete; ///TODO - - protected: - bool Activate() const override; - void EnsureTargetUpdated() const override; - bool OnWindowCreated() override; - void OnWindowDestroy() override; - void OnWindowResized() override; - - private: - mutable std::vector m_buffer; - Clock m_clock; - ContextParameters m_parameters; - mutable Context* m_context = nullptr; - unsigned int m_framerateLimit = 0; + virtual bool Create(WindowHandle handle, const Vector2ui& size, const RenderWindowParameters& parameters) = 0; }; } -#endif // NAZARA_RENDERWINDOW_HPP +#endif // NAZARA_RENDERWINDOWIMPL_HPP diff --git a/include/Nazara/Renderer/RenderWindowParameters.hpp b/include/Nazara/Renderer/RenderWindowParameters.hpp new file mode 100644 index 000000000..78645b54c --- /dev/null +++ b/include/Nazara/Renderer/RenderWindowParameters.hpp @@ -0,0 +1,23 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_RENDERWINDOWPARAMETERS_HPP +#define NAZARA_RENDERWINDOWPARAMETERS_HPP + +#include +#include +#include + +namespace Nz +{ + struct RenderWindowParameters + { + std::vector depthFormats = {Nz::PixelFormatType_Depth32, Nz::PixelFormatType_Depth24}; //< By order of preference + bool verticalSync = false; + }; +} + +#endif // NAZARA_RENDERWINDOWPARAMETERS_HPP diff --git a/include/Nazara/Renderer/RendererImpl.hpp b/include/Nazara/Renderer/RendererImpl.hpp index f3f70d892..4c88773dd 100644 --- a/include/Nazara/Renderer/RendererImpl.hpp +++ b/include/Nazara/Renderer/RendererImpl.hpp @@ -18,6 +18,7 @@ namespace Nz { class RendererImpl; + class RenderWindowImpl; using CreateRendererImplFunc = RendererImpl*(*)(); @@ -27,6 +28,8 @@ namespace Nz RendererImpl() = default; virtual ~RendererImpl(); + virtual std::unique_ptr CreateRenderWindowImpl() = 0; + virtual bool IsBetterThan(const RendererImpl* other) const = 0; virtual RenderAPI QueryAPI() const = 0; diff --git a/include/Nazara/VulkanRenderer.hpp b/include/Nazara/VulkanRenderer.hpp index a2973a5fc..13874e658 100644 --- a/include/Nazara/VulkanRenderer.hpp +++ b/include/Nazara/VulkanRenderer.hpp @@ -1,4 +1,4 @@ -// This file was automatically generated on 17 Aug 2016 at 14:07:55 +// This file was automatically generated on 15 Sep 2016 at 00:43:26 /* Nazara Engine - Vulkan @@ -30,8 +30,6 @@ #define NAZARA_GLOBAL_VULKANRENDERER_HPP #include -#include -#include #include #include #include @@ -52,10 +50,13 @@ #include #include #include +#include +#include #include #include #include #include #include +#include #endif // NAZARA_GLOBAL_VULKANRENDERER_HPP diff --git a/include/Nazara/VulkanRenderer/RenderTarget.hpp b/include/Nazara/VulkanRenderer/VkRenderTarget.hpp similarity index 65% rename from include/Nazara/VulkanRenderer/RenderTarget.hpp rename to include/Nazara/VulkanRenderer/VkRenderTarget.hpp index c8e6b27fa..51aa97d4a 100644 --- a/include/Nazara/VulkanRenderer/RenderTarget.hpp +++ b/include/Nazara/VulkanRenderer/VkRenderTarget.hpp @@ -4,8 +4,8 @@ #pragma once -#ifndef NAZARA_RENDERTARGET_HPP -#define NAZARA_RENDERTARGET_HPP +#ifndef NAZARA_VULKANRENDERER_RENDERTARGET_HPP +#define NAZARA_VULKANRENDERER_RENDERTARGET_HPP #include #include @@ -18,17 +18,13 @@ namespace Nz { - class Renderer; - - class NAZARA_VULKANRENDERER_API RenderTarget + class NAZARA_VULKANRENDERER_API VkRenderTarget { - friend Renderer; - public: - RenderTarget() = default; - RenderTarget(const RenderTarget&) = delete; - RenderTarget(RenderTarget&&) = delete; ///TOOD? - virtual ~RenderTarget(); + VkRenderTarget() = default; + VkRenderTarget(const VkRenderTarget&) = delete; + VkRenderTarget(VkRenderTarget&&) = delete; ///TOOD? + virtual ~VkRenderTarget(); virtual bool Acquire(UInt32* imageIndex) const = 0; @@ -44,12 +40,12 @@ namespace Nz virtual void Present(UInt32 imageIndex) = 0; - RenderTarget& operator=(const RenderTarget&) = delete; - RenderTarget& operator=(RenderTarget&&) = delete; ///TOOD? + VkRenderTarget& operator=(const VkRenderTarget&) = delete; + VkRenderTarget& operator=(VkRenderTarget&&) = delete; ///TOOD? // Signals: - NazaraSignal(OnRenderTargetRelease, const RenderTarget* /*renderTarget*/); - NazaraSignal(OnRenderTargetSizeChange, const RenderTarget* /*renderTarget*/); + NazaraSignal(OnRenderTargetRelease, const VkRenderTarget* /*renderTarget*/); + NazaraSignal(OnRenderTargetSizeChange, const VkRenderTarget* /*renderTarget*/); protected: Vk::RenderPass m_renderPass; @@ -57,4 +53,4 @@ namespace Nz }; } -#endif // NAZARA_RENDERTARGET_HPP +#endif // NAZARA_VULKANRENDERER_RENDERTARGET_HPP diff --git a/include/Nazara/VulkanRenderer/RenderWindow.hpp b/include/Nazara/VulkanRenderer/VkRenderWindow.hpp similarity index 50% rename from include/Nazara/VulkanRenderer/RenderWindow.hpp rename to include/Nazara/VulkanRenderer/VkRenderWindow.hpp index 0b7f0878e..348fb84c1 100644 --- a/include/Nazara/VulkanRenderer/RenderWindow.hpp +++ b/include/Nazara/VulkanRenderer/VkRenderWindow.hpp @@ -4,78 +4,65 @@ #pragma once -#ifndef NAZARA_RENDERWINDOW_HPP -#define NAZARA_RENDERWINDOW_HPP +#ifndef NAZARA_VULKANRENDERER_RENDERWINDOW_HPP +#define NAZARA_VULKANRENDERER_RENDERWINDOW_HPP #include #include #include #include +#include #include -#include #include #include #include #include #include #include +#include #include #include -#include #include namespace Nz { - class NAZARA_VULKANRENDERER_API RenderWindow : public RenderTarget, public Window + class NAZARA_VULKANRENDERER_API VkRenderWindow : public VkRenderTarget, public RenderWindowImpl { public: - RenderWindow(); - RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default); - RenderWindow(WindowHandle handle); - RenderWindow(const RenderWindow&) = delete; - RenderWindow(RenderWindow&&) = delete; ///TODO - virtual ~RenderWindow(); + VkRenderWindow(); + VkRenderWindow(const VkRenderWindow&) = delete; + VkRenderWindow(VkRenderWindow&&) = delete; ///TODO + virtual ~VkRenderWindow(); bool Acquire(UInt32* index) const override; void BuildPreRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) override; void BuildPostRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) override; - bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default); - bool Create(WindowHandle handle); + bool Create(WindowHandle handle, const Vector2ui& size, const RenderWindowParameters& parameters) override; - const Vk::Framebuffer& GetFrameBuffer(UInt32 imageIndex) const override; - UInt32 GetFramebufferCount() const; - const Vk::DeviceHandle& GetDevice() const; - UInt32 GetPresentableFamilyQueue() const; - const Vk::Surface& GetSurface() const; - const Vk::Swapchain& GetSwapchain() const; + inline const Vk::Framebuffer& GetFrameBuffer(UInt32 imageIndex) const override; + inline UInt32 GetFramebufferCount() const; + inline const Vk::DeviceHandle& GetDevice() const; + inline UInt32 GetPresentableFamilyQueue() const; + inline const Vk::Surface& GetSurface() const; + inline const Vk::Swapchain& GetSwapchain() const; void Present(UInt32 imageIndex) override; - bool IsValid() const; - - void SetDepthStencilFormats(std::vector pixelFormat); - void SetPhysicalDevice(VkPhysicalDevice device); - - RenderWindow& operator=(const RenderWindow&) = delete; - RenderWindow& operator=(RenderWindow&&) = delete; ///TODO + VkRenderWindow& operator=(const VkRenderWindow&) = delete; + VkRenderWindow& operator=(VkRenderWindow&&) = delete; ///TODO private: - bool OnWindowCreated() override; - void OnWindowDestroy() override; - void OnWindowResized() override; - - bool SetupDepthBuffer(); - bool SetupRenderPass(); - bool SetupSwapchain(); + bool SetupDepthBuffer(const Vector2ui& size); + bool SetupRenderPass(const Vector2ui& size); + bool SetupSwapchain(const Vector2ui& size); Clock m_clock; VkColorSpaceKHR m_colorSpace; VkFormat m_colorFormat; VkFormat m_depthStencilFormat; - VkPhysicalDevice m_forcedPhysicalDevice; - std::vector m_wantedDepthStencilFormats; + VkPhysicalDevice m_physicalDevice; std::vector m_frameBuffers; Vk::DeviceHandle m_device; Vk::DeviceMemory m_depthBufferMemory; @@ -88,4 +75,6 @@ namespace Nz }; } -#endif // NAZARA_RENDERWINDOW_HPP +#include + +#endif // NAZARA_VULKANRENDERER_RENDERWINDOW_HPP diff --git a/include/Nazara/VulkanRenderer/VkRenderWindow.inl b/include/Nazara/VulkanRenderer/VkRenderWindow.inl new file mode 100644 index 000000000..0142c1d03 --- /dev/null +++ b/include/Nazara/VulkanRenderer/VkRenderWindow.inl @@ -0,0 +1,48 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Vulkan Renderer" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline const Vk::DeviceHandle& VkRenderWindow::GetDevice() const + { + return m_device; + } + + inline const Vk::Framebuffer& VkRenderWindow::GetFrameBuffer(UInt32 imageIndex) const + { + return m_frameBuffers[imageIndex]; + } + + inline UInt32 VkRenderWindow::GetFramebufferCount() const + { + return static_cast(m_frameBuffers.size()); + } + + inline UInt32 VkRenderWindow::GetPresentableFamilyQueue() const + { + return m_presentableFamilyQueue; + } + + inline const Vk::Surface& VkRenderWindow::GetSurface() const + { + return m_surface; + } + + inline const Vk::Swapchain& VkRenderWindow::GetSwapchain() const + { + return m_swapchain; + } + + inline void VkRenderWindow::Present(UInt32 imageIndex) + { + NazaraAssert(imageIndex < m_frameBuffers.size(), "Invalid image index"); + + m_presentQueue.Present(m_swapchain, imageIndex); + } +} + +#include diff --git a/include/Nazara/VulkanRenderer/VulkanRenderer.hpp b/include/Nazara/VulkanRenderer/VulkanRenderer.hpp index b77cb6935..8fc88ca4c 100644 --- a/include/Nazara/VulkanRenderer/VulkanRenderer.hpp +++ b/include/Nazara/VulkanRenderer/VulkanRenderer.hpp @@ -21,6 +21,8 @@ namespace Nz VulkanRenderer() = default; ~VulkanRenderer() = default; + std::unique_ptr CreateRenderWindowImpl() override; + bool IsBetterThan(const RendererImpl* other) const override; RenderAPI QueryAPI() const override; diff --git a/src/Nazara/Renderer/RenderWindow.cpp b/src/Nazara/Renderer/RenderWindow.cpp index 078c28f2b..56626386e 100644 --- a/src/Nazara/Renderer/RenderWindow.cpp +++ b/src/Nazara/Renderer/RenderWindow.cpp @@ -1,138 +1,21 @@ // Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp -/* + #include #include -#include #include -#include -#include #include -#include -#include #include namespace Nz { - RenderWindow::RenderWindow(VideoMode mode, const String& title, UInt32 style, const ContextParameters& parameters) : - RenderTarget(), Window() - { - ErrorFlags flags(ErrorFlag_ThrowException, true); - Create(mode, title, style, parameters); - } - - RenderWindow::RenderWindow(WindowHandle handle, const ContextParameters& parameters) : - RenderTarget(), Window() - { - ErrorFlags flags(ErrorFlag_ThrowException, true); - Create(handle, parameters); - } - RenderWindow::~RenderWindow() { // Nécessaire si Window::Destroy est appelé par son destructeur OnWindowDestroy(); } - bool RenderWindow::CopyToImage(AbstractImage* image, const Vector3ui& dstPos) const - { - #if NAZARA_RENDERER_SAFE - if (!m_context) - { - NazaraError("Window has not been created"); - return false; - } - #endif - - return CopyToImage(image, Rectui(Vector2ui(0U), GetSize()), dstPos); - } - - bool RenderWindow::CopyToImage(AbstractImage* image, const Rectui& rect, const Vector3ui& dstPos) const - { - #if NAZARA_RENDERER_SAFE - if (!m_context) - { - NazaraError("Window has not been created"); - return false; - } - #endif - - Vector2ui windowSize = GetSize(); - - #if NAZARA_RENDERER_SAFE - if (!image) - { - NazaraError("Image must be valid"); - return false; - } - - if (image->GetFormat() != PixelFormatType_RGBA8) - { - // Pour plus de facilité, évidemment on peut faire sauter cette règle avec un peu de gestion - NazaraError("Image must be RGBA8-formatted"); - return false; - } - - if (rect.x + rect.width > windowSize.x || rect.y + rect.height > windowSize.y) - { - NazaraError("Rectangle dimensions are out of window's bounds"); - return false; - } - - Vector3ui imageSize = image->GetSize(); - if (dstPos.x + rect.width > imageSize.x || dstPos.y + rect.height > imageSize.y || dstPos.z > imageSize.z) - { - NazaraError("Cube dimensions are out of image's bounds"); - return false; - } - #endif - - const Context* currentContext = Context::GetCurrent(); - if (m_context != currentContext) - { - if (!m_context->SetActive(true)) - { - NazaraError("Failed to activate context"); - return false; - } - } - - ///TODO: Fast-path pour les images en cas de copie du buffer entier - - m_buffer.resize(rect.width*rect.height*4); - glReadPixels(rect.x, windowSize.y - rect.height - rect.y, rect.width, rect.height, GL_RGBA, GL_UNSIGNED_BYTE, m_buffer.data()); - - // Les pixels sont retournés, nous devons envoyer les pixels par rangée - for (unsigned int i = 0; i < rect.height; ++i) - image->Update(&m_buffer[rect.width*4*i], Boxui(dstPos.x, rect.height - i - 1, dstPos.z, rect.width, 1, 1), rect.width); - - if (m_context != currentContext) - { - if (currentContext) - { - if (!currentContext->SetActive(true)) - NazaraWarning("Failed to reset old context"); - } - else - m_context->SetActive(false); - } - - return true; - } - - bool RenderWindow::Create(VideoMode mode, const String& title, UInt32 style, const ContextParameters& parameters) - { - m_parameters = parameters; - return Window::Create(mode, title, style); - } - - bool RenderWindow::Create(WindowHandle handle, const ContextParameters& parameters) - { - m_parameters = parameters; - return Window::Create(handle); - } - void RenderWindow::Display() { if (m_framerateLimit > 0) @@ -143,129 +26,23 @@ namespace Nz m_clock.Restart(); } - - if (m_context && m_parameters.doubleBuffered) - m_context->SwapBuffers(); } void RenderWindow::EnableVerticalSync(bool enabled) { - if (m_context) - { - if (!m_context->SetActive(true)) - { - NazaraError("Failed to activate context"); - return; - } - - m_context->EnableVerticalSync(enabled); - } - else - NazaraError("No context"); - } - - unsigned int RenderWindow::GetHeight() const - { - return Window::GetHeight(); - } - - RenderTargetParameters RenderWindow::GetParameters() const - { - if (m_context) - { - const ContextParameters& parameters = m_context->GetParameters(); - return RenderTargetParameters(parameters.antialiasingLevel, parameters.depthBits, parameters.stencilBits); - } - else - { - NazaraError("Window not created/context not initialized"); - return RenderTargetParameters(); - } - } - - unsigned int RenderWindow::GetWidth() const - { - return Window::GetWidth(); - } - - bool RenderWindow::IsRenderable() const - { - return m_impl != nullptr; // Si m_impl est valide, alors m_context l'est aussi - } - - bool RenderWindow::IsValid() const - { - return m_impl != nullptr; - } - - void RenderWindow::SetFramerateLimit(unsigned int limit) - { - m_framerateLimit = limit; - } - - ContextParameters RenderWindow::GetContextParameters() const - { - if (m_context) - return m_context->GetParameters(); - else - { - NazaraError("Window not created/context not initialized"); - return ContextParameters(); - } - } - - bool RenderWindow::HasContext() const - { - return true; - } - - bool RenderWindow::Activate() const - { - if (m_context->SetActive(true)) - { - glDrawBuffer((m_parameters.doubleBuffered) ? GL_BACK : GL_FRONT); - return true; - } - else - { - NazaraError("Failed to activate window's context"); - return false; - } - } - - void RenderWindow::EnsureTargetUpdated() const - { - // Rien à faire + ///TODO } bool RenderWindow::OnWindowCreated() { - m_parameters.doubleBuffered = true; - m_parameters.window = GetHandle(); - - std::unique_ptr context(new Context); - if (!context->Create(m_parameters)) + auto impl = Renderer::GetRendererImpl()->CreateRenderWindowImpl(); + if (!impl->Create(GetHandle(), Vector2ui(GetWidth(), GetHeight()), m_parameters)) { - NazaraError("Failed to create context"); + NazaraError("Failed to create render window implementation: " + Error::GetLastError()); return false; } - m_context = context.release(); - - if (!SetActive(true)) // Les fenêtres s'activent à la création - NazaraWarning("Failed to activate window"); - - EnableVerticalSync(false); - - Vector2ui size = GetSize(); - - // Le scissorBox/viewport (à la création) est de la taille de la fenêtre - // https://www.opengl.org/sdk/docs/man/xhtml/glGet.xml - OpenGL::SetScissorBox(Recti(0, 0, size.x, size.y)); - OpenGL::SetViewport(Recti(0, 0, size.x, size.y)); - - OnRenderTargetParametersChange(this); - OnRenderTargetSizeChange(this); + m_impl = std::move(impl); m_clock.Restart(); @@ -274,19 +51,10 @@ namespace Nz void RenderWindow::OnWindowDestroy() { - if (m_context) - { - if (IsActive()) - Renderer::SetTarget(nullptr); - - delete m_context; - m_context = nullptr; - } + m_impl.reset(); } void RenderWindow::OnWindowResized() { - OnRenderTargetSizeChange(this); } } -*/ \ No newline at end of file diff --git a/src/Nazara/Renderer/RendererWindowImpl.cpp b/src/Nazara/Renderer/RendererWindowImpl.cpp new file mode 100644 index 000000000..b1a2b946f --- /dev/null +++ b/src/Nazara/Renderer/RendererWindowImpl.cpp @@ -0,0 +1,11 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + RenderWindowImpl::~RenderWindowImpl() = default; +} diff --git a/src/Nazara/VulkanRenderer/RenderTarget.cpp b/src/Nazara/VulkanRenderer/VkRenderTarget.cpp similarity index 76% rename from src/Nazara/VulkanRenderer/RenderTarget.cpp rename to src/Nazara/VulkanRenderer/VkRenderTarget.cpp index 4c78a5321..767ee7988 100644 --- a/src/Nazara/VulkanRenderer/RenderTarget.cpp +++ b/src/Nazara/VulkanRenderer/VkRenderTarget.cpp @@ -2,12 +2,12 @@ // This file is part of the "Nazara Engine - Vulkan Renderer" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include namespace Nz { - RenderTarget::~RenderTarget() + VkRenderTarget::~VkRenderTarget() { OnRenderTargetRelease(this); } diff --git a/src/Nazara/VulkanRenderer/RenderWindow.cpp b/src/Nazara/VulkanRenderer/VkRenderWindow.cpp similarity index 79% rename from src/Nazara/VulkanRenderer/RenderWindow.cpp rename to src/Nazara/VulkanRenderer/VkRenderWindow.cpp index 1d5fbd33e..b9a215318 100644 --- a/src/Nazara/VulkanRenderer/RenderWindow.cpp +++ b/src/Nazara/VulkanRenderer/VkRenderWindow.cpp @@ -2,7 +2,7 @@ // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include #include #include @@ -13,35 +13,24 @@ namespace Nz { - RenderWindow::RenderWindow() : - RenderTarget(), Window(), + VkRenderWindow::VkRenderWindow() : m_surface(Nz::Vulkan::GetInstance()), - m_forcedPhysicalDevice(nullptr), + m_physicalDevice(nullptr), m_depthStencilFormat(VK_FORMAT_MAX_ENUM) { } - RenderWindow::RenderWindow(VideoMode mode, const String& title, UInt32 style) : - RenderWindow() + VkRenderWindow::~VkRenderWindow() { - ErrorFlags flags(ErrorFlag_ThrowException, true); - Create(mode, title, style); + m_device->WaitForIdle(); + m_frameBuffers.clear(); + m_renderPass.Destroy(); + + m_swapchain.Destroy(); + m_surface.Destroy(); } - RenderWindow::RenderWindow(WindowHandle handle) : - RenderWindow() - { - ErrorFlags flags(ErrorFlag_ThrowException, true); - Create(handle); - } - - RenderWindow::~RenderWindow() - { - // Nécessaire si Window::Destroy est appelé par son destructeur - OnWindowDestroy(); - } - - bool RenderWindow::Acquire(UInt32* imageIndex) const + bool VkRenderWindow::Acquire(UInt32* imageIndex) const { if (!m_swapchain.AcquireNextImage(std::numeric_limits::max(), m_imageReadySemaphore, VK_NULL_HANDLE, imageIndex)) { @@ -52,7 +41,7 @@ namespace Nz return true; } - void RenderWindow::BuildPreRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) + void VkRenderWindow::BuildPreRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) { //commandBuffer.SetImageLayout(m_swapchain.GetBuffer(imageIndex).image, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); @@ -71,83 +60,19 @@ namespace Nz } } - void RenderWindow::BuildPostRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) + void VkRenderWindow::BuildPostRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) { //commandBuffer.SetImageLayout(m_swapchain.GetBuffer(imageIndex).image, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); } - const Vk::Framebuffer& RenderWindow::GetFrameBuffer(UInt32 imageIndex) const + bool VkRenderWindow::Create(WindowHandle handle, const Vector2ui& size, const RenderWindowParameters& parameters) { - return m_frameBuffers[imageIndex]; - } - - UInt32 RenderWindow::GetFramebufferCount() const - { - return static_cast(m_frameBuffers.size()); - } - - bool RenderWindow::Create(VideoMode mode, const String& title, UInt32 style) - { - return Window::Create(mode, title, style); - } - - bool RenderWindow::Create(WindowHandle handle) - { - return Window::Create(handle); - } - - const Vk::DeviceHandle& RenderWindow::GetDevice() const - { - return m_device; - } - - UInt32 RenderWindow::GetPresentableFamilyQueue() const - { - return m_presentableFamilyQueue; - } - - const Vk::Surface& RenderWindow::GetSurface() const - { - return m_surface; - } - - const Vk::Swapchain& RenderWindow::GetSwapchain() const - { - return m_swapchain; - } - - void RenderWindow::Present(UInt32 imageIndex) - { - NazaraAssert(imageIndex < m_frameBuffers.size(), "Invalid image index"); - - m_presentQueue.Present(m_swapchain, imageIndex); - } - - bool RenderWindow::IsValid() const - { - return m_impl != nullptr; - } - - void RenderWindow::SetDepthStencilFormats(std::vector pixelFormat) - { - m_wantedDepthStencilFormats = std::move(pixelFormat); - } - - void RenderWindow::SetPhysicalDevice(VkPhysicalDevice device) - { - m_forcedPhysicalDevice = device; - } - - bool RenderWindow::OnWindowCreated() - { - OnRenderTargetSizeChange(this); - #if defined(NAZARA_PLATFORM_WINDOWS) - HWND handle = reinterpret_cast(GetHandle()); - HINSTANCE instance = reinterpret_cast(GetWindowLongPtrW(handle, GWLP_HINSTANCE)); - bool success = m_surface.Create(instance, handle); + HWND winHandle = reinterpret_cast(handle); + HINSTANCE instance = reinterpret_cast(GetWindowLongPtrW(winHandle, GWLP_HINSTANCE)); + bool success = m_surface.Create(instance, winHandle); #else - #error This OS is not supported by Vulkan + #error This OS is not supported by Vulkan #endif if (!success) @@ -156,7 +81,9 @@ namespace Nz return false; } - m_device = Vulkan::SelectDevice(m_forcedPhysicalDevice, m_surface, &m_presentableFamilyQueue); + m_physicalDevice = Vulkan::GetPhysicalDevices()[0].device; + + m_device = Vulkan::SelectDevice(m_physicalDevice, m_surface, &m_presentableFamilyQueue); if (!m_device) { NazaraError("Failed to get compatible Vulkan device"); @@ -166,7 +93,7 @@ namespace Nz m_presentQueue = m_device->GetQueue(m_presentableFamilyQueue, 0); std::vector surfaceFormats; - if (!m_surface.GetFormats(m_forcedPhysicalDevice, &surfaceFormats)) + if (!m_surface.GetFormats(m_physicalDevice, &surfaceFormats)) { NazaraError("Failed to query supported surface formats"); return false; @@ -179,11 +106,11 @@ namespace Nz m_colorSpace = surfaceFormats[0].colorSpace; - if (!m_wantedDepthStencilFormats.empty()) + if (!parameters.depthFormats.empty()) { - const Vk::PhysicalDevice& deviceInfo = Vulkan::GetPhysicalDeviceInfo(m_forcedPhysicalDevice); + const Vk::PhysicalDevice& deviceInfo = Vulkan::GetPhysicalDeviceInfo(m_physicalDevice); - for (PixelFormatType format : m_wantedDepthStencilFormats) + for (PixelFormatType format : parameters.depthFormats) { switch (format) { @@ -223,7 +150,7 @@ namespace Nz if (m_depthStencilFormat != VK_FORMAT_MAX_ENUM) { - VkFormatProperties formatProperties = m_device->GetInstance().GetPhysicalDeviceFormatProperties(m_forcedPhysicalDevice, m_depthStencilFormat); + VkFormatProperties formatProperties = m_device->GetInstance().GetPhysicalDeviceFormatProperties(m_physicalDevice, m_depthStencilFormat); if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) break; //< Found it @@ -232,19 +159,19 @@ namespace Nz } } - if (!SetupSwapchain()) + if (!SetupSwapchain(size)) { NazaraError("Failed to create swapchain"); return false; } - if (m_depthStencilFormat != VK_FORMAT_MAX_ENUM && !SetupDepthBuffer()) + if (m_depthStencilFormat != VK_FORMAT_MAX_ENUM && !SetupDepthBuffer(size)) { NazaraError("Failed to create depth buffer"); return false; } - if (!SetupRenderPass()) + if (!SetupRenderPass(size)) { NazaraError("Failed to create render pass"); return false; @@ -265,8 +192,8 @@ namespace Nz m_renderPass, // VkRenderPass renderPass; (attachments[1] != VK_NULL_HANDLE) ? 2U : 1U, // uint32_t attachmentCount; attachments.data(), // const VkImageView* pAttachments; - GetWidth(), // uint32_t width; - GetHeight(), // uint32_t height; + size.x, // uint32_t width; + size.y, // uint32_t height; 1U // uint32_t layers; }; @@ -284,22 +211,7 @@ namespace Nz return true; } - void RenderWindow::OnWindowDestroy() - { - m_device->WaitForIdle(); - m_frameBuffers.clear(); - m_renderPass.Destroy(); - - m_swapchain.Destroy(); - m_surface.Destroy(); - } - - void RenderWindow::OnWindowResized() - { - OnRenderTargetSizeChange(this); - } - - bool RenderWindow::SetupDepthBuffer() + bool VkRenderWindow::SetupDepthBuffer(const Vector2ui& size) { VkImageCreateInfo imageCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; @@ -307,7 +219,7 @@ namespace Nz 0U, // VkImageCreateFlags flags; VK_IMAGE_TYPE_2D, // VkImageType imageType; m_depthStencilFormat, // VkFormat format; - {GetWidth(), GetHeight(), 1U}, // VkExtent3D extent; + {size.x, size.y, 1U}, // VkExtent3D extent; 1U, // uint32_t mipLevels; 1U, // uint32_t arrayLayers; VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; @@ -369,7 +281,7 @@ namespace Nz return true; } - bool RenderWindow::SetupRenderPass() + bool VkRenderWindow::SetupRenderPass(const Vector2ui& size) { std::array attachments = { { @@ -424,8 +336,8 @@ namespace Nz std::array dependencies; // First dependency at the start of the renderpass // Does the transition from final to initial layout - dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; // Producer of the dependency - dependencies[0].dstSubpass = 0; // Consumer is our single subpass that will wait for the execution depdendency + dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; // Producer of the dependency + dependencies[0].dstSubpass = 0; // Consumer is our single subpass that will wait for the execution depdendency dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; @@ -434,8 +346,8 @@ namespace Nz // Second dependency at the end the renderpass // Does the transition from the initial to the final layout - dependencies[1].srcSubpass = 0; // Producer of the dependency is our single subpass - dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL; // Consumer are all commands outside of the renderpass + dependencies[1].srcSubpass = 0; // Producer of the dependency is our single subpass + dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL; // Consumer are all commands outside of the renderpass dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; @@ -450,17 +362,17 @@ namespace Nz attachments.data(), // const VkAttachmentDescription* pAttachments; 1U, // uint32_t subpassCount; &subpass, // const VkSubpassDescription* pSubpasses; - dependencies.size(), // uint32_t dependencyCount; - dependencies.data() // const VkSubpassDependency* pDependencies; + UInt32(dependencies.size()), // uint32_t dependencyCount; + dependencies.data() // const VkSubpassDependency* pDependencies; }; return m_renderPass.Create(m_device, createInfo); } - bool RenderWindow::SetupSwapchain() + bool VkRenderWindow::SetupSwapchain(const Vector2ui& size) { VkSurfaceCapabilitiesKHR surfaceCapabilities; - if (!m_surface.GetCapabilities(m_forcedPhysicalDevice, &surfaceCapabilities)) + if (!m_surface.GetCapabilities(m_physicalDevice, &surfaceCapabilities)) { NazaraError("Failed to query surface capabilities"); return false; @@ -473,14 +385,14 @@ namespace Nz VkExtent2D extent; if (surfaceCapabilities.currentExtent.width == -1) { - extent.width = Nz::Clamp(GetWidth(), surfaceCapabilities.minImageExtent.width, surfaceCapabilities.maxImageExtent.width); - extent.height = Nz::Clamp(GetHeight(), surfaceCapabilities.minImageExtent.height, surfaceCapabilities.maxImageExtent.height); + extent.width = Nz::Clamp(size.x, surfaceCapabilities.minImageExtent.width, surfaceCapabilities.maxImageExtent.width); + extent.height = Nz::Clamp(size.y, surfaceCapabilities.minImageExtent.height, surfaceCapabilities.maxImageExtent.height); } else extent = surfaceCapabilities.currentExtent; std::vector presentModes; - if (!m_surface.GetPresentModes(m_forcedPhysicalDevice, &presentModes)) + if (!m_surface.GetPresentModes(m_physicalDevice, &presentModes)) { NazaraError("Failed to query supported present modes"); return false; diff --git a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp index 6d6f4d055..2b838f189 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp @@ -4,10 +4,16 @@ #include #include +#include #include namespace Nz { + std::unique_ptr VulkanRenderer::CreateRenderWindowImpl() + { + return std::make_unique(); + } + bool VulkanRenderer::IsBetterThan(const RendererImpl* other) const { if (other->QueryAPI() == RenderAPI_Vulkan && QueryAPIVersion() < other->QueryAPIVersion())