VulkanRenderer: Add RenderWindow wrapper

Former-commit-id: 8046b7ecb5a71ba64bb5d51faaa2d2946318e6f1 [formerly adbc30c0ed533b63c445125f013384412f9272bd] [formerly eaa0c2a91e13440ee9b869d5fd2faad08d682879 [formerly 67381c6dbe3b960b1ab23bbe18c0a6193286f330]]
Former-commit-id: f4716a44444383d107f44265b5720490e141e4d0 [formerly 49d667d30dda623e6192853573efe05aa589035c]
Former-commit-id: fd3718fac5bb6d896d7cfd350807bbc1c0af309f
This commit is contained in:
Lynix 2016-09-15 00:44:22 +02:00
parent bdedd05032
commit f709ca4997
16 changed files with 259 additions and 605 deletions

View File

@ -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 Nazara Engine - Renderer module
@ -30,26 +30,12 @@
#define NAZARA_GLOBAL_RENDERER_HPP #define NAZARA_GLOBAL_RENDERER_HPP
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/Context.hpp>
#include <Nazara/Renderer/ContextParameters.hpp>
#include <Nazara/Renderer/DebugDrawer.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/GpuQuery.hpp> #include <Nazara/Renderer/RenderDevice.hpp>
#include <Nazara/Renderer/OpenGL.hpp>
#include <Nazara/Renderer/RenderBuffer.hpp>
#include <Nazara/Renderer/Renderer.hpp> #include <Nazara/Renderer/Renderer.hpp>
#include <Nazara/Renderer/RenderStates.hpp> #include <Nazara/Renderer/RendererImpl.hpp>
#include <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Renderer/RenderTargetParameters.hpp>
#include <Nazara/Renderer/RenderTexture.hpp>
#include <Nazara/Renderer/RenderWindow.hpp> #include <Nazara/Renderer/RenderWindow.hpp>
#include <Nazara/Renderer/Shader.hpp> #include <Nazara/Renderer/RenderWindowImpl.hpp>
#include <Nazara/Renderer/ShaderStage.hpp> #include <Nazara/Renderer/RenderWindowParameters.hpp>
#include <Nazara/Renderer/Texture.hpp>
#include <Nazara/Renderer/TextureSampler.hpp>
#include <Nazara/Renderer/UberShader.hpp>
#include <Nazara/Renderer/UberShaderInstance.hpp>
#include <Nazara/Renderer/UberShaderInstancePreprocessor.hpp>
#include <Nazara/Renderer/UberShaderPreprocessor.hpp>
#endif // NAZARA_GLOBAL_RENDERER_HPP #endif // NAZARA_GLOBAL_RENDERER_HPP

View File

@ -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" // This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
// Interface inspirée de la SFML par Laurent Gomila
#pragma once #pragma once
#ifndef NAZARA_RENDERWINDOW_HPP #ifndef NAZARA_RENDERWINDOW_HPP
@ -13,66 +11,52 @@
#include <Nazara/Core/Clock.hpp> #include <Nazara/Core/Clock.hpp>
#include <Nazara/Math/Rect.hpp> #include <Nazara/Math/Rect.hpp>
#include <Nazara/Math/Vector3.hpp> #include <Nazara/Math/Vector3.hpp>
#include <Nazara/Renderer/RenderWindowImpl.hpp>
#include <Nazara/Renderer/RenderWindowParameters.hpp>
#include <Nazara/Utility/Window.hpp> #include <Nazara/Utility/Window.hpp>
#include <vector> #include <memory>
namespace Nz namespace Nz
{ {
class AbstractImage; class NAZARA_RENDERER_API RenderWindow : public Window
class Context;
class Texture;
struct ContextParameters;
class NAZARA_RENDERER_API RenderWindow : public RenderTarget, public Window
{ {
public: public:
RenderWindow() = default; inline RenderWindow();
RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); inline RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters());
RenderWindow(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); inline RenderWindow(WindowHandle handle, const RenderWindowParameters& parameters = RenderWindowParameters());
RenderWindow(const RenderWindow&) = delete; RenderWindow(const RenderWindow&) = delete;
RenderWindow(RenderWindow&&) = delete; ///TODO RenderWindow(RenderWindow&&) = delete; ///TODO
virtual ~RenderWindow(); virtual ~RenderWindow();
bool CopyToImage(AbstractImage* image, const Vector3ui& dstPos = Vector3ui(0U)) const; inline bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters());
bool CopyToImage(AbstractImage* image, const Rectui& rect, const Vector3ui& dstPos = Vector3ui(0U)) const; inline bool Create(WindowHandle handle, const RenderWindowParameters& parameters = RenderWindowParameters());
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 Display();
void EnableVerticalSync(bool enabled); void EnableVerticalSync(bool enabled);
unsigned int GetHeight() const override; inline RenderWindowImpl* GetImpl();
RenderTargetParameters GetParameters() const override;
unsigned int GetWidth() const override;
bool IsRenderable() const override; inline bool IsValid() const;
bool IsValid() const;
void SetFramerateLimit(unsigned int limit); inline void SetFramerateLimit(unsigned int limit);
// Fonctions OpenGL
ContextParameters GetContextParameters() const;
bool HasContext() const override;
RenderWindow& operator=(const RenderWindow&) = delete; RenderWindow& operator=(const RenderWindow&) = delete;
RenderWindow& operator=(RenderWindow&&) = delete; ///TODO RenderWindow& operator=(RenderWindow&&) = delete; ///TODO
protected: protected:
bool Activate() const override;
void EnsureTargetUpdated() const override;
bool OnWindowCreated() override; bool OnWindowCreated() override;
void OnWindowDestroy() override; void OnWindowDestroy() override;
void OnWindowResized() override; void OnWindowResized() override;
private: private:
mutable std::vector<UInt8> m_buffer; std::unique_ptr<RenderWindowImpl> m_impl;
Clock m_clock; Clock m_clock;
ContextParameters m_parameters; RenderWindowParameters m_parameters;
mutable Context* m_context = nullptr; unsigned int m_framerateLimit;
unsigned int m_framerateLimit = 0;
}; };
} }
#include <Nazara/Renderer/RenderWindow.inl>
#endif // NAZARA_RENDERWINDOW_HPP #endif // NAZARA_RENDERWINDOW_HPP

View File

@ -2,80 +2,57 @@
// This file is part of the "Nazara Engine - Renderer module" // This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
// Interface inspirée de la SFML par Laurent Gomila #include <Nazara/Renderer/RenderWindow.hpp>
#include <Nazara/Core/ErrorFlags.hpp>
#pragma once
#ifndef NAZARA_RENDERWINDOW_HPP
#define NAZARA_RENDERWINDOW_HPP
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Clock.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Math/Vector3.hpp>
#include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/ContextParameters.hpp>
#include <Nazara/Renderer/RenderTarget.hpp>
#include <Nazara/Utility/Window.hpp>
#include <vector>
namespace Nz namespace Nz
{ {
class AbstractImage; inline RenderWindow::RenderWindow() :
class Context; m_framerateLimit(0U)
class Texture;
struct ContextParameters;
class NAZARA_RENDERER_API RenderWindow : public RenderTarget, 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());
RenderWindow(const RenderWindow&) = delete;
RenderWindow(RenderWindow&&) = delete; ///TODO
virtual ~RenderWindow();
bool CopyToImage(AbstractImage* image, const Vector3ui& dstPos = Vector3ui(0U)) const; inline RenderWindow::RenderWindow(VideoMode mode, const String& title, UInt32 style, const RenderWindowParameters& parameters) :
bool CopyToImage(AbstractImage* image, const Rectui& rect, const Vector3ui& dstPos = Vector3ui(0U)) const; RenderWindow()
{
ErrorFlags errFlags(ErrorFlag_ThrowException, true);
bool Create(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); Create(mode, title, style, parameters);
bool Create(WindowHandle handle, const ContextParameters& parameters = ContextParameters()); }
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; inline bool RenderWindow::Create(VideoMode mode, const String& title, UInt32 style, const RenderWindowParameters& parameters)
RenderTargetParameters GetParameters() const override; {
unsigned int GetWidth() const override; m_parameters = parameters;
bool IsRenderable() const override; return Window::Create(mode, title, style);
bool IsValid() const; }
void SetFramerateLimit(unsigned int limit); inline bool RenderWindow::Create(WindowHandle handle, const RenderWindowParameters& parameters)
{
m_parameters = parameters;
// Fonctions OpenGL return Window::Create(handle);
ContextParameters GetContextParameters() const; }
bool HasContext() const override;
RenderWindow& operator=(const RenderWindow&) = delete; inline RenderWindowImpl* Nz::RenderWindow::GetImpl()
RenderWindow& operator=(RenderWindow&&) = delete; ///TODO {
return m_impl.get();
}
protected: inline bool RenderWindow::IsValid() const
bool Activate() const override; {
void EnsureTargetUpdated() const override; return m_impl != nullptr;
bool OnWindowCreated() override; }
void OnWindowDestroy() override;
void OnWindowResized() override;
private: inline void RenderWindow::SetFramerateLimit(unsigned int limit)
mutable std::vector<UInt8> m_buffer; {
Clock m_clock; m_framerateLimit = limit;
ContextParameters m_parameters; }
mutable Context* m_context = nullptr;
unsigned int m_framerateLimit = 0;
};
} }
#endif // NAZARA_RENDERWINDOW_HPP

View File

@ -2,80 +2,28 @@
// This file is part of the "Nazara Engine - Renderer module" // This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
// Interface inspirée de la SFML par Laurent Gomila
#pragma once #pragma once
#ifndef NAZARA_RENDERWINDOW_HPP #ifndef NAZARA_RENDERWINDOWIMPL_HPP
#define NAZARA_RENDERWINDOW_HPP #define NAZARA_RENDERWINDOWIMPL_HPP
#include <Nazara/Prerequesites.hpp> #include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Clock.hpp> #include <Nazara/Math/Vector2.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Math/Vector3.hpp>
#include <Nazara/Renderer/Config.hpp> #include <Nazara/Renderer/Config.hpp>
#include <Nazara/Renderer/ContextParameters.hpp> #include <Nazara/Renderer/RenderWindowParameters.hpp>
#include <Nazara/Renderer/RenderTarget.hpp> #include <Nazara/Utility/WindowHandle.hpp>
#include <Nazara/Utility/Window.hpp>
#include <vector> #include <vector>
namespace Nz namespace Nz
{ {
class AbstractImage; class NAZARA_RENDERER_API RenderWindowImpl
class Context;
class Texture;
struct ContextParameters;
class NAZARA_RENDERER_API RenderWindow : public RenderTarget, public Window
{ {
public: public:
RenderWindow() = default; RenderWindowImpl() = default;
RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default, const ContextParameters& parameters = ContextParameters()); virtual ~RenderWindowImpl();
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; virtual bool Create(WindowHandle handle, const Vector2ui& size, const RenderWindowParameters& parameters) = 0;
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<UInt8> m_buffer;
Clock m_clock;
ContextParameters m_parameters;
mutable Context* m_context = nullptr;
unsigned int m_framerateLimit = 0;
}; };
} }
#endif // NAZARA_RENDERWINDOW_HPP #endif // NAZARA_RENDERWINDOWIMPL_HPP

View File

@ -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 <Nazara/Prerequesites.hpp>
#include <Nazara/Utility/PixelFormat.hpp>
#include <vector>
namespace Nz
{
struct RenderWindowParameters
{
std::vector<PixelFormatType> depthFormats = {Nz::PixelFormatType_Depth32, Nz::PixelFormatType_Depth24}; //< By order of preference
bool verticalSync = false;
};
}
#endif // NAZARA_RENDERWINDOWPARAMETERS_HPP

View File

@ -18,6 +18,7 @@
namespace Nz namespace Nz
{ {
class RendererImpl; class RendererImpl;
class RenderWindowImpl;
using CreateRendererImplFunc = RendererImpl*(*)(); using CreateRendererImplFunc = RendererImpl*(*)();
@ -27,6 +28,8 @@ namespace Nz
RendererImpl() = default; RendererImpl() = default;
virtual ~RendererImpl(); virtual ~RendererImpl();
virtual std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl() = 0;
virtual bool IsBetterThan(const RendererImpl* other) const = 0; virtual bool IsBetterThan(const RendererImpl* other) const = 0;
virtual RenderAPI QueryAPI() const = 0; virtual RenderAPI QueryAPI() const = 0;

View File

@ -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 Nazara Engine - Vulkan
@ -30,8 +30,6 @@
#define NAZARA_GLOBAL_VULKANRENDERER_HPP #define NAZARA_GLOBAL_VULKANRENDERER_HPP
#include <Nazara/VulkanRenderer/Config.hpp> #include <Nazara/VulkanRenderer/Config.hpp>
#include <Nazara/VulkanRenderer/RenderTarget.hpp>
#include <Nazara/VulkanRenderer/RenderWindow.hpp>
#include <Nazara/VulkanRenderer/VkBuffer.hpp> #include <Nazara/VulkanRenderer/VkBuffer.hpp>
#include <Nazara/VulkanRenderer/VkCommandBuffer.hpp> #include <Nazara/VulkanRenderer/VkCommandBuffer.hpp>
#include <Nazara/VulkanRenderer/VkCommandPool.hpp> #include <Nazara/VulkanRenderer/VkCommandPool.hpp>
@ -52,10 +50,13 @@
#include <Nazara/VulkanRenderer/VkPipelineLayout.hpp> #include <Nazara/VulkanRenderer/VkPipelineLayout.hpp>
#include <Nazara/VulkanRenderer/VkQueue.hpp> #include <Nazara/VulkanRenderer/VkQueue.hpp>
#include <Nazara/VulkanRenderer/VkRenderPass.hpp> #include <Nazara/VulkanRenderer/VkRenderPass.hpp>
#include <Nazara/VulkanRenderer/VkRenderTarget.hpp>
#include <Nazara/VulkanRenderer/VkRenderWindow.hpp>
#include <Nazara/VulkanRenderer/VkSemaphore.hpp> #include <Nazara/VulkanRenderer/VkSemaphore.hpp>
#include <Nazara/VulkanRenderer/VkShaderModule.hpp> #include <Nazara/VulkanRenderer/VkShaderModule.hpp>
#include <Nazara/VulkanRenderer/VkSurface.hpp> #include <Nazara/VulkanRenderer/VkSurface.hpp>
#include <Nazara/VulkanRenderer/VkSwapchain.hpp> #include <Nazara/VulkanRenderer/VkSwapchain.hpp>
#include <Nazara/VulkanRenderer/Vulkan.hpp> #include <Nazara/VulkanRenderer/Vulkan.hpp>
#include <Nazara/VulkanRenderer/VulkanRenderer.hpp>
#endif // NAZARA_GLOBAL_VULKANRENDERER_HPP #endif // NAZARA_GLOBAL_VULKANRENDERER_HPP

View File

@ -4,8 +4,8 @@
#pragma once #pragma once
#ifndef NAZARA_RENDERTARGET_HPP #ifndef NAZARA_VULKANRENDERER_RENDERTARGET_HPP
#define NAZARA_RENDERTARGET_HPP #define NAZARA_VULKANRENDERER_RENDERTARGET_HPP
#include <Nazara/Prerequesites.hpp> #include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Signal.hpp> #include <Nazara/Core/Signal.hpp>
@ -18,17 +18,13 @@
namespace Nz namespace Nz
{ {
class Renderer; class NAZARA_VULKANRENDERER_API VkRenderTarget
class NAZARA_VULKANRENDERER_API RenderTarget
{ {
friend Renderer;
public: public:
RenderTarget() = default; VkRenderTarget() = default;
RenderTarget(const RenderTarget&) = delete; VkRenderTarget(const VkRenderTarget&) = delete;
RenderTarget(RenderTarget&&) = delete; ///TOOD? VkRenderTarget(VkRenderTarget&&) = delete; ///TOOD?
virtual ~RenderTarget(); virtual ~VkRenderTarget();
virtual bool Acquire(UInt32* imageIndex) const = 0; virtual bool Acquire(UInt32* imageIndex) const = 0;
@ -44,12 +40,12 @@ namespace Nz
virtual void Present(UInt32 imageIndex) = 0; virtual void Present(UInt32 imageIndex) = 0;
RenderTarget& operator=(const RenderTarget&) = delete; VkRenderTarget& operator=(const VkRenderTarget&) = delete;
RenderTarget& operator=(RenderTarget&&) = delete; ///TOOD? VkRenderTarget& operator=(VkRenderTarget&&) = delete; ///TOOD?
// Signals: // Signals:
NazaraSignal(OnRenderTargetRelease, const RenderTarget* /*renderTarget*/); NazaraSignal(OnRenderTargetRelease, const VkRenderTarget* /*renderTarget*/);
NazaraSignal(OnRenderTargetSizeChange, const RenderTarget* /*renderTarget*/); NazaraSignal(OnRenderTargetSizeChange, const VkRenderTarget* /*renderTarget*/);
protected: protected:
Vk::RenderPass m_renderPass; Vk::RenderPass m_renderPass;
@ -57,4 +53,4 @@ namespace Nz
}; };
} }
#endif // NAZARA_RENDERTARGET_HPP #endif // NAZARA_VULKANRENDERER_RENDERTARGET_HPP

View File

@ -4,78 +4,65 @@
#pragma once #pragma once
#ifndef NAZARA_RENDERWINDOW_HPP #ifndef NAZARA_VULKANRENDERER_RENDERWINDOW_HPP
#define NAZARA_RENDERWINDOW_HPP #define NAZARA_VULKANRENDERER_RENDERWINDOW_HPP
#include <Nazara/Prerequesites.hpp> #include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Clock.hpp> #include <Nazara/Core/Clock.hpp>
#include <Nazara/Math/Rect.hpp> #include <Nazara/Math/Rect.hpp>
#include <Nazara/Math/Vector3.hpp> #include <Nazara/Math/Vector3.hpp>
#include <Nazara/Renderer/RenderWindowImpl.hpp>
#include <Nazara/VulkanRenderer/Config.hpp> #include <Nazara/VulkanRenderer/Config.hpp>
#include <Nazara/VulkanRenderer/RenderTarget.hpp>
#include <Nazara/VulkanRenderer/VkCommandBuffer.hpp> #include <Nazara/VulkanRenderer/VkCommandBuffer.hpp>
#include <Nazara/VulkanRenderer/VkCommandPool.hpp> #include <Nazara/VulkanRenderer/VkCommandPool.hpp>
#include <Nazara/VulkanRenderer/VkDevice.hpp> #include <Nazara/VulkanRenderer/VkDevice.hpp>
#include <Nazara/VulkanRenderer/VkDeviceMemory.hpp> #include <Nazara/VulkanRenderer/VkDeviceMemory.hpp>
#include <Nazara/VulkanRenderer/VkFramebuffer.hpp> #include <Nazara/VulkanRenderer/VkFramebuffer.hpp>
#include <Nazara/VulkanRenderer/VkImage.hpp> #include <Nazara/VulkanRenderer/VkImage.hpp>
#include <Nazara/VulkanRenderer/VkRenderTarget.hpp>
#include <Nazara/VulkanRenderer/VkSurface.hpp> #include <Nazara/VulkanRenderer/VkSurface.hpp>
#include <Nazara/VulkanRenderer/VkSwapchain.hpp> #include <Nazara/VulkanRenderer/VkSwapchain.hpp>
#include <Nazara/Utility/Window.hpp>
#include <vector> #include <vector>
namespace Nz namespace Nz
{ {
class NAZARA_VULKANRENDERER_API RenderWindow : public RenderTarget, public Window class NAZARA_VULKANRENDERER_API VkRenderWindow : public VkRenderTarget, public RenderWindowImpl
{ {
public: public:
RenderWindow(); VkRenderWindow();
RenderWindow(VideoMode mode, const String& title, UInt32 style = WindowStyle_Default); VkRenderWindow(const VkRenderWindow&) = delete;
RenderWindow(WindowHandle handle); VkRenderWindow(VkRenderWindow&&) = delete; ///TODO
RenderWindow(const RenderWindow&) = delete; virtual ~VkRenderWindow();
RenderWindow(RenderWindow&&) = delete; ///TODO
virtual ~RenderWindow();
bool Acquire(UInt32* index) const override; bool Acquire(UInt32* index) const override;
void BuildPreRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) override; void BuildPreRenderCommands(UInt32 imageIndex, Vk::CommandBuffer& commandBuffer) override;
void BuildPostRenderCommands(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, const Vector2ui& size, const RenderWindowParameters& parameters) override;
bool Create(WindowHandle handle);
const Vk::Framebuffer& GetFrameBuffer(UInt32 imageIndex) const override; inline const Vk::Framebuffer& GetFrameBuffer(UInt32 imageIndex) const override;
UInt32 GetFramebufferCount() const; inline UInt32 GetFramebufferCount() const;
const Vk::DeviceHandle& GetDevice() const; inline const Vk::DeviceHandle& GetDevice() const;
UInt32 GetPresentableFamilyQueue() const; inline UInt32 GetPresentableFamilyQueue() const;
const Vk::Surface& GetSurface() const; inline const Vk::Surface& GetSurface() const;
const Vk::Swapchain& GetSwapchain() const; inline const Vk::Swapchain& GetSwapchain() const;
void Present(UInt32 imageIndex) override; void Present(UInt32 imageIndex) override;
bool IsValid() const; VkRenderWindow& operator=(const VkRenderWindow&) = delete;
VkRenderWindow& operator=(VkRenderWindow&&) = delete; ///TODO
void SetDepthStencilFormats(std::vector<PixelFormatType> pixelFormat);
void SetPhysicalDevice(VkPhysicalDevice device);
RenderWindow& operator=(const RenderWindow&) = delete;
RenderWindow& operator=(RenderWindow&&) = delete; ///TODO
private: private:
bool OnWindowCreated() override; bool SetupDepthBuffer(const Vector2ui& size);
void OnWindowDestroy() override; bool SetupRenderPass(const Vector2ui& size);
void OnWindowResized() override; bool SetupSwapchain(const Vector2ui& size);
bool SetupDepthBuffer();
bool SetupRenderPass();
bool SetupSwapchain();
Clock m_clock; Clock m_clock;
VkColorSpaceKHR m_colorSpace; VkColorSpaceKHR m_colorSpace;
VkFormat m_colorFormat; VkFormat m_colorFormat;
VkFormat m_depthStencilFormat; VkFormat m_depthStencilFormat;
VkPhysicalDevice m_forcedPhysicalDevice; VkPhysicalDevice m_physicalDevice;
std::vector<PixelFormatType> m_wantedDepthStencilFormats;
std::vector<Vk::Framebuffer> m_frameBuffers; std::vector<Vk::Framebuffer> m_frameBuffers;
Vk::DeviceHandle m_device; Vk::DeviceHandle m_device;
Vk::DeviceMemory m_depthBufferMemory; Vk::DeviceMemory m_depthBufferMemory;
@ -88,4 +75,6 @@ namespace Nz
}; };
} }
#endif // NAZARA_RENDERWINDOW_HPP #include <Nazara/VulkanRenderer/VkRenderWindow.inl>
#endif // NAZARA_VULKANRENDERER_RENDERWINDOW_HPP

View File

@ -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 <Nazara/VulkanRenderer/VkRenderWindow.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp>
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<UInt32>(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 <Nazara/VulkanRenderer/DebugOff.hpp>

View File

@ -21,6 +21,8 @@ namespace Nz
VulkanRenderer() = default; VulkanRenderer() = default;
~VulkanRenderer() = default; ~VulkanRenderer() = default;
std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl() override;
bool IsBetterThan(const RendererImpl* other) const override; bool IsBetterThan(const RendererImpl* other) const override;
RenderAPI QueryAPI() const override; RenderAPI QueryAPI() const override;

View File

@ -1,138 +1,21 @@
// Copyright (C) 2015 Jérôme Leclercq // Copyright (C) 2015 Jérôme Leclercq
// This file is part of the "Nazara Engine - Renderer module" // This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
/*
#include <Nazara/Renderer/RenderWindow.hpp> #include <Nazara/Renderer/RenderWindow.hpp>
#include <Nazara/Core/Error.hpp> #include <Nazara/Core/Error.hpp>
#include <Nazara/Core/ErrorFlags.hpp>
#include <Nazara/Core/Thread.hpp> #include <Nazara/Core/Thread.hpp>
#include <Nazara/Renderer/Context.hpp>
#include <Nazara/Renderer/OpenGL.hpp>
#include <Nazara/Renderer/Renderer.hpp> #include <Nazara/Renderer/Renderer.hpp>
#include <Nazara/Renderer/Texture.hpp>
#include <stdexcept>
#include <Nazara/Renderer/Debug.hpp> #include <Nazara/Renderer/Debug.hpp>
namespace Nz 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() RenderWindow::~RenderWindow()
{ {
// Nécessaire si Window::Destroy est appelé par son destructeur // Nécessaire si Window::Destroy est appelé par son destructeur
OnWindowDestroy(); 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() void RenderWindow::Display()
{ {
if (m_framerateLimit > 0) if (m_framerateLimit > 0)
@ -143,129 +26,23 @@ namespace Nz
m_clock.Restart(); m_clock.Restart();
} }
if (m_context && m_parameters.doubleBuffered)
m_context->SwapBuffers();
} }
void RenderWindow::EnableVerticalSync(bool enabled) void RenderWindow::EnableVerticalSync(bool enabled)
{ {
if (m_context) ///TODO
{
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
} }
bool RenderWindow::OnWindowCreated() bool RenderWindow::OnWindowCreated()
{ {
m_parameters.doubleBuffered = true; auto impl = Renderer::GetRendererImpl()->CreateRenderWindowImpl();
m_parameters.window = GetHandle(); if (!impl->Create(GetHandle(), Vector2ui(GetWidth(), GetHeight()), m_parameters))
std::unique_ptr<Context> context(new Context);
if (!context->Create(m_parameters))
{ {
NazaraError("Failed to create context"); NazaraError("Failed to create render window implementation: " + Error::GetLastError());
return false; return false;
} }
m_context = context.release(); m_impl = std::move(impl);
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_clock.Restart(); m_clock.Restart();
@ -274,19 +51,10 @@ namespace Nz
void RenderWindow::OnWindowDestroy() void RenderWindow::OnWindowDestroy()
{ {
if (m_context) m_impl.reset();
{
if (IsActive())
Renderer::SetTarget(nullptr);
delete m_context;
m_context = nullptr;
}
} }
void RenderWindow::OnWindowResized() void RenderWindow::OnWindowResized()
{ {
OnRenderTargetSizeChange(this);
} }
} }
*/

View File

@ -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 <Nazara/Renderer/RenderWindowImpl.hpp>
#include <Nazara/Renderer/Debug.hpp>
namespace Nz
{
RenderWindowImpl::~RenderWindowImpl() = default;
}

View File

@ -2,12 +2,12 @@
// This file is part of the "Nazara Engine - Vulkan Renderer" // This file is part of the "Nazara Engine - Vulkan Renderer"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/VulkanRenderer/RenderTarget.hpp> #include <Nazara/VulkanRenderer/VkRenderTarget.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp> #include <Nazara/VulkanRenderer/Debug.hpp>
namespace Nz namespace Nz
{ {
RenderTarget::~RenderTarget() VkRenderTarget::~VkRenderTarget()
{ {
OnRenderTargetRelease(this); OnRenderTargetRelease(this);
} }

View File

@ -2,7 +2,7 @@
// This file is part of the "Nazara Engine - Renderer module" // This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/VulkanRenderer/RenderWindow.hpp> #include <Nazara/VulkanRenderer/VkRenderWindow.hpp>
#include <Nazara/Core/Error.hpp> #include <Nazara/Core/Error.hpp>
#include <Nazara/Core/ErrorFlags.hpp> #include <Nazara/Core/ErrorFlags.hpp>
#include <Nazara/Utility/PixelFormat.hpp> #include <Nazara/Utility/PixelFormat.hpp>
@ -13,35 +13,24 @@
namespace Nz namespace Nz
{ {
RenderWindow::RenderWindow() : VkRenderWindow::VkRenderWindow() :
RenderTarget(), Window(),
m_surface(Nz::Vulkan::GetInstance()), m_surface(Nz::Vulkan::GetInstance()),
m_forcedPhysicalDevice(nullptr), m_physicalDevice(nullptr),
m_depthStencilFormat(VK_FORMAT_MAX_ENUM) m_depthStencilFormat(VK_FORMAT_MAX_ENUM)
{ {
} }
RenderWindow::RenderWindow(VideoMode mode, const String& title, UInt32 style) : VkRenderWindow::~VkRenderWindow()
RenderWindow()
{ {
ErrorFlags flags(ErrorFlag_ThrowException, true); m_device->WaitForIdle();
Create(mode, title, style); m_frameBuffers.clear();
m_renderPass.Destroy();
m_swapchain.Destroy();
m_surface.Destroy();
} }
RenderWindow::RenderWindow(WindowHandle handle) : bool VkRenderWindow::Acquire(UInt32* imageIndex) const
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
{ {
if (!m_swapchain.AcquireNextImage(std::numeric_limits<UInt64>::max(), m_imageReadySemaphore, VK_NULL_HANDLE, imageIndex)) if (!m_swapchain.AcquireNextImage(std::numeric_limits<UInt64>::max(), m_imageReadySemaphore, VK_NULL_HANDLE, imageIndex))
{ {
@ -52,7 +41,7 @@ namespace Nz
return true; 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); //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); //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<UInt32>(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<PixelFormatType> pixelFormat)
{
m_wantedDepthStencilFormats = std::move(pixelFormat);
}
void RenderWindow::SetPhysicalDevice(VkPhysicalDevice device)
{
m_forcedPhysicalDevice = device;
}
bool RenderWindow::OnWindowCreated()
{
OnRenderTargetSizeChange(this);
#if defined(NAZARA_PLATFORM_WINDOWS) #if defined(NAZARA_PLATFORM_WINDOWS)
HWND handle = reinterpret_cast<HWND>(GetHandle()); HWND winHandle = reinterpret_cast<HWND>(handle);
HINSTANCE instance = reinterpret_cast<HINSTANCE>(GetWindowLongPtrW(handle, GWLP_HINSTANCE)); HINSTANCE instance = reinterpret_cast<HINSTANCE>(GetWindowLongPtrW(winHandle, GWLP_HINSTANCE));
bool success = m_surface.Create(instance, handle); bool success = m_surface.Create(instance, winHandle);
#else #else
#error This OS is not supported by Vulkan #error This OS is not supported by Vulkan
#endif #endif
if (!success) if (!success)
@ -156,7 +81,9 @@ namespace Nz
return false; 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) if (!m_device)
{ {
NazaraError("Failed to get compatible Vulkan device"); NazaraError("Failed to get compatible Vulkan device");
@ -166,7 +93,7 @@ namespace Nz
m_presentQueue = m_device->GetQueue(m_presentableFamilyQueue, 0); m_presentQueue = m_device->GetQueue(m_presentableFamilyQueue, 0);
std::vector<VkSurfaceFormatKHR> surfaceFormats; std::vector<VkSurfaceFormatKHR> surfaceFormats;
if (!m_surface.GetFormats(m_forcedPhysicalDevice, &surfaceFormats)) if (!m_surface.GetFormats(m_physicalDevice, &surfaceFormats))
{ {
NazaraError("Failed to query supported surface formats"); NazaraError("Failed to query supported surface formats");
return false; return false;
@ -179,11 +106,11 @@ namespace Nz
m_colorSpace = surfaceFormats[0].colorSpace; 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) switch (format)
{ {
@ -223,7 +150,7 @@ namespace Nz
if (m_depthStencilFormat != VK_FORMAT_MAX_ENUM) 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) if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
break; //< Found it break; //< Found it
@ -232,19 +159,19 @@ namespace Nz
} }
} }
if (!SetupSwapchain()) if (!SetupSwapchain(size))
{ {
NazaraError("Failed to create swapchain"); NazaraError("Failed to create swapchain");
return false; 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"); NazaraError("Failed to create depth buffer");
return false; return false;
} }
if (!SetupRenderPass()) if (!SetupRenderPass(size))
{ {
NazaraError("Failed to create render pass"); NazaraError("Failed to create render pass");
return false; return false;
@ -265,8 +192,8 @@ namespace Nz
m_renderPass, // VkRenderPass renderPass; m_renderPass, // VkRenderPass renderPass;
(attachments[1] != VK_NULL_HANDLE) ? 2U : 1U, // uint32_t attachmentCount; (attachments[1] != VK_NULL_HANDLE) ? 2U : 1U, // uint32_t attachmentCount;
attachments.data(), // const VkImageView* pAttachments; attachments.data(), // const VkImageView* pAttachments;
GetWidth(), // uint32_t width; size.x, // uint32_t width;
GetHeight(), // uint32_t height; size.y, // uint32_t height;
1U // uint32_t layers; 1U // uint32_t layers;
}; };
@ -284,22 +211,7 @@ namespace Nz
return true; return true;
} }
void RenderWindow::OnWindowDestroy() bool VkRenderWindow::SetupDepthBuffer(const Vector2ui& size)
{
m_device->WaitForIdle();
m_frameBuffers.clear();
m_renderPass.Destroy();
m_swapchain.Destroy();
m_surface.Destroy();
}
void RenderWindow::OnWindowResized()
{
OnRenderTargetSizeChange(this);
}
bool RenderWindow::SetupDepthBuffer()
{ {
VkImageCreateInfo imageCreateInfo = { VkImageCreateInfo imageCreateInfo = {
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
@ -307,7 +219,7 @@ namespace Nz
0U, // VkImageCreateFlags flags; 0U, // VkImageCreateFlags flags;
VK_IMAGE_TYPE_2D, // VkImageType imageType; VK_IMAGE_TYPE_2D, // VkImageType imageType;
m_depthStencilFormat, // VkFormat format; m_depthStencilFormat, // VkFormat format;
{GetWidth(), GetHeight(), 1U}, // VkExtent3D extent; {size.x, size.y, 1U}, // VkExtent3D extent;
1U, // uint32_t mipLevels; 1U, // uint32_t mipLevels;
1U, // uint32_t arrayLayers; 1U, // uint32_t arrayLayers;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
@ -369,7 +281,7 @@ namespace Nz
return true; return true;
} }
bool RenderWindow::SetupRenderPass() bool VkRenderWindow::SetupRenderPass(const Vector2ui& size)
{ {
std::array<VkAttachmentDescription, 2> attachments = { std::array<VkAttachmentDescription, 2> attachments = {
{ {
@ -424,8 +336,8 @@ namespace Nz
std::array<VkSubpassDependency, 2> dependencies; std::array<VkSubpassDependency, 2> dependencies;
// First dependency at the start of the renderpass // First dependency at the start of the renderpass
// Does the transition from final to initial layout // Does the transition from final to initial layout
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; // Producer of the dependency 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].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].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
@ -434,8 +346,8 @@ namespace Nz
// Second dependency at the end the renderpass // Second dependency at the end the renderpass
// Does the transition from the initial to the final layout // Does the transition from the initial to the final layout
dependencies[1].srcSubpass = 0; // Producer of the dependency is our single subpass 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].dstSubpass = VK_SUBPASS_EXTERNAL; // Consumer are all commands outside of the renderpass
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_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; 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; attachments.data(), // const VkAttachmentDescription* pAttachments;
1U, // uint32_t subpassCount; 1U, // uint32_t subpassCount;
&subpass, // const VkSubpassDescription* pSubpasses; &subpass, // const VkSubpassDescription* pSubpasses;
dependencies.size(), // uint32_t dependencyCount; UInt32(dependencies.size()), // uint32_t dependencyCount;
dependencies.data() // const VkSubpassDependency* pDependencies; dependencies.data() // const VkSubpassDependency* pDependencies;
}; };
return m_renderPass.Create(m_device, createInfo); return m_renderPass.Create(m_device, createInfo);
} }
bool RenderWindow::SetupSwapchain() bool VkRenderWindow::SetupSwapchain(const Vector2ui& size)
{ {
VkSurfaceCapabilitiesKHR surfaceCapabilities; VkSurfaceCapabilitiesKHR surfaceCapabilities;
if (!m_surface.GetCapabilities(m_forcedPhysicalDevice, &surfaceCapabilities)) if (!m_surface.GetCapabilities(m_physicalDevice, &surfaceCapabilities))
{ {
NazaraError("Failed to query surface capabilities"); NazaraError("Failed to query surface capabilities");
return false; return false;
@ -473,14 +385,14 @@ namespace Nz
VkExtent2D extent; VkExtent2D extent;
if (surfaceCapabilities.currentExtent.width == -1) if (surfaceCapabilities.currentExtent.width == -1)
{ {
extent.width = Nz::Clamp<Nz::UInt32>(GetWidth(), surfaceCapabilities.minImageExtent.width, surfaceCapabilities.maxImageExtent.width); extent.width = Nz::Clamp<Nz::UInt32>(size.x, surfaceCapabilities.minImageExtent.width, surfaceCapabilities.maxImageExtent.width);
extent.height = Nz::Clamp<Nz::UInt32>(GetHeight(), surfaceCapabilities.minImageExtent.height, surfaceCapabilities.maxImageExtent.height); extent.height = Nz::Clamp<Nz::UInt32>(size.y, surfaceCapabilities.minImageExtent.height, surfaceCapabilities.maxImageExtent.height);
} }
else else
extent = surfaceCapabilities.currentExtent; extent = surfaceCapabilities.currentExtent;
std::vector<VkPresentModeKHR> presentModes; std::vector<VkPresentModeKHR> presentModes;
if (!m_surface.GetPresentModes(m_forcedPhysicalDevice, &presentModes)) if (!m_surface.GetPresentModes(m_physicalDevice, &presentModes))
{ {
NazaraError("Failed to query supported present modes"); NazaraError("Failed to query supported present modes");
return false; return false;

View File

@ -4,10 +4,16 @@
#include <Nazara/VulkanRenderer/VulkanRenderer.hpp> #include <Nazara/VulkanRenderer/VulkanRenderer.hpp>
#include <Nazara/VulkanRenderer/VkLoader.hpp> #include <Nazara/VulkanRenderer/VkLoader.hpp>
#include <Nazara/VulkanRenderer/VkRenderWindow.hpp>
#include <Nazara/VulkanRenderer/Debug.hpp> #include <Nazara/VulkanRenderer/Debug.hpp>
namespace Nz namespace Nz
{ {
std::unique_ptr<RenderWindowImpl> VulkanRenderer::CreateRenderWindowImpl()
{
return std::make_unique<VkRenderWindow>();
}
bool VulkanRenderer::IsBetterThan(const RendererImpl* other) const bool VulkanRenderer::IsBetterThan(const RendererImpl* other) const
{ {
if (other->QueryAPI() == RenderAPI_Vulkan && QueryAPIVersion() < other->QueryAPIVersion()) if (other->QueryAPI() == RenderAPI_Vulkan && QueryAPIVersion() < other->QueryAPIVersion())