From 4b3a55f76035a1e19417895326421ad1b255aab4 Mon Sep 17 00:00:00 2001 From: Danilo Date: Wed, 22 May 2024 20:05:52 -0300 Subject: [PATCH] Corrige SwapChain --- framework/platform/device-dx.cpp | 1 - framework/platform/gdevicemanager-dx.cpp | 6 +- framework/platform/rendertarget-dx.cpp | 4 +- framework/platform/swapchain-dx.cpp | 72 ++++++++++++------------ inc/graphics/swapchain.hpp | 17 ++++-- inc/platform-dx/device-dx.hpp | 1 - inc/platform-dx/implementations.hpp | 17 +++++- inc/platform-dx/swapchain-dx.hpp | 35 ------------ inc/platform-dx/xna-dx.hpp | 1 - 9 files changed, 70 insertions(+), 84 deletions(-) delete mode 100644 inc/platform-dx/swapchain-dx.hpp diff --git a/framework/platform/device-dx.cpp b/framework/platform/device-dx.cpp index e9f197c..e9321fb 100644 --- a/framework/platform/device-dx.cpp +++ b/framework/platform/device-dx.cpp @@ -6,7 +6,6 @@ #include "platform-dx/gdevicemanager-dx.hpp" #include "platform-dx/implementations.hpp" #include "platform-dx/rendertarget-dx.hpp" -#include "platform-dx/swapchain-dx.hpp" #include "platform-dx/window-dx.hpp" namespace xna { diff --git a/framework/platform/gdevicemanager-dx.cpp b/framework/platform/gdevicemanager-dx.cpp index 92cd3e7..5d61b0e 100644 --- a/framework/platform/gdevicemanager-dx.cpp +++ b/framework/platform/gdevicemanager-dx.cpp @@ -4,6 +4,8 @@ #include "platform-dx/window-dx.hpp" #include "platform-dx/gdeviceinfo-dx.hpp" #include "graphics/presentparams.hpp" +#include "graphics/swapchain.hpp" +#include "platform-dx/implementations.hpp" namespace xna { GraphicsDeviceManager::GraphicsDeviceManager(Game*& game) : _game(game) { @@ -38,11 +40,11 @@ namespace xna { auto& swap = _game->graphicsDevice->_swapChain; BOOL state = false; - auto hr = swap->dxSwapChain->GetFullscreenState(&state, nullptr); + auto hr = swap->impl->dxSwapChain->GetFullscreenState(&state, nullptr); if (FAILED(hr)) return false; - hr = swap->dxSwapChain->SetFullscreenState(!state, nullptr); + hr = swap->impl->dxSwapChain->SetFullscreenState(!state, nullptr); if (FAILED(hr)) return false; diff --git a/framework/platform/rendertarget-dx.cpp b/framework/platform/rendertarget-dx.cpp index 7c40a7c..1ca4400 100644 --- a/framework/platform/rendertarget-dx.cpp +++ b/framework/platform/rendertarget-dx.cpp @@ -1,7 +1,7 @@ #include "platform-dx/rendertarget-dx.hpp" #include "graphics/device.hpp" -#include "platform-dx/swapchain-dx.hpp" #include "platform-dx/device-dx.hpp" +#include "platform-dx/implementations.hpp" namespace xna { bool RenderTarget2D::Initialize(xna_error_ptr_arg) { @@ -15,7 +15,7 @@ namespace xna { dxTexture2D = nullptr; } - if (!m_device->_swapChain->GetBackBuffer(dxTexture2D)) + if (!m_device->_swapChain->impl->GetBackBuffer(dxTexture2D)) return false; auto& dxdevice = m_device->_device; diff --git a/framework/platform/swapchain-dx.cpp b/framework/platform/swapchain-dx.cpp index 0a735a2..009f8b5 100644 --- a/framework/platform/swapchain-dx.cpp +++ b/framework/platform/swapchain-dx.cpp @@ -1,10 +1,22 @@ -#include "platform-dx/swapchain-dx.hpp" #include "platform-dx/device-dx.hpp" #include "platform-dx/dxhelpers.hpp" #include "graphics/adapter.hpp" +#include "graphics/swapchain.hpp" #include "platform-dx/implementations.hpp" namespace xna { + SwapChain::SwapChain() : GraphicsResource(nullptr) { + impl = unew(); + } + + SwapChain::SwapChain(sptr const& device) : GraphicsResource(device) { + impl = unew(); + } + + SwapChain::~SwapChain() { + impl = nullptr; + } + static bool internalInit(GraphicsDevice& device, HWND windowHandle, IDXGISwapChain1*& swapChain, DXGI_SWAP_CHAIN_DESC1 const& desc, DXGI_SWAP_CHAIN_FULLSCREEN_DESC const& fdesc) { if (!device._device || !windowHandle) return false; @@ -40,59 +52,47 @@ namespace xna { } bool SwapChain::Initialize(xna_error_ptr_arg) { - if (!m_device || !m_device->_device) { + if (!impl || !m_device || !m_device->_device) { xna_error_apply(err, XnaErrorCode::INVALID_OPERATION); return false; } const auto parameters = m_device->_presentationParameters; - dxDescription.Width = static_cast(parameters.BackBufferWidth); - dxDescription.Height = static_cast(parameters.BackBufferHeight); - dxDescription.Format = DxHelpers::ConvertSurfaceToDXGIFORMAT(parameters.BackBufferFormat); - dxDescription.SampleDesc.Count = 1; - dxDescription.SampleDesc.Quality = 0; - dxDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - dxDescription.BufferCount = 2; - dxDescription.SwapEffect = static_cast(parameters.PresentationSwapEffect); - dxDescription.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - dxDescription.AlphaMode = DXGI_ALPHA_MODE::DXGI_ALPHA_MODE_UNSPECIFIED; - dxFullScreenDescription.RefreshRate.Numerator = 60; - dxFullScreenDescription.RefreshRate.Denominator = 1; - dxFullScreenDescription.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; - dxFullScreenDescription.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; - dxFullScreenDescription.Windowed = !parameters.Fullscreen; + impl->dxDescription.Width = static_cast(parameters.BackBufferWidth); + impl->dxDescription.Height = static_cast(parameters.BackBufferHeight); + impl->dxDescription.Format = DxHelpers::ConvertSurfaceToDXGIFORMAT(parameters.BackBufferFormat); + impl->dxDescription.SampleDesc.Count = 1; + impl->dxDescription.SampleDesc.Quality = 0; + impl->dxDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + impl->dxDescription.BufferCount = 2; + impl->dxDescription.SwapEffect = static_cast(parameters.PresentationSwapEffect); + impl->dxDescription.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + impl->dxDescription.AlphaMode = DXGI_ALPHA_MODE::DXGI_ALPHA_MODE_UNSPECIFIED; + impl->dxFullScreenDescription.RefreshRate.Numerator = 60; + impl->dxFullScreenDescription.RefreshRate.Denominator = 1; + impl->dxFullScreenDescription.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + impl->dxFullScreenDescription.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + impl->dxFullScreenDescription.Windowed = !parameters.Fullscreen; HWND hwnd = reinterpret_cast(parameters.DeviceWindowHandle); - return internalInit(*m_device, hwnd, dxSwapChain, dxDescription, dxFullScreenDescription); - } + return internalInit(*m_device, hwnd, impl->dxSwapChain, impl->dxDescription, impl->dxFullScreenDescription); + } - bool SwapChain::Initialize(GameWindow const& gameWindow, DXGI_SWAP_CHAIN_DESC1 const& desc, DXGI_SWAP_CHAIN_FULLSCREEN_DESC const& fullScreenDesc, xna_error_ptr_arg) - { - if (!m_device || !m_device->_device) { - xna_error_apply(err, XnaErrorCode::INVALID_OPERATION); - return false; - } - - dxDescription = desc; - dxFullScreenDescription = fullScreenDesc; - return internalInit(*m_device, gameWindow.WindowHandle(), dxSwapChain, dxDescription, dxFullScreenDescription); - } - - bool SwapChain::GetBackBuffer(ID3D11Texture2D*& texture2D) { - if (!dxSwapChain) + bool SwapChain::GetBackBuffer(Texture2D& texture2D) { + if (!impl || !impl->dxSwapChain) return false; - const auto hr = dxSwapChain->GetBuffer(0, __uuidof(texture2D), (void**)(&texture2D)); + const auto hr = impl->dxSwapChain->GetBuffer(0, IID_ID3D11Texture2D, (void**)(&texture2D.dxTexture2D)); return !FAILED(hr); } bool SwapChain::Present(bool vsync) { - if (!dxSwapChain) + if (!impl || !impl->dxSwapChain) return false; - const auto hr = dxSwapChain->Present(vsync, NULL); + const auto hr = impl->dxSwapChain->Present(vsync, NULL); return !FAILED(hr); } } \ No newline at end of file diff --git a/inc/graphics/swapchain.hpp b/inc/graphics/swapchain.hpp index 5ec0a48..1ab5f14 100644 --- a/inc/graphics/swapchain.hpp +++ b/inc/graphics/swapchain.hpp @@ -2,14 +2,21 @@ #define XNA_GRAPHICS_SWAPCHAIN_HPP #include "../default.hpp" -#include "../game/window.hpp" +#include "gresource.hpp" namespace xna { - class ISwapChain { + class SwapChain : GraphicsResource { public: - virtual ~ISwapChain() {} - virtual bool Initialize(xna_error_nullarg) = 0; - }; + SwapChain(); + SwapChain(sptr const& device); + ~SwapChain(); + bool Initialize(xna_error_nullarg); + bool Present(bool vsync); + bool GetBackBuffer(Texture2D& texture2D); + public: + struct PlatformImplementation; + uptr impl = nullptr; + }; } #endif \ No newline at end of file diff --git a/inc/platform-dx/device-dx.hpp b/inc/platform-dx/device-dx.hpp index c065cad..e80e2ac 100644 --- a/inc/platform-dx/device-dx.hpp +++ b/inc/platform-dx/device-dx.hpp @@ -7,7 +7,6 @@ #include "../graphics/viewport.hpp" #include "dxheaders.hpp" #include "gdeviceinfo-dx.hpp" -#include "swapchain-dx.hpp" #include "window-dx.hpp" #include "graphics/presentparams.hpp" diff --git a/inc/platform-dx/implementations.hpp b/inc/platform-dx/implementations.hpp index 7deb2f6..6c978ac 100644 --- a/inc/platform-dx/implementations.hpp +++ b/inc/platform-dx/implementations.hpp @@ -13,8 +13,8 @@ #include "graphics/rasterizerstate.hpp" #include "graphics/presentparams.hpp" #include "platform-dx/rendertarget-dx.hpp" -#include "platform-dx/swapchain-dx.hpp" #include "graphics/shader.hpp" +#include "graphics/swapchain.hpp" namespace xna { struct SpriteFont::PlatformImplementation { @@ -250,4 +250,19 @@ namespace xna { ID3D11PixelShader* _pixelShader = nullptr; }; + + struct SwapChain::PlatformImplementation { + IDXGISwapChain1* dxSwapChain{ nullptr }; + DXGI_SWAP_CHAIN_DESC1 dxDescription{}; + DXGI_SWAP_CHAIN_FULLSCREEN_DESC dxFullScreenDescription{}; + + bool GetBackBuffer(ID3D11Texture2D*& texture2D) { + if (!dxSwapChain) + return false; + + const auto hr = dxSwapChain->GetBuffer(0, __uuidof(texture2D), (void**)(&texture2D)); + + return !FAILED(hr); + } + }; } \ No newline at end of file diff --git a/inc/platform-dx/swapchain-dx.hpp b/inc/platform-dx/swapchain-dx.hpp deleted file mode 100644 index a229f76..0000000 --- a/inc/platform-dx/swapchain-dx.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef XNA_PLATFORM_SWAPCHAIN_DX_HPP -#define XNA_PLATFORM_SWAPCHAIN_DX_HPP - -#include "../graphics/swapchain.hpp" -#include "window-dx.hpp" -#include "dxheaders.hpp" -#include "../graphics/gresource.hpp" - -namespace xna { - class SwapChain : public ISwapChain, public GraphicsResource { - public: - SwapChain(sptr const& device): GraphicsResource(device){} - - virtual ~SwapChain() override { - if (dxSwapChain) { - dxSwapChain->Release(); - dxSwapChain = nullptr; - } - } - - virtual bool Initialize(xna_error_nullarg) override; - bool Initialize(GameWindow const& gameWindow, DXGI_SWAP_CHAIN_DESC1 const& desc, DXGI_SWAP_CHAIN_FULLSCREEN_DESC const& fullScreenDesc, xna_error_nullarg); - - bool GetBackBuffer(ID3D11Texture2D*& texture2D); - - bool Present(bool vsync); - - public: - IDXGISwapChain1* dxSwapChain{ nullptr }; - DXGI_SWAP_CHAIN_DESC1 dxDescription{}; - DXGI_SWAP_CHAIN_FULLSCREEN_DESC dxFullScreenDescription{}; - }; -} - -#endif \ No newline at end of file diff --git a/inc/platform-dx/xna-dx.hpp b/inc/platform-dx/xna-dx.hpp index 73a448e..b99939c 100644 --- a/inc/platform-dx/xna-dx.hpp +++ b/inc/platform-dx/xna-dx.hpp @@ -9,7 +9,6 @@ #include "init-dx.hpp" #include "rendertarget-dx.hpp" #include "soundeffect-dx.hpp" -#include "swapchain-dx.hpp" #include "texture-dx.hpp" #include "vertexbuffer-dx.hpp" #include "vertexinput-dx.hpp"