Replace RenderWindow with swapchains
This commit is contained in:
committed by
Jérôme Leclercq
parent
8db1c04568
commit
18851c9185
@@ -17,6 +17,8 @@
|
||||
#include <Nazara/Renderer/RenderPass.hpp>
|
||||
#include <Nazara/Renderer/RenderPipeline.hpp>
|
||||
#include <Nazara/Renderer/RenderPipelineLayout.hpp>
|
||||
#include <Nazara/Renderer/Swapchain.hpp>
|
||||
#include <Nazara/Renderer/SwapchainParameters.hpp>
|
||||
#include <Nazara/Renderer/Texture.hpp>
|
||||
#include <Nazara/Renderer/TextureSampler.hpp>
|
||||
#include <Nazara/Utility/PixelFormat.hpp>
|
||||
@@ -49,6 +51,7 @@ namespace Nz
|
||||
virtual std::shared_ptr<ShaderModule> InstantiateShaderModule(nzsl::ShaderStageTypeFlags shaderStages, const nzsl::Ast::Module& shaderModule, const nzsl::ShaderWriter::States& states) = 0;
|
||||
virtual std::shared_ptr<ShaderModule> InstantiateShaderModule(nzsl::ShaderStageTypeFlags shaderStages, ShaderLanguage lang, const void* source, std::size_t sourceSize, const nzsl::ShaderWriter::States& states) = 0;
|
||||
std::shared_ptr<ShaderModule> InstantiateShaderModule(nzsl::ShaderStageTypeFlags shaderStages, ShaderLanguage lang, const std::filesystem::path& sourcePath, const nzsl::ShaderWriter::States& states);
|
||||
virtual std::shared_ptr<Swapchain> InstantiateSwapchain(WindowHandle windowHandle, const Vector2ui& windowSize, const SwapchainParameters& parameters) = 0;
|
||||
virtual std::shared_ptr<Texture> InstantiateTexture(const TextureInfo& params) = 0;
|
||||
virtual std::shared_ptr<TextureSampler> InstantiateTextureSampler(const TextureSamplerInfo& params) = 0;
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// 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_RENDERER_RENDERSURFACE_HPP
|
||||
#define NAZARA_RENDERER_RENDERSURFACE_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Platform/WindowHandle.hpp>
|
||||
#include <Nazara/Renderer/Config.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
///TODO: Rename
|
||||
class NAZARA_RENDERER_API RenderSurface
|
||||
{
|
||||
public:
|
||||
RenderSurface() = default;
|
||||
virtual ~RenderSurface();
|
||||
|
||||
virtual bool Create(WindowHandle handle) = 0;
|
||||
virtual void Destroy() = 0;
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/RenderSurface.inl>
|
||||
|
||||
#endif // NAZARA_RENDERER_RENDERSURFACE_HPP
|
||||
@@ -1,12 +0,0 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// 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/RenderSurface.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/DebugOff.hpp>
|
||||
@@ -1,67 +0,0 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// 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_RENDERER_RENDERWINDOW_HPP
|
||||
#define NAZARA_RENDERER_RENDERWINDOW_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Core/Clock.hpp>
|
||||
#include <Nazara/Math/Rect.hpp>
|
||||
#include <Nazara/Math/Vector3.hpp>
|
||||
#include <Nazara/Platform/Window.hpp>
|
||||
#include <Nazara/Renderer/RenderSurface.hpp>
|
||||
#include <Nazara/Renderer/RenderWindowImpl.hpp>
|
||||
#include <Nazara/Renderer/RenderWindowParameters.hpp>
|
||||
#include <memory>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class RenderDevice;
|
||||
|
||||
class NAZARA_RENDERER_API RenderWindow : public Window
|
||||
{
|
||||
public:
|
||||
inline RenderWindow();
|
||||
inline RenderWindow(std::shared_ptr<RenderDevice> renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters());
|
||||
inline RenderWindow(std::shared_ptr<RenderDevice> renderDevice, void* handle, const RenderWindowParameters& parameters = RenderWindowParameters());
|
||||
inline ~RenderWindow();
|
||||
|
||||
RenderFrame AcquireFrame();
|
||||
|
||||
bool Create(std::shared_ptr<RenderDevice> renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style = WindowStyle_Default, const RenderWindowParameters& parameters = RenderWindowParameters());
|
||||
bool Create(std::shared_ptr<RenderDevice> renderDevice, void* handle, const RenderWindowParameters ¶meters = RenderWindowParameters());
|
||||
|
||||
void EnableVerticalSync(bool enabled);
|
||||
|
||||
inline const std::shared_ptr<RenderDevice>& GetRenderDevice() const;
|
||||
inline const RenderTarget* GetRenderTarget() const;
|
||||
inline RenderSurface* GetSurface();
|
||||
|
||||
inline bool IsValid() const;
|
||||
|
||||
inline void SetFramerateLimit(unsigned int limit);
|
||||
|
||||
RenderWindow &operator=(const RenderWindow &) = delete;
|
||||
RenderWindow &operator=(RenderWindow &&) = delete; ///TODO
|
||||
|
||||
protected:
|
||||
bool OnWindowCreated() override;
|
||||
void OnWindowDestroy() override;
|
||||
void OnWindowResized() override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<RenderDevice> m_renderDevice;
|
||||
std::unique_ptr<RenderSurface> m_surface;
|
||||
std::unique_ptr<RenderWindowImpl> m_impl;
|
||||
MillisecondClock m_clock;
|
||||
RenderWindowParameters m_parameters;
|
||||
unsigned int m_framerateLimit;
|
||||
};
|
||||
} // namespace Nz
|
||||
|
||||
#include <Nazara/Renderer/RenderWindow.inl>
|
||||
|
||||
#endif // NAZARA_RENDERER_RENDERWINDOW_HPP
|
||||
@@ -1,62 +0,0 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// 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/RenderWindow.hpp>
|
||||
#include <Nazara/Core/ErrorFlags.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline RenderWindow::RenderWindow() :
|
||||
m_framerateLimit(0U)
|
||||
{
|
||||
}
|
||||
|
||||
inline RenderWindow::RenderWindow(std::shared_ptr<RenderDevice> renderDevice, VideoMode mode, const std::string& title, WindowStyleFlags style, const RenderWindowParameters& parameters) :
|
||||
RenderWindow()
|
||||
{
|
||||
ErrorFlags errFlags(ErrorMode::ThrowException, true);
|
||||
|
||||
Create(std::move(renderDevice), mode, title, style, parameters);
|
||||
}
|
||||
|
||||
inline RenderWindow::RenderWindow(std::shared_ptr<RenderDevice> renderDevice, void* handle, const RenderWindowParameters& parameters)
|
||||
{
|
||||
ErrorFlags errFlags(ErrorMode::ThrowException, true);
|
||||
|
||||
Create(std::move(renderDevice), handle, parameters);
|
||||
}
|
||||
|
||||
inline RenderWindow::~RenderWindow()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
inline const std::shared_ptr<RenderDevice>& RenderWindow::GetRenderDevice() const
|
||||
{
|
||||
return m_renderDevice;
|
||||
}
|
||||
|
||||
inline const RenderTarget* RenderWindow::GetRenderTarget() const
|
||||
{
|
||||
return m_impl.get();
|
||||
}
|
||||
|
||||
inline RenderSurface* RenderWindow::GetSurface()
|
||||
{
|
||||
return m_surface.get();
|
||||
}
|
||||
|
||||
inline bool RenderWindow::IsValid() const
|
||||
{
|
||||
return m_impl != nullptr;
|
||||
}
|
||||
|
||||
inline void RenderWindow::SetFramerateLimit(unsigned int limit)
|
||||
{
|
||||
m_framerateLimit = limit;
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/DebugOff.hpp>
|
||||
@@ -23,8 +23,8 @@ namespace Nz
|
||||
class RendererImpl;
|
||||
class RenderDevice;
|
||||
class RenderSurface;
|
||||
class RenderWindow;
|
||||
class RenderWindowImpl;
|
||||
class WindowSwapchain;
|
||||
class Swapchain;
|
||||
|
||||
using CreateRendererImplFunc = RendererImpl*(*)();
|
||||
|
||||
@@ -34,9 +34,6 @@ namespace Nz
|
||||
RendererImpl() = default;
|
||||
virtual ~RendererImpl();
|
||||
|
||||
virtual std::unique_ptr<RenderSurface> CreateRenderSurfaceImpl() = 0;
|
||||
virtual std::unique_ptr<RenderWindowImpl> CreateRenderWindowImpl(RenderWindow& owner) = 0;
|
||||
|
||||
virtual std::shared_ptr<RenderDevice> InstanciateRenderDevice(std::size_t deviceIndex, const RenderDeviceFeatures& enabledFeatures) = 0;
|
||||
|
||||
virtual RenderAPI QueryAPI() const = 0;
|
||||
|
||||
@@ -4,41 +4,38 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_RENDERER_RENDERWINDOWIMPL_HPP
|
||||
#define NAZARA_RENDERER_RENDERWINDOWIMPL_HPP
|
||||
#ifndef NAZARA_RENDERER_SWAPCHAIN_HPP
|
||||
#define NAZARA_RENDERER_SWAPCHAIN_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Math/Vector2.hpp>
|
||||
#include <Nazara/Platform/WindowHandle.hpp>
|
||||
#include <Nazara/Renderer/Config.hpp>
|
||||
#include <Nazara/Renderer/RenderDevice.hpp>
|
||||
#include <Nazara/Renderer/RenderFrame.hpp>
|
||||
#include <Nazara/Renderer/RenderPass.hpp>
|
||||
#include <Nazara/Renderer/RenderTarget.hpp>
|
||||
#include <Nazara/Renderer/RenderWindowParameters.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class CommandPool;
|
||||
class RendererImpl;
|
||||
class RenderDevice;
|
||||
class RenderSurface;
|
||||
|
||||
class NAZARA_RENDERER_API RenderWindowImpl : public RenderTarget
|
||||
class NAZARA_RENDERER_API Swapchain : public RenderTarget
|
||||
{
|
||||
public:
|
||||
RenderWindowImpl() = default;
|
||||
virtual ~RenderWindowImpl();
|
||||
Swapchain() = default;
|
||||
virtual ~Swapchain();
|
||||
|
||||
virtual RenderFrame Acquire() = 0;
|
||||
virtual RenderFrame AcquireFrame() = 0;
|
||||
|
||||
virtual bool Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters) = 0;
|
||||
virtual std::shared_ptr<CommandPool> CreateCommandPool(QueueType queueType) = 0;
|
||||
|
||||
virtual void NotifyResize(const Vector2ui& newSize) = 0;
|
||||
|
||||
protected:
|
||||
static void BuildRenderPass(PixelFormat colorFormat, PixelFormat depthFormat, std::vector<RenderPass::Attachment>& attachments, std::vector<RenderPass::SubpassDescription>& subpassDescriptions, std::vector<RenderPass::SubpassDependency>& subpassDependencies);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_RENDERER_RENDERWINDOWIMPL_HPP
|
||||
#endif // NAZARA_RENDERER_SWAPCHAIN_HPP
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
struct RenderWindowParameters
|
||||
struct SwapchainParameters
|
||||
{
|
||||
std::vector<PixelFormat> depthFormats = {Nz::PixelFormat::Depth24Stencil8, Nz::PixelFormat::Depth32FStencil8, Nz::PixelFormat::Depth16Stencil8, Nz::PixelFormat::Depth32F, Nz::PixelFormat::Depth24}; //< By order of preference
|
||||
bool verticalSync = false;
|
||||
65
include/Nazara/Renderer/WindowSwapchain.hpp
Normal file
65
include/Nazara/Renderer/WindowSwapchain.hpp
Normal file
@@ -0,0 +1,65 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// 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_RENDERER_RENDERWINDOW_HPP
|
||||
#define NAZARA_RENDERER_RENDERWINDOW_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Platform/WindowEventHandler.hpp>
|
||||
#include <Nazara/Renderer/Swapchain.hpp>
|
||||
#include <Nazara/Renderer/SwapchainParameters.hpp>
|
||||
#include <memory>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class RenderDevice;
|
||||
class Window;
|
||||
|
||||
class NAZARA_RENDERER_API WindowSwapchain
|
||||
{
|
||||
public:
|
||||
WindowSwapchain(std::shared_ptr<RenderDevice> renderDevice, Window& window, SwapchainParameters parameters = SwapchainParameters());
|
||||
WindowSwapchain(const WindowSwapchain&) = delete;
|
||||
inline WindowSwapchain(WindowSwapchain&& windowSwapchain) noexcept;
|
||||
~WindowSwapchain() = default;
|
||||
|
||||
inline RenderFrame AcquireFrame();
|
||||
|
||||
inline bool DoesRenderOnlyIfFocused() const;
|
||||
|
||||
inline void EnableRenderOnlyIfFocused(bool enable = true);
|
||||
|
||||
inline Swapchain& GetSwapchain();
|
||||
inline const Swapchain& GetSwapchain() const;
|
||||
|
||||
WindowSwapchain& operator=(const WindowSwapchain&) = default;
|
||||
inline WindowSwapchain& operator=(WindowSwapchain&& windowSwapchain) noexcept;
|
||||
|
||||
private:
|
||||
void ConnectSignals();
|
||||
inline void DisconnectSignals();
|
||||
|
||||
NazaraSlot(WindowEventHandler, OnCreated, m_onCreated);
|
||||
NazaraSlot(WindowEventHandler, OnDestruction, m_onDestruction);
|
||||
NazaraSlot(WindowEventHandler, OnGainedFocus, m_onGainedFocus);
|
||||
NazaraSlot(WindowEventHandler, OnLostFocus, m_onLostFocus);
|
||||
NazaraSlot(WindowEventHandler, OnMinimized, m_onMinimized);
|
||||
NazaraSlot(WindowEventHandler, OnResized, m_onResized);
|
||||
NazaraSlot(WindowEventHandler, OnRestored, m_onRestored);
|
||||
|
||||
std::shared_ptr<RenderDevice> m_renderDevice;
|
||||
std::shared_ptr<Swapchain> m_swapchain;
|
||||
MovablePtr<Window> m_window;
|
||||
SwapchainParameters m_parameters;
|
||||
bool m_renderOnlyIfFocused;
|
||||
bool m_hasFocus;
|
||||
bool m_isMinimized;
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/WindowSwapchain.inl>
|
||||
|
||||
#endif // NAZARA_RENDERER_RENDERWINDOW_HPP
|
||||
76
include/Nazara/Renderer/WindowSwapchain.inl
Normal file
76
include/Nazara/Renderer/WindowSwapchain.inl
Normal file
@@ -0,0 +1,76 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// 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/WindowSwapchain.hpp>
|
||||
#include <Nazara/Core/ErrorFlags.hpp>
|
||||
#include <Nazara/Renderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline WindowSwapchain::WindowSwapchain(WindowSwapchain&& windowSwapchain) noexcept :
|
||||
m_renderDevice(std::move(windowSwapchain.m_renderDevice)),
|
||||
m_swapchain(std::move(windowSwapchain.m_swapchain)),
|
||||
m_window(std::move(windowSwapchain.m_window)),
|
||||
m_renderOnlyIfFocused(windowSwapchain.m_renderOnlyIfFocused),
|
||||
m_hasFocus(windowSwapchain.m_hasFocus),
|
||||
m_isMinimized(windowSwapchain.m_isMinimized)
|
||||
{
|
||||
ConnectSignals();
|
||||
}
|
||||
|
||||
inline RenderFrame WindowSwapchain::AcquireFrame()
|
||||
{
|
||||
if (m_isMinimized || (!m_hasFocus && m_renderOnlyIfFocused))
|
||||
return RenderFrame{};
|
||||
|
||||
return m_swapchain->AcquireFrame();
|
||||
}
|
||||
|
||||
inline bool WindowSwapchain::DoesRenderOnlyIfFocused() const
|
||||
{
|
||||
return m_renderOnlyIfFocused;
|
||||
}
|
||||
|
||||
inline void WindowSwapchain::EnableRenderOnlyIfFocused(bool enable)
|
||||
{
|
||||
m_renderOnlyIfFocused = enable;
|
||||
}
|
||||
|
||||
inline Swapchain& WindowSwapchain::GetSwapchain()
|
||||
{
|
||||
return *m_swapchain;
|
||||
}
|
||||
|
||||
inline const Swapchain& WindowSwapchain::GetSwapchain() const
|
||||
{
|
||||
return *m_swapchain;
|
||||
}
|
||||
|
||||
inline WindowSwapchain& WindowSwapchain::operator=(WindowSwapchain&& windowSwapchain) noexcept
|
||||
{
|
||||
windowSwapchain.DisconnectSignals();
|
||||
|
||||
m_renderDevice = std::move(windowSwapchain.m_renderDevice);
|
||||
m_swapchain = std::move(windowSwapchain.m_swapchain);
|
||||
m_window = std::move(windowSwapchain.m_window);
|
||||
m_renderOnlyIfFocused = windowSwapchain.m_renderOnlyIfFocused;
|
||||
m_hasFocus = windowSwapchain.m_hasFocus;
|
||||
m_isMinimized = windowSwapchain.m_isMinimized;
|
||||
|
||||
ConnectSignals();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void WindowSwapchain::DisconnectSignals()
|
||||
{
|
||||
m_onGainedFocus.Disconnect();
|
||||
m_onLostFocus.Disconnect();
|
||||
m_onMinimized.Disconnect();
|
||||
m_onResized.Disconnect();
|
||||
m_onRestored.Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/Renderer/DebugOff.hpp>
|
||||
Reference in New Issue
Block a user