From 963aa2cac9e660459bc928fb098507e532ee5c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sat, 16 Dec 2017 19:01:56 -0800 Subject: [PATCH] D3D12 UWP fixes. --- examples/common/entry/entry_winrt.cx | 6 ++++ src/renderer_d3d11.cpp | 3 +- src/renderer_d3d12.cpp | 44 ++++++++++++++++++++-------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/examples/common/entry/entry_winrt.cx b/examples/common/entry/entry_winrt.cx index 20bf22160..5f63114f1 100644 --- a/examples/common/entry/entry_winrt.cx +++ b/examples/common/entry/entry_winrt.cx @@ -79,6 +79,8 @@ public: virtual void Run() { + bgfx::renderFrame(); + bx::Thread thread; thread.init(MainThreadFunc, nullptr); @@ -104,10 +106,14 @@ public: { window->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending); } + + bgfx::renderFrame(); } g_eventQueue.postExitEvent(); + while (bgfx::RenderFrame::NoContext != bgfx::renderFrame() ) {}; + thread.shutdown(); } diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index e6e94bade..7025f7377 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -1252,7 +1252,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); if (NULL == g_platformData.backBuffer) { #if !BX_PLATFORM_WINDOWS - hr = adapter->GetParent(__uuidof(IDXGIFactory2), (void**)&m_factory); + hr = adapter->GetParent(IID_IDXGIFactory2, (void**)&m_factory); DX_RELEASE(adapter, 2); if (FAILED(hr) ) { @@ -1274,6 +1274,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); : DXGI_SCALING_STRETCH; m_scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; m_scd.AlphaMode = DXGI_ALPHA_MODE_IGNORE; + m_scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; if (NULL == g_platformData.ndt) { diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 00a55bcf5..b9f7c861c 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -909,7 +909,7 @@ namespace bgfx { namespace d3d12 if (NULL == g_platformData.backBuffer) { #if !BX_PLATFORM_WINDOWS - hr = m_adapter->GetParent(__uuidof(IDXGIFactory2), (void**)&m_factory); + hr = m_adapter->GetParent(IID_IDXGIFactory2, (void**)&m_factory); DX_RELEASE(m_adapter, 0); if (FAILED(hr) ) { @@ -917,6 +917,7 @@ namespace bgfx { namespace d3d12 goto error; } + bx::memSet(&m_scd, 0, sizeof(m_scd) ); m_scd.Width = _init.resolution.m_width; m_scd.Height = _init.resolution.m_height; m_scd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; @@ -927,8 +928,11 @@ namespace bgfx { namespace d3d12 m_scd.BufferCount = bx::uint32_min(BX_COUNTOF(m_backBufferColor), 4); m_scd.Scaling = DXGI_SCALING_STRETCH; m_scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + m_scd.AlphaMode = DXGI_ALPHA_MODE_IGNORE; m_scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + m_backBufferColorIdx = m_scd.BufferCount-1; + if (NULL == g_platformData.ndt) { hr = m_factory->CreateSwapChainForCoreWindow(m_cmd.m_commandQueue @@ -1416,7 +1420,7 @@ namespace bgfx { namespace d3d12 { int64_t start = bx::getHPCounter(); - HRESULT hr = 0; + HRESULT hr = S_OK; uint32_t syncInterval = !!(m_resolution.m_flags & BGFX_RESET_VSYNC); uint32_t flags = 0 == syncInterval ? DXGI_PRESENT_RESTART : 0; for (uint32_t ii = 1, num = m_numWindows; ii < num && SUCCEEDED(hr); ++ii) @@ -2082,25 +2086,35 @@ data.NumQualityLevels = 0; preReset(); BX_UNUSED(resize); -#if BX_PLATFORM_WINDOWS if (resize) { +#if BX_PLATFORM_WINDOWS uint32_t nodeMask[] = { 1, 1, 1, 1 }; BX_STATIC_ASSERT(BX_COUNTOF(m_backBufferColor) == BX_COUNTOF(nodeMask) ); IUnknown* presentQueue[] ={ m_cmd.m_commandQueue, m_cmd.m_commandQueue, m_cmd.m_commandQueue, m_cmd.m_commandQueue }; BX_STATIC_ASSERT(BX_COUNTOF(m_backBufferColor) == BX_COUNTOF(presentQueue) ); - DX_CHECK(m_swapChain->ResizeBuffers1(m_scd.BufferCount - , m_scd.BufferDesc.Width - , m_scd.BufferDesc.Height - , m_scd.BufferDesc.Format - , m_scd.Flags - , nodeMask - , presentQueue - ) ); + DX_CHECK(m_swapChain->ResizeBuffers1( + m_scd.BufferCount + , m_scd.BufferDesc.Width + , m_scd.BufferDesc.Height + , m_scd.BufferDesc.Format + , m_scd.Flags + , nodeMask + , presentQueue + ) ); +#else + DX_CHECK(m_swapChain->ResizeBuffers( + m_scd.BufferCount + , m_scd.Width + , m_scd.Height + , m_scd.Format + , m_scd.Flags + ) ); + m_backBufferColorIdx = m_scd.BufferCount-1; +#endif // BX_PLATFORM_WINDOWS } else -#endif // BX_PLATFORM_WINDOWS { updateMsaa(); m_scd.SampleDesc = s_msaa[(m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT]; @@ -3028,7 +3042,7 @@ data.NumQualityLevels = 0; ID3D12InfoQueue* m_infoQueue; #elif BX_PLATFORM_WINRT IDXGIAdapter* m_adapter; - IDXGIFactory4* m_factory; + IDXGIFactory2* m_factory; IDXGISwapChain1* m_swapChain; #else IDXGIAdapter* m_adapter; @@ -3543,6 +3557,8 @@ data.NumQualityLevels = 0; CloseHandle(commandList.m_event); commandList.m_event = NULL; m_completedFence = m_fence->GetCompletedValue(); + BX_WARN(UINT64_MAX != m_completedFence, "D3D12: Device lost."); + m_commandQueue->Wait(m_fence, m_completedFence); ResourceArray& ra = m_release[m_control.m_read]; @@ -5284,6 +5300,8 @@ data.NumQualityLevels = 0; #if BX_PLATFORM_WINDOWS m_backBufferColorIdx = m_swapChain->GetCurrentBackBufferIndex(); +#else + m_backBufferColorIdx = (m_backBufferColorIdx+1) % m_scd.BufferCount; #endif // BX_PLATFORM_WINDOWS const uint64_t f0 = BGFX_STATE_BLEND_FACTOR;