Branimir Karadžić 8 gadi atpakaļ
vecāks
revīzija
36b2ca1504
2 mainītis faili ar 71 papildinājumiem un 48 dzēšanām
  1. 2 1
      src/renderer_d3d11.cpp
  2. 69 47
      src/renderer_d3d12.cpp

+ 2 - 1
src/renderer_d3d11.cpp

@@ -1275,7 +1275,8 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 					m_scd.BufferCount = m_swapBufferCount;
 					m_scd.Scaling = 0 == g_platformData.ndt
 						? DXGI_SCALING_NONE
-						: DXGI_SCALING_STRETCH;
+						: DXGI_SCALING_STRETCH
+						;
 					m_scd.SwapEffect = m_swapEffect;
 					m_scd.AlphaMode  = DXGI_ALPHA_MODE_IGNORE;
 					m_scd.Flags      = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

+ 69 - 47
src/renderer_d3d12.cpp

@@ -895,6 +895,36 @@ namespace bgfx { namespace d3d12
 				goto error;
 			}
 
+#if !BX_PLATFORM_WINDOWS
+			if (NULL == m_factory)
+			{
+				IDXGIDevice1* dxgiDevice;
+				hr = m_device->QueryInterface(IID_IDXGIDevice1, (void**)&dxgiDevice);
+
+				if (FAILED(hr) )
+				{
+					BX_TRACE("Init error: Unable to query IDXGIDevice1 interface 0x%08x.", hr);
+					goto error;
+				}
+
+				hr = dxgiDevice->GetAdapter(&m_adapter);
+
+				if (FAILED(hr) )
+				{
+					BX_TRACE("Init error: DXGIDevice1::GetAdapter failed 0x%08x.", hr);
+					goto error;
+				}
+
+				hr = m_adapter->GetParent(IID_IDXGIFactory2, (void**)&m_factory);
+
+				if (FAILED(hr) )
+				{
+					BX_TRACE("Init error: IDXGIAdapter::GetParent failed 0x%08x.", hr);
+					goto error;
+				}
+			}
+#endif // !BX_PLATFORM_WINDOWS
+
 			if (NULL != m_factory)
 			{
 				bx::memSet(&m_adapterDesc, 0, sizeof(m_adapterDesc) );
@@ -921,7 +951,11 @@ namespace bgfx { namespace d3d12
 						}
 						else
 						{
+#if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 							DX_RELEASE(adapter, 0);
+#else
+							DX_RELEASE(adapter, 2);
+#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 						}
 						break;
 					}
@@ -953,36 +987,6 @@ namespace bgfx { namespace d3d12
 				}
 			}
 
-#if !BX_PLATFORM_WINDOWS
-			if (NULL == m_factory)
-			{
-				IDXGIDevice1* dxgiDevice;
-				hr = m_device->QueryInterface(IID_IDXGIDevice1, (void**)&dxgiDevice);
-
-				if (FAILED(hr) )
-				{
-					BX_TRACE("Init error: Unable to query IDXGIDevice1 interface 0x%08x.", hr);
-					goto error;
-				}
-
-				hr = dxgiDevice->GetAdapter(&m_adapter);
-
-				if (FAILED(hr) )
-				{
-					BX_TRACE("Init error: DXGIDevice1::GetAdapter failed 0x%08x.", hr);
-					goto error;
-				}
-
-				hr = m_adapter->GetParent(IID_IDXGIFactory4, (void**)&m_factory);
-
-				if (FAILED(hr) )
-				{
-					BX_TRACE("Init error: IDXGIAdapter::GetParent failed 0x%08x.", hr);
-					goto error;
-				}
-			}
-#endif // !BX_PLATFORM_WINDOWS
-
 			DX_CHECK(m_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &m_options, sizeof(m_options) ) );
 			BX_TRACE("D3D12 options:")
 			BX_TRACE("\tTiledResourcesTier %d", m_options.TiledResourcesTier);
@@ -1000,14 +1004,6 @@ namespace bgfx { namespace d3d12
 			if (NULL == g_platformData.backBuffer)
 			{
 #if !BX_PLATFORM_WINDOWS
-				hr = m_adapter->GetParent(IID_IDXGIFactory2, (void**)&m_factory);
-				DX_RELEASE(m_adapter, 0);
-				if (FAILED(hr) )
-				{
-					BX_TRACE("Init error: Unable to create Direct3D11 device.");
-					goto error;
-				}
-
 				bx::memSet(&m_scd, 0, sizeof(m_scd) );
 				m_scd.Width  = _init.resolution.m_width;
 				m_scd.Height = _init.resolution.m_height;
@@ -1015,18 +1011,26 @@ namespace bgfx { namespace d3d12
 				m_scd.Stereo  = false;
 				m_scd.SampleDesc.Count   = 1;
 				m_scd.SampleDesc.Quality = 0;
-				m_scd.BufferUsage  = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-				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_scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+				m_scd.BufferCount = bx::uint32_min(BX_COUNTOF(m_backBufferColor), 4);
+				m_scd.Scaling = 0 == g_platformData.ndt
+					? DXGI_SCALING_NONE
+					: 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
+					hr = m_factory->CreateSwapChainForCoreWindow(
+#if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
+						  m_cmd.m_commandQueue
+#else
+						  m_device
+#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 						, (::IUnknown*)g_platformData.nwh
 						, &m_scd
 						, NULL
@@ -2063,7 +2067,11 @@ namespace bgfx { namespace d3d12
 
 			for (uint32_t ii = 0, num = m_scd.BufferCount; ii < num; ++ii)
 			{
+#if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 				DX_RELEASE(m_backBufferColor[ii], num-1-ii);
+#else
+				DX_RELEASE(m_backBufferColor[ii], 1);
+#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 			}
 			DX_RELEASE(m_backBufferDepthStencil, 0);
 
@@ -2236,7 +2244,7 @@ data.NumQualityLevels = 0;
 						, nodeMask
 						, presentQueue
 						) );
-#else
+#elif BX_PLATFORM_WINRT
 					DX_CHECK(m_swapChain->ResizeBuffers(
 						  m_scd.BufferCount
 						, m_scd.Width
@@ -2326,9 +2334,11 @@ data.NumQualityLevels = 0;
 
 			if (NULL != frameBuffer.m_swapChain)
 			{
+#if BX_PLATFORM_WINDOWS
 				uint8_t idx = uint8_t(frameBuffer.m_swapChain->GetCurrentBackBufferIndex() );
 				frameBuffer.setState(m_commandList, idx, D3D12_RESOURCE_STATE_RENDER_TARGET);
 				return getRtv(_fbh, idx);
+#endif // BX_PLATFORM_WINDOWS
 			}
 
 			return getRtv(_fbh, 0);
@@ -4946,7 +4956,7 @@ data.NumQualityLevels = 0;
 
 	void FrameBufferD3D12::create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat)
 	{
-		BX_UNUSED(_depthFormat);
+		BX_UNUSED(_nwh, _width, _height, _depthFormat);
 
 #if BX_PLATFORM_WINDOWS
 		DXGI_SWAP_CHAIN_DESC scd;
@@ -4976,6 +4986,7 @@ data.NumQualityLevels = 0;
 				, (void**)&colorBuffer
 				) );
 			device->CreateRenderTargetView(colorBuffer, NULL, rtvHandle);
+			DX_RELEASE(colorBuffer, 0);
 		}
 #endif // BX_PLATFORM_WINDOWS
 
@@ -5002,10 +5013,15 @@ data.NumQualityLevels = 0;
 	{
 		if (m_needPresent)
 		{
+#if 1
 			HRESULT hr = m_swapChain->Present(_syncInterval, _flags);
 			hr = !isLost(hr) ? S_OK : hr;
 			m_needPresent = false;
 			return hr;
+#else
+			m_needPresent = false;
+			return S_OK;
+#endif // 0
 		}
 
 		return S_OK;
@@ -5219,6 +5235,8 @@ data.NumQualityLevels = 0;
 				, _state
 				);
 
+			DX_RELEASE(colorBuffer, 0);
+
 			bx::xchg(m_state, _state);
 		}
 
@@ -6527,18 +6545,22 @@ data.NumQualityLevels = 0;
 			PIX3_ENDEVENT(m_commandList);
 		}
 
+		m_commandList->OMSetRenderTargets(0, NULL, false, NULL);
+
 		setResourceBarrier(m_commandList
 			, m_backBufferColor[m_backBufferColorIdx]
 			, D3D12_RESOURCE_STATE_RENDER_TARGET
 			, D3D12_RESOURCE_STATE_PRESENT
 			);
 
+#if BX_PLATFORM_WINDOWS
 		for (uint32_t ii = 1, num = m_numWindows; ii < num; ++ii)
 		{
 			FrameBufferD3D12& frameBuffer = m_frameBuffers[m_windows[ii].idx];
 			uint8_t idx = uint8_t(frameBuffer.m_swapChain->GetCurrentBackBufferIndex() );
 			frameBuffer.setState(m_commandList, idx, D3D12_RESOURCE_STATE_PRESENT);
 		}
+#endif // BX_PLATFORM_WINDOWS
 
 		m_backBufferColorFence[m_backBufferColorIdx] = kick();
 	}