diff --git a/framework/platform/adapter-dx.cpp b/framework/platform/adapter-dx.cpp index fef1133..2e835f9 100644 --- a/framework/platform/adapter-dx.cpp +++ b/framework/platform/adapter-dx.cpp @@ -1,11 +1,22 @@ -#include "platform-dx/adapter-dx.hpp" #include "platform-dx/gdevicemanager-dx.hpp" +#include "platform-dx/implementations.hpp" +#include "graphics/adapter.hpp" +#include "platform-dx/displaymode-dx.hpp" +#include "platform-dx/dxheaders.hpp" namespace xna { static size_t getDisplayModesCount(IDXGIAdapter* adapter); static uptr createDisplayModeCollection(std::vector const& source); - uptr IGraphicsAdapter::DefaultAdapter() { + GraphicsAdapter::GraphicsAdapter() { + impl = uNew(); + } + + GraphicsAdapter::~GraphicsAdapter() { + impl = nullptr; + } + + uptr GraphicsAdapter::DefaultAdapter() { IDXGIFactory1* pFactory = nullptr; if FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory)) @@ -16,8 +27,8 @@ namespace xna { if (pFactory->EnumAdapters1(0, &pAdapter) != DXGI_ERROR_NOT_FOUND) { auto adp = uNew(); - adp->_index = 0; - adp->dxadapter = pAdapter; + adp->impl->_index = 0; + adp->impl->dxadapter = pAdapter; return adp; } @@ -28,7 +39,7 @@ namespace xna { return nullptr; } - void IGraphicsAdapter::Adapters(std::vector>& adapters){ + void GraphicsAdapter::Adapters(std::vector>& adapters){ IDXGIFactory1* pFactory = nullptr; if FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory)) @@ -40,8 +51,8 @@ namespace xna { for (; pFactory->EnumAdapters1(count, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++count) { auto adp = New(); - adp->_index = count; - adp->dxadapter = pAdapter; + adp->impl->_index = count; + adp->impl->dxadapter = pAdapter; adapters.push_back(adp); } @@ -50,7 +61,7 @@ namespace xna { pFactory = nullptr; } - void IGraphicsAdapter::Adapters(std::vector>& adapters) { + void GraphicsAdapter::Adapters(std::vector>& adapters) { IDXGIFactory1* pFactory = nullptr; if FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory)) @@ -62,41 +73,41 @@ namespace xna { for (; pFactory->EnumAdapters1(count, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++count) { auto adp = uNew(); - adp->_index = count; - adp->dxadapter = pAdapter; + adp->impl->_index = count; + adp->impl->dxadapter = pAdapter; adapters.push_back(std::move(adp)); } pFactory->Release(); pFactory = nullptr; - } + } String GraphicsAdapter::Description() const { - if (!dxadapter) return String(); + if (!impl->dxadapter) return String(); DXGI_ADAPTER_DESC1 desc; - dxadapter->GetDesc1(&desc); + impl->dxadapter->GetDesc1(&desc); String description = XnaHToString(desc.Description); return description; } Uint GraphicsAdapter::DeviceId() const { - if (!dxadapter) return 0; + if (!impl->dxadapter) return 0; DXGI_ADAPTER_DESC1 desc; - dxadapter->GetDesc1(&desc); + impl->dxadapter->GetDesc1(&desc); return static_cast(desc.DeviceId); } String GraphicsAdapter::DeviceName() const { - if (!dxadapter) return String(); + if (!impl->dxadapter) return String(); IDXGIOutput* pOutput = nullptr; DXGI_OUTPUT_DESC outputDesc; - if (dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { + if (impl->dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { pOutput->GetDesc(&outputDesc); String deviceName = XnaHToString(outputDesc.DeviceName); @@ -110,12 +121,12 @@ namespace xna { } intptr_t GraphicsAdapter::MonitorHandle() const { - if (!dxadapter) return 0; + if (!impl->dxadapter) return 0; IDXGIOutput* pOutput = nullptr; DXGI_OUTPUT_DESC outputDesc; - if (dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { + if (impl->dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { pOutput->GetDesc(&outputDesc); pOutput->Release(); @@ -128,36 +139,36 @@ namespace xna { } Uint GraphicsAdapter::Revision() const { - if (!dxadapter) return 0; + if (!impl->dxadapter) return 0; DXGI_ADAPTER_DESC1 desc; - dxadapter->GetDesc1(&desc); + impl->dxadapter->GetDesc1(&desc); return static_cast(desc.Revision); } Uint GraphicsAdapter::SubSystemId() const { - if (!dxadapter) return 0; + if (!impl->dxadapter) return 0; DXGI_ADAPTER_DESC1 desc; - dxadapter->GetDesc1(&desc); + impl->dxadapter->GetDesc1(&desc); return static_cast(desc.SubSysId); } Uint GraphicsAdapter::VendorId() const { - if (!dxadapter) return 0; + if (!impl->dxadapter) return 0; DXGI_ADAPTER_DESC1 desc; - dxadapter->GetDesc1(&desc); + impl->dxadapter->GetDesc1(&desc); return static_cast(desc.VendorId); } uptr GraphicsAdapter::SupportedDisplayModes() const { - if (!dxadapter) return nullptr; + if (!impl->dxadapter) return nullptr; - const auto totalDisplay = getDisplayModesCount(dxadapter); + const auto totalDisplay = getDisplayModesCount(impl->dxadapter); if (totalDisplay == 0) return nullptr; @@ -167,10 +178,10 @@ namespace xna { std::vector buffer(totalDisplay); - if (dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { + if (impl->dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { for (size_t f = 0; f < SURFACE_FORMAT_COUNT; ++f) { const auto currentSurface = static_cast(f); - DXGI_FORMAT format = GraphicsAdapter::ConvertSurfaceToDXGIFORMAT(currentSurface); + DXGI_FORMAT format = GraphicsAdapter::PlatformImplementation::ConvertSurfaceToDXGIFORMAT(currentSurface); UINT numModes = 0; pOutput->GetDisplayModeList(format, 0, &numModes, nullptr); @@ -195,13 +206,13 @@ namespace xna { uptr GraphicsAdapter::SupportedDisplayModes(SurfaceFormat surfaceFormat) const { - if (!dxadapter) return nullptr; + if (!impl->dxadapter) return nullptr; IDXGIOutput* pOutput = nullptr; UINT bufferOffset = 0; - if (dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { - DXGI_FORMAT format = GraphicsAdapter::ConvertSurfaceToDXGIFORMAT(surfaceFormat); + if (impl->dxadapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { + DXGI_FORMAT format = GraphicsAdapter::PlatformImplementation::ConvertSurfaceToDXGIFORMAT(surfaceFormat); UINT numModes = 0; @@ -223,11 +234,11 @@ namespace xna { } sptr GraphicsAdapter::CurrentDisplayMode() { - if (!_currentDisplayMode) { + if (!impl->_currentDisplayMode) { CurrentDisplayMode(SurfaceFormat::Color, GraphicsDeviceManager::DefaultBackBufferWidth, GraphicsDeviceManager::DefaultBackBufferHeight); } - return _currentDisplayMode; + return impl->_currentDisplayMode; } void GraphicsAdapter::CurrentDisplayMode(SurfaceFormat surfaceFormat, Uint width, Uint height) { @@ -237,15 +248,15 @@ namespace xna { auto& m = modes->_displayModes[i]; if (m->_format == surfaceFormat && m->_width == width && m->_height == height) { - _currentDisplayMode = m; + impl->_currentDisplayMode = m; } else if(i + 1 == modes->_displayModes.size()) { - _currentDisplayMode = m; + impl->_currentDisplayMode = m; } } } - bool GraphicsAdapter::GetOutput(UINT slot, IDXGIOutput*& output) { + bool GraphicsAdapter::PlatformImplementation::GetOutput(UINT slot, IDXGIOutput*& output) { if (!dxadapter) return false; if (dxadapter->EnumOutputs(slot, &output) != DXGI_ERROR_NOT_FOUND) @@ -263,7 +274,7 @@ namespace xna { if (adapter->EnumOutputs(0, &pOutput) != DXGI_ERROR_NOT_FOUND) { for (size_t f = 0; f < SURFACE_FORMAT_COUNT; ++f) { const auto currentSurface = static_cast(f); - DXGI_FORMAT format = GraphicsAdapter::ConvertSurfaceToDXGIFORMAT(currentSurface); + DXGI_FORMAT format = GraphicsAdapter::PlatformImplementation::ConvertSurfaceToDXGIFORMAT(currentSurface); UINT num = 0; pOutput->GetDisplayModeList(format, 0, &num, nullptr); @@ -292,14 +303,14 @@ namespace xna { description._scaling = static_cast(modedesc.Scaling); description._scanlineOrdering = static_cast(modedesc.ScanlineOrdering); - if (pDisplay && pDisplay->_width == modedesc.Width && pDisplay->_height == modedesc.Height && pDisplay->_format == GraphicsAdapter::ConvertDXGIFORMATToSurface(modedesc.Format)) { + if (pDisplay && pDisplay->_width == modedesc.Width && pDisplay->_height == modedesc.Height && pDisplay->_format == GraphicsAdapter::PlatformImplementation::ConvertDXGIFORMATToSurface(modedesc.Format)) { pDisplay->_descriptions.push_back(description); } else { pDisplay = New(); pDisplay->_width = modedesc.Width; pDisplay->_height = modedesc.Height; - pDisplay->_format = GraphicsAdapter::ConvertDXGIFORMATToSurface(modedesc.Format); + pDisplay->_format = GraphicsAdapter::PlatformImplementation::ConvertDXGIFORMATToSurface(modedesc.Format); pDisplay->_descriptions.push_back(description); displayList.push_back(pDisplay); } diff --git a/framework/platform/device-dx.cpp b/framework/platform/device-dx.cpp index 9a65133..2dce495 100644 --- a/framework/platform/device-dx.cpp +++ b/framework/platform/device-dx.cpp @@ -2,11 +2,12 @@ #include "platform-dx/window-dx.hpp" #include "platform-dx/swapchain-dx.hpp" #include "platform-dx/rendertarget-dx.hpp" -#include "platform-dx/adapter-dx.hpp" #include "platform-dx/blendstate-dx.hpp" #include "platform-dx/gdeviceinfo-dx.hpp" #include "common/color.hpp" #include "platform-dx/gdevicemanager-dx.hpp" +#include "graphics/adapter.hpp" +#include "platform-dx/implementations.hpp" namespace xna { GraphicsDevice::GraphicsDevice() { @@ -86,7 +87,7 @@ namespace xna { if FAILED( D3D11CreateDevice( - _adapter->dxadapter, + _adapter->impl->dxadapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, _createDeviceFlags, diff --git a/framework/platform/gdevicemanager-dx.cpp b/framework/platform/gdevicemanager-dx.cpp index 2af7494..178d718 100644 --- a/framework/platform/gdevicemanager-dx.cpp +++ b/framework/platform/gdevicemanager-dx.cpp @@ -3,7 +3,6 @@ #include "platform-dx/game-dx.hpp" #include "platform-dx/window-dx.hpp" #include "platform-dx/gdeviceinfo-dx.hpp" -#include "platform-dx/adapter-dx.hpp" #include "platform-dx/presentparameters-dx.hpp" namespace xna { diff --git a/framework/platform/swapchain-dx.cpp b/framework/platform/swapchain-dx.cpp index f977aa5..fa3d3ca 100644 --- a/framework/platform/swapchain-dx.cpp +++ b/framework/platform/swapchain-dx.cpp @@ -1,6 +1,7 @@ #include "platform-dx/swapchain-dx.hpp" -#include "platform-dx/adapter-dx.hpp" #include "platform-dx/device-dx.hpp" +#include "graphics/adapter.hpp" +#include "platform-dx/implementations.hpp" namespace xna { static bool internalInit(GraphicsDevice& device, HWND windowHandle, IDXGISwapChain1*& swapChain, DXGI_SWAP_CHAIN_DESC1 const& desc, DXGI_SWAP_CHAIN_FULLSCREEN_DESC const& fdesc) { @@ -13,7 +14,7 @@ namespace xna { } auto adapter = device.Adapter(); - auto dxAdapter = adapter->dxadapter; + auto dxAdapter = adapter->impl->dxadapter; IDXGIFactory1* dxFactory1 = nullptr; auto hr = dxAdapter->GetParent(IID_IDXGIFactory1, (void**)&dxFactory1); @@ -47,7 +48,7 @@ namespace xna { dxDescription.Width = static_cast(parameters.backBufferWidth); dxDescription.Height = static_cast(parameters.backBufferHeight); - dxDescription.Format = GraphicsAdapter::ConvertSurfaceToDXGIFORMAT(parameters.backBufferFormat); + dxDescription.Format = GraphicsAdapter::PlatformImplementation::ConvertSurfaceToDXGIFORMAT(parameters.backBufferFormat); dxDescription.SampleDesc.Count = 1; dxDescription.SampleDesc.Quality = 0; dxDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; diff --git a/framework/platform/texture-dx.cpp b/framework/platform/texture-dx.cpp index f253a8f..caf208a 100644 --- a/framework/platform/texture-dx.cpp +++ b/framework/platform/texture-dx.cpp @@ -1,6 +1,7 @@ #include "platform-dx/texture-dx.hpp" #include "platform-dx/device-dx.hpp" -#include "platform-dx/adapter-dx.hpp" +#include "graphics/adapter.hpp" +#include "platform-dx/implementations.hpp" namespace xna { sptr Texture2D::FromStream(GraphicsDevice& device, String const& fileName, xna_error_ptr_arg) @@ -111,7 +112,7 @@ namespace xna { dxDescription.Width = static_cast(width); dxDescription.Height = static_cast(height); dxDescription.MipLevels = static_cast(mipMap); - dxDescription.Format = GraphicsAdapter::ConvertSurfaceToDXGIFORMAT(format); + dxDescription.Format = GraphicsAdapter::PlatformImplementation::ConvertSurfaceToDXGIFORMAT(format); } void Texture2D::SetData(std::vector const& data, size_t startIndex, size_t elementCount, xna_error_ptr_arg) diff --git a/inc/graphics/adapter.hpp b/inc/graphics/adapter.hpp index d74c575..a70c446 100644 --- a/inc/graphics/adapter.hpp +++ b/inc/graphics/adapter.hpp @@ -4,26 +4,31 @@ #include "../default.hpp" namespace xna { - class IGraphicsAdapter { + class GraphicsAdapter { public: - virtual ~IGraphicsAdapter() {} + GraphicsAdapter(); + ~GraphicsAdapter(); - virtual String Description() const = 0; - virtual Uint DeviceId() const = 0; - virtual String DeviceName() const = 0; - virtual bool IsDefaultAdapter() const = 0; - virtual intptr_t MonitorHandle() const = 0; - virtual Uint Revision() const = 0; - virtual Uint SubSystemId() const = 0; - virtual Uint VendorId() const = 0; - virtual uptr SupportedDisplayModes() const = 0; - virtual uptr SupportedDisplayModes(SurfaceFormat surfaceFormat) const = 0; - virtual sptr CurrentDisplayMode() = 0; - virtual void CurrentDisplayMode(SurfaceFormat surfaceFormat, Uint width, Uint height) = 0; + String Description() const; + Uint DeviceId() const; + String DeviceName() const; + bool IsDefaultAdapter() const; + intptr_t MonitorHandle() const; + Uint Revision() const; + Uint SubSystemId() const; + Uint VendorId() const; + uptr SupportedDisplayModes() const; + uptr SupportedDisplayModes(SurfaceFormat surfaceFormat) const; + sptr CurrentDisplayMode(); + void CurrentDisplayMode(SurfaceFormat surfaceFormat, Uint width, Uint height); static uptr DefaultAdapter(); static void Adapters(std::vector>& adapters); static void Adapters(std::vector>& adapters); + + public: + struct PlatformImplementation; + uptr impl = nullptr; }; } diff --git a/inc/platform-dx/adapter-dx.hpp b/inc/platform-dx/adapter-dx.hpp deleted file mode 100644 index 099fc78..0000000 --- a/inc/platform-dx/adapter-dx.hpp +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef XNA_PLATFORM_ADAPTER_DX_HPP -#define XNA_PLATFORM_ADAPTER_DX_HPP - -#include "../graphics/adapter.hpp" -#include "displaymode-dx.hpp" -#include "dxheaders.hpp" - -namespace xna { - class GraphicsAdapter : public IGraphicsAdapter { - public: - friend class IGraphicsAdapter; - - GraphicsAdapter() {} - - virtual ~GraphicsAdapter() override { - if (dxadapter) { - dxadapter->Release(); - dxadapter = nullptr; - } - } - - virtual String Description() const override; - virtual Uint DeviceId() const override; - virtual String DeviceName() const override; - virtual intptr_t MonitorHandle() const override; - virtual Uint Revision() const override; - virtual Uint SubSystemId() const override; - virtual Uint VendorId() const override; - virtual uptr SupportedDisplayModes() const override; - virtual uptr SupportedDisplayModes(SurfaceFormat surfaceFormat) const override; - virtual sptr CurrentDisplayMode() override; - virtual void CurrentDisplayMode(SurfaceFormat surfaceFormat, Uint width, Uint height) override; - virtual constexpr bool IsDefaultAdapter() const { return _index == 0; } - bool GetOutput(UINT slot, IDXGIOutput*& output); - - public: - IDXGIAdapter1* dxadapter{ nullptr }; - private: - Uint _index{ 0 }; - sptr _currentDisplayMode = nullptr; - - public: - static constexpr DXGI_FORMAT ConvertSurfaceToDXGIFORMAT(SurfaceFormat format) - { - switch (format) - { - case SurfaceFormat::Color://21 - return DXGI_FORMAT_R8G8B8A8_UNORM; - case SurfaceFormat::Bgr565: //23 - return DXGI_FORMAT_B5G6R5_UNORM; - case SurfaceFormat::Bgra5551://25 - return DXGI_FORMAT_B5G5R5A1_UNORM; - case SurfaceFormat::Bgra4444://26 - return DXGI_FORMAT_B4G4R4A4_UNORM; - case SurfaceFormat::Dxt1://827611204 - return DXGI_FORMAT_BC1_UNORM; - case SurfaceFormat::Dxt3://861165636 - return DXGI_FORMAT_BC2_UNORM; - case SurfaceFormat::Dxt5://894720068 - return DXGI_FORMAT_BC3_UNORM; - case SurfaceFormat::NormalizedByte2://60 - return DXGI_FORMAT_R8G8_SNORM; - case SurfaceFormat::NormalizedByte4://63 - return DXGI_FORMAT_R8G8B8A8_SNORM; - case SurfaceFormat::Rgba1010102://31 - return DXGI_FORMAT_R10G10B10A2_UNORM; - case SurfaceFormat::Rg32://34 - return DXGI_FORMAT_R16G16_UNORM; - case SurfaceFormat::Rgba64://36 - return DXGI_FORMAT_R16G16B16A16_UNORM; - case SurfaceFormat::Alpha8://28 - return DXGI_FORMAT_A8_UNORM; - case SurfaceFormat::Single://114 - return DXGI_FORMAT_R32_FLOAT; - case SurfaceFormat::Vector2://115 - return DXGI_FORMAT_R32G32_FLOAT; - case SurfaceFormat::Vector4://116 - return DXGI_FORMAT_R32G32B32A32_FLOAT; - case SurfaceFormat::HalfSingle://111 - return DXGI_FORMAT_R16_FLOAT; - case SurfaceFormat::HalfVector2://112 - return DXGI_FORMAT_R16G16_FLOAT; - case SurfaceFormat::HalfVector4://113 - return DXGI_FORMAT_R16G16B16A16_FLOAT; - case SurfaceFormat::HdrBlendable://113 - return DXGI_FORMAT_R16G16B16A16_FLOAT; - default://0 - return DXGI_FORMAT_UNKNOWN; - } - } - - static constexpr SurfaceFormat ConvertDXGIFORMATToSurface(DXGI_FORMAT format) { - switch (format) - { - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM: - return SurfaceFormat::Color; - case DXGI_FORMAT_B5G6R5_UNORM: - return SurfaceFormat::Bgr565; - case DXGI_FORMAT_B5G5R5A1_UNORM: - return SurfaceFormat::Bgra5551; - case DXGI_FORMAT_B4G4R4A4_UNORM: - return SurfaceFormat::Bgra4444; - case DXGI_FORMAT_BC2_UNORM: - return SurfaceFormat::Dxt3; - case DXGI_FORMAT_BC3_UNORM: - return SurfaceFormat::Dxt5; - case DXGI_FORMAT_R8G8_SNORM: - return SurfaceFormat::NormalizedByte2; - case DXGI_FORMAT_R8G8B8A8_SNORM: - return SurfaceFormat::NormalizedByte4; - case DXGI_FORMAT_R10G10B10A2_UNORM: - return SurfaceFormat::Rgba1010102; - case DXGI_FORMAT_R16G16_UNORM: - return SurfaceFormat::Rg32; - case DXGI_FORMAT_R16G16B16A16_UNORM: - return SurfaceFormat::Rgba64; - case DXGI_FORMAT_A8_UNORM: - return SurfaceFormat::Alpha8; - case DXGI_FORMAT_R32_FLOAT: - return SurfaceFormat::Single; - case DXGI_FORMAT_R32G32_FLOAT: - return SurfaceFormat::Vector2; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - return SurfaceFormat::Vector4; - case DXGI_FORMAT_R16_FLOAT: - return SurfaceFormat::HalfSingle; - case DXGI_FORMAT_R16G16_FLOAT: - return SurfaceFormat::HalfVector2; - case DXGI_FORMAT_R16G16B16A16_FLOAT: - return SurfaceFormat::HalfVector4; - default: - return SurfaceFormat::Unknown; - } - } - }; -} - -#endif diff --git a/inc/platform-dx/device-dx.hpp b/inc/platform-dx/device-dx.hpp index c9a6a4e..7674866 100644 --- a/inc/platform-dx/device-dx.hpp +++ b/inc/platform-dx/device-dx.hpp @@ -5,9 +5,7 @@ #include "../graphics/device.hpp" #include "../graphics/presentparams.hpp" #include "../graphics/viewport.hpp" -#include "adapter-dx.hpp" -#include "d3d11.h" -#include "dxgi.h" +#include "dxheaders.hpp" #include "gdeviceinfo-dx.hpp" #include "swapchain-dx.hpp" #include "window-dx.hpp" diff --git a/inc/platform-dx/gdeviceinfo-dx.hpp b/inc/platform-dx/gdeviceinfo-dx.hpp index d302031..f88142c 100644 --- a/inc/platform-dx/gdeviceinfo-dx.hpp +++ b/inc/platform-dx/gdeviceinfo-dx.hpp @@ -2,7 +2,6 @@ #define XNA_PLATFORM_GDEVICEINFOR_DX_HPP #include "../game/gdeviceinfo.hpp" -#include "adapter-dx.hpp" #include "window-dx.hpp" #include "presentparameters-dx.hpp" diff --git a/inc/platform-dx/implementations.hpp b/inc/platform-dx/implementations.hpp index 19a7b1c..5ceb5d5 100644 --- a/inc/platform-dx/implementations.hpp +++ b/inc/platform-dx/implementations.hpp @@ -1,6 +1,6 @@ #include "graphics/sprite.hpp" #include "graphics/device.hpp" -#include "platform-dx/adapter-dx.hpp" +#include "graphics/adapter.hpp" #include "platform-dx/presentparameters-dx.hpp" #include "dxheaders.hpp" #include "platform-dx/swapchain-dx.hpp" @@ -14,5 +14,117 @@ namespace xna { struct SpriteBatch::PlatformImplementation { sptr _dxspriteBatch = nullptr; - }; + }; + + struct GraphicsAdapter::PlatformImplementation { + ~PlatformImplementation(){ + if (dxadapter) { + dxadapter->Release(); + dxadapter = nullptr; + } + } + + IDXGIAdapter1* dxadapter = nullptr; + private: + friend class GraphicsAdapter; + Uint _index{ 0 }; + sptr _currentDisplayMode = nullptr; + + public: + bool GetOutput(UINT slot, IDXGIOutput*& output); + + static constexpr DXGI_FORMAT ConvertSurfaceToDXGIFORMAT(SurfaceFormat format) + { + switch (format) + { + case SurfaceFormat::Color://21 + return DXGI_FORMAT_R8G8B8A8_UNORM; + case SurfaceFormat::Bgr565: //23 + return DXGI_FORMAT_B5G6R5_UNORM; + case SurfaceFormat::Bgra5551://25 + return DXGI_FORMAT_B5G5R5A1_UNORM; + case SurfaceFormat::Bgra4444://26 + return DXGI_FORMAT_B4G4R4A4_UNORM; + case SurfaceFormat::Dxt1://827611204 + return DXGI_FORMAT_BC1_UNORM; + case SurfaceFormat::Dxt3://861165636 + return DXGI_FORMAT_BC2_UNORM; + case SurfaceFormat::Dxt5://894720068 + return DXGI_FORMAT_BC3_UNORM; + case SurfaceFormat::NormalizedByte2://60 + return DXGI_FORMAT_R8G8_SNORM; + case SurfaceFormat::NormalizedByte4://63 + return DXGI_FORMAT_R8G8B8A8_SNORM; + case SurfaceFormat::Rgba1010102://31 + return DXGI_FORMAT_R10G10B10A2_UNORM; + case SurfaceFormat::Rg32://34 + return DXGI_FORMAT_R16G16_UNORM; + case SurfaceFormat::Rgba64://36 + return DXGI_FORMAT_R16G16B16A16_UNORM; + case SurfaceFormat::Alpha8://28 + return DXGI_FORMAT_A8_UNORM; + case SurfaceFormat::Single://114 + return DXGI_FORMAT_R32_FLOAT; + case SurfaceFormat::Vector2://115 + return DXGI_FORMAT_R32G32_FLOAT; + case SurfaceFormat::Vector4://116 + return DXGI_FORMAT_R32G32B32A32_FLOAT; + case SurfaceFormat::HalfSingle://111 + return DXGI_FORMAT_R16_FLOAT; + case SurfaceFormat::HalfVector2://112 + return DXGI_FORMAT_R16G16_FLOAT; + case SurfaceFormat::HalfVector4://113 + return DXGI_FORMAT_R16G16B16A16_FLOAT; + case SurfaceFormat::HdrBlendable://113 + return DXGI_FORMAT_R16G16B16A16_FLOAT; + default://0 + return DXGI_FORMAT_UNKNOWN; + } + } + + static constexpr SurfaceFormat ConvertDXGIFORMATToSurface(DXGI_FORMAT format) { + switch (format) + { + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + return SurfaceFormat::Color; + case DXGI_FORMAT_B5G6R5_UNORM: + return SurfaceFormat::Bgr565; + case DXGI_FORMAT_B5G5R5A1_UNORM: + return SurfaceFormat::Bgra5551; + case DXGI_FORMAT_B4G4R4A4_UNORM: + return SurfaceFormat::Bgra4444; + case DXGI_FORMAT_BC2_UNORM: + return SurfaceFormat::Dxt3; + case DXGI_FORMAT_BC3_UNORM: + return SurfaceFormat::Dxt5; + case DXGI_FORMAT_R8G8_SNORM: + return SurfaceFormat::NormalizedByte2; + case DXGI_FORMAT_R8G8B8A8_SNORM: + return SurfaceFormat::NormalizedByte4; + case DXGI_FORMAT_R10G10B10A2_UNORM: + return SurfaceFormat::Rgba1010102; + case DXGI_FORMAT_R16G16_UNORM: + return SurfaceFormat::Rg32; + case DXGI_FORMAT_R16G16B16A16_UNORM: + return SurfaceFormat::Rgba64; + case DXGI_FORMAT_A8_UNORM: + return SurfaceFormat::Alpha8; + case DXGI_FORMAT_R32_FLOAT: + return SurfaceFormat::Single; + case DXGI_FORMAT_R32G32_FLOAT: + return SurfaceFormat::Vector2; + case DXGI_FORMAT_R32G32B32A32_FLOAT: + return SurfaceFormat::Vector4; + case DXGI_FORMAT_R16_FLOAT: + return SurfaceFormat::HalfSingle; + case DXGI_FORMAT_R16G16_FLOAT: + return SurfaceFormat::HalfVector2; + case DXGI_FORMAT_R16G16B16A16_FLOAT: + return SurfaceFormat::HalfVector4; + default: + return SurfaceFormat::Unknown; + } + } + }; } \ No newline at end of file diff --git a/inc/platform-dx/xna-dx.hpp b/inc/platform-dx/xna-dx.hpp index 07d5375..c0a906f 100644 --- a/inc/platform-dx/xna-dx.hpp +++ b/inc/platform-dx/xna-dx.hpp @@ -1,4 +1,3 @@ -#include "adapter-dx.hpp" #include "audioengine-dx.hpp" #include "blendstate-dx.hpp" #include "clock-dx.hpp"