Replace RenderWindow with swapchains
This commit is contained in:
committed by
Jérôme Leclercq
parent
8db1c04568
commit
18851c9185
@@ -1,20 +0,0 @@
|
||||
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
|
||||
// This file is part of the "Nazara Engine - OpenGL renderer"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/OpenGLRenderer/DummySurface.hpp>
|
||||
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
bool DummySurface::Create(WindowHandle handle)
|
||||
{
|
||||
m_handle = handle;
|
||||
return true;
|
||||
}
|
||||
|
||||
void DummySurface::Destroy()
|
||||
{
|
||||
m_handle = WindowHandle{};
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderPipeline.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderPipelineLayout.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLShaderModule.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLSwapchain.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLTexture.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLTextureSampler.hpp>
|
||||
#include <Nazara/OpenGLRenderer/Wrapper/Loader.hpp>
|
||||
@@ -200,6 +201,11 @@ namespace Nz
|
||||
return std::make_shared<OpenGLShaderModule>(*this, shaderStages, lang, source, sourceSize, states);
|
||||
}
|
||||
|
||||
std::shared_ptr<Swapchain> OpenGLDevice::InstantiateSwapchain(WindowHandle windowHandle, const Vector2ui& windowSize, const SwapchainParameters& parameters)
|
||||
{
|
||||
return std::make_shared<OpenGLSwapchain>(*this, windowHandle, windowSize, parameters);
|
||||
}
|
||||
|
||||
std::shared_ptr<Texture> OpenGLDevice::InstantiateTexture(const TextureInfo& params)
|
||||
{
|
||||
return std::make_shared<OpenGLTexture>(*this, params);
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderImage.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLCommandBuffer.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLCommandBufferBuilder.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLSwapchain.hpp>
|
||||
#include <stdexcept>
|
||||
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
OpenGLRenderImage::OpenGLRenderImage(OpenGLRenderWindow& owner) :
|
||||
OpenGLRenderImage::OpenGLRenderImage(OpenGLSwapchain& owner) :
|
||||
m_owner(owner),
|
||||
m_uploadPool(2 * 1024 * 1024)
|
||||
{
|
||||
|
||||
@@ -4,11 +4,9 @@
|
||||
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderer.hpp>
|
||||
#include <Nazara/Core/ErrorFlags.hpp>
|
||||
#include <Nazara/OpenGLRenderer/DummySurface.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLSwapchain.hpp>
|
||||
#include <Nazara/Renderer/RenderDevice.hpp>
|
||||
#include <Nazara/Renderer/RenderSurface.hpp>
|
||||
#include <Nazara/Renderer/RenderWindowImpl.hpp>
|
||||
#include <Nazara/Renderer/Swapchain.hpp>
|
||||
#include <cassert>
|
||||
#include <sstream>
|
||||
|
||||
@@ -30,17 +28,7 @@ namespace Nz
|
||||
m_device.reset();
|
||||
}
|
||||
|
||||
std::unique_ptr<RenderSurface> OpenGLRenderer::CreateRenderSurfaceImpl()
|
||||
{
|
||||
return std::make_unique<DummySurface>();
|
||||
}
|
||||
|
||||
std::unique_ptr<RenderWindowImpl> OpenGLRenderer::CreateRenderWindowImpl(RenderWindow& owner)
|
||||
{
|
||||
return std::make_unique<OpenGLRenderWindow>(owner);
|
||||
}
|
||||
|
||||
std::shared_ptr<RenderDevice> OpenGLRenderer::InstanciateRenderDevice(std::size_t deviceIndex, const RenderDeviceFeatures& enabledFeatures)
|
||||
std::shared_ptr<RenderDevice> OpenGLRenderer::InstanciateRenderDevice([[maybe_unused]] std::size_t deviceIndex, const RenderDeviceFeatures& enabledFeatures)
|
||||
{
|
||||
assert(deviceIndex == 0);
|
||||
|
||||
|
||||
@@ -2,64 +2,36 @@
|
||||
// This file is part of the "Nazara Engine - OpenGL renderer"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp>
|
||||
#include <Nazara/OpenGLRenderer/DummySurface.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLSwapchain.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLCommandPool.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderer.hpp>
|
||||
#include <Nazara/Renderer/CommandPool.hpp>
|
||||
#include <Nazara/Renderer/RenderWindow.hpp>
|
||||
#include <Nazara/Renderer/WindowSwapchain.hpp>
|
||||
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
OpenGLRenderWindow::OpenGLRenderWindow(RenderWindow& owner) :
|
||||
OpenGLSwapchain::OpenGLSwapchain(OpenGLDevice& device, WindowHandle windowHandle, const Vector2ui& windowSize, const SwapchainParameters& parameters) :
|
||||
m_currentFrame(0),
|
||||
m_framebuffer(*this),
|
||||
m_owner(owner)
|
||||
m_size(windowSize),
|
||||
m_sizeInvalidated(false)
|
||||
{
|
||||
}
|
||||
|
||||
RenderFrame OpenGLRenderWindow::Acquire()
|
||||
{
|
||||
if (m_owner.IsMinimized())
|
||||
return RenderFrame();
|
||||
|
||||
bool invalidateFramebuffer = false;
|
||||
Vector2ui size = m_owner.GetSize();
|
||||
if (m_size != size)
|
||||
{
|
||||
invalidateFramebuffer = true;
|
||||
|
||||
OnRenderTargetSizeChange(this, size);
|
||||
m_size = size;
|
||||
}
|
||||
|
||||
return RenderFrame(m_renderImage[m_currentFrame].get(), invalidateFramebuffer, m_size, 0);
|
||||
}
|
||||
|
||||
bool OpenGLRenderWindow::Create(RendererImpl* /*renderer*/, RenderSurface* surface, const RenderWindowParameters& parameters)
|
||||
{
|
||||
DummySurface* dummySurface = static_cast<DummySurface*>(surface);
|
||||
|
||||
OpenGLDevice& device = static_cast<OpenGLDevice&>(*m_owner.GetRenderDevice());
|
||||
|
||||
GL::ContextParams contextParams;
|
||||
#ifdef NAZARA_OPENGLRENDERER_DEBUG
|
||||
contextParams.wrapErrorHandling = true;
|
||||
#endif
|
||||
//TODO: Pass render window parameters to context
|
||||
//TODO: Pass swapchain parameters to context
|
||||
|
||||
m_context = device.CreateContext(contextParams, dummySurface->GetWindowHandle());
|
||||
m_context = device.CreateContext(contextParams, windowHandle);
|
||||
if (!m_context)
|
||||
return false;
|
||||
|
||||
m_size = m_owner.GetSize();
|
||||
throw std::runtime_error("failed to create swapchain context");
|
||||
|
||||
// TODO: extract the exact window pixel format
|
||||
PixelFormat colorFormat;
|
||||
switch (contextParams.bitsPerPixel)
|
||||
{
|
||||
case 8: colorFormat = PixelFormat::R8; break;
|
||||
case 8: colorFormat = PixelFormat::R8; break;
|
||||
case 16: colorFormat = PixelFormat::RG8; break;
|
||||
case 24: colorFormat = PixelFormat::RGB8; break;
|
||||
|
||||
@@ -94,38 +66,52 @@ namespace Nz
|
||||
m_renderImage.reserve(RenderImageCount);
|
||||
for (std::size_t i = 0; i < RenderImageCount; ++i)
|
||||
m_renderImage.emplace_back(std::make_unique<OpenGLRenderImage>(*this));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<CommandPool> OpenGLRenderWindow::CreateCommandPool(QueueType /*queueType*/)
|
||||
RenderFrame OpenGLSwapchain::AcquireFrame()
|
||||
{
|
||||
bool sizeInvalidated = m_sizeInvalidated;
|
||||
m_sizeInvalidated = false;
|
||||
|
||||
return RenderFrame(m_renderImage[m_currentFrame].get(), sizeInvalidated, m_size, 0);
|
||||
}
|
||||
|
||||
std::shared_ptr<CommandPool> OpenGLSwapchain::CreateCommandPool(QueueType /*queueType*/)
|
||||
{
|
||||
return std::make_unique<OpenGLCommandPool>();
|
||||
}
|
||||
|
||||
const OpenGLFramebuffer& OpenGLRenderWindow::GetFramebuffer(std::size_t i) const
|
||||
const OpenGLFramebuffer& OpenGLSwapchain::GetFramebuffer(std::size_t i) const
|
||||
{
|
||||
assert(i == 0);
|
||||
NazaraUnused(i);
|
||||
return m_framebuffer;
|
||||
}
|
||||
|
||||
std::size_t OpenGLRenderWindow::GetFramebufferCount() const
|
||||
std::size_t OpenGLSwapchain::GetFramebufferCount() const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
const OpenGLRenderPass& OpenGLRenderWindow::GetRenderPass() const
|
||||
const OpenGLRenderPass& OpenGLSwapchain::GetRenderPass() const
|
||||
{
|
||||
return *m_renderPass;
|
||||
}
|
||||
|
||||
const Vector2ui& OpenGLRenderWindow::GetSize() const
|
||||
const Vector2ui& OpenGLSwapchain::GetSize() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
void OpenGLRenderWindow::Present()
|
||||
void OpenGLSwapchain::NotifyResize(const Vector2ui& newSize)
|
||||
{
|
||||
OnRenderTargetSizeChange(this, newSize);
|
||||
|
||||
m_size = newSize;
|
||||
m_sizeInvalidated = true;
|
||||
}
|
||||
|
||||
void OpenGLSwapchain::Present()
|
||||
{
|
||||
m_context->SwapBuffers();
|
||||
m_currentFrame = (m_currentFrame + 1) % m_renderImage.size();
|
||||
@@ -3,7 +3,7 @@
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/OpenGLRenderer/OpenGLWindowFramebuffer.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLRenderWindow.hpp>
|
||||
#include <Nazara/OpenGLRenderer/OpenGLSwapchain.hpp>
|
||||
#include <stdexcept>
|
||||
#include <Nazara/OpenGLRenderer/Debug.hpp>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user