Просмотр исходного кода

D3D12: Disabled ExecuteIndirect code path.

Branimir Karadžić 8 лет назад
Родитель
Сommit
b259166690
2 измененных файлов с 46 добавлено и 23 удалено
  1. 38 23
      src/renderer_d3d12.cpp
  2. 8 0
      src/renderer_d3d12.h

+ 38 - 23
src/renderer_d3d12.cpp

@@ -2391,11 +2391,12 @@ data.NumQualityLevels = 0;
 					texture.setState(m_commandList, D3D12_RESOURCE_STATE_DEPTH_WRITE);
 				}
 
-				m_commandList->OMSetRenderTargets(frameBuffer.m_num
-												, m_currentColor
-												, true
-												, m_currentDepthStencil
-												);
+				m_commandList->OMSetRenderTargets(
+					  frameBuffer.m_num
+					, m_currentColor
+					, true
+					, m_currentDepthStencil
+					);
 			}
 
 			m_fbh = _fbh;
@@ -3218,11 +3219,7 @@ data.NumQualityLevels = 0;
 		bool m_wireframe;
 		bool m_lost;
 
-#if BX_PLATFORM_WINDOWS
 		DXGI_SWAP_CHAIN_DESC m_scd;
-#else
-		DXGI_SWAP_CHAIN_DESC1 m_scd;
-#endif // BX_PLATFORM_WINDOWS
 		uint32_t m_maxAnisotropy;
 		bool m_depthClamp;
 
@@ -3719,7 +3716,7 @@ data.NumQualityLevels = 0;
 	{
 		m_maxDrawPerBatch = _maxDrawPerBatch;
 		setSeqMode(false);
-		setIndirectMode(true);
+		setIndirectMode(false);
 
 		ID3D12Device* device = s_renderD3D12->m_device;
 		ID3D12RootSignature* rootSignature = s_renderD3D12->m_rootSignature;
@@ -4894,8 +4891,38 @@ data.NumQualityLevels = 0;
 		postReset();
 	}
 
-	void FrameBufferD3D12::create(uint16_t /*_denseIdx*/, void* /*_nwh*/, uint32_t /*_width*/, uint32_t /*_height*/, TextureFormat::Enum /*_depthFormat*/)
+	void FrameBufferD3D12::create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat)
 	{
+		DXGI_SWAP_CHAIN_DESC scd;
+		bx::memCopy(&scd, &s_renderD3D12->m_scd, sizeof(DXGI_SWAP_CHAIN_DESC) );
+		scd.BufferDesc.Width  = _width;
+		scd.BufferDesc.Height = _height;
+		scd.OutputWindow = (HWND)_nwh;
+
+		HRESULT hr;
+		hr = s_renderD3D12->m_factory->CreateSwapChain(s_renderD3D12->m_cmd.m_commandQueue
+				, &scd
+				, reinterpret_cast<IDXGISwapChain**>(&m_swapChain)
+				);
+		BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Failed to create swap chain.");
+
+		m_denseIdx = _denseIdx;
+		m_num      = 1;
+	}
+
+	uint16_t FrameBufferD3D12::destroy()
+	{
+		DX_RELEASE(m_swapChain, 0);
+
+		m_numTh = 0;
+		m_needPresent = false;
+
+		m_depth.idx = bgfx::kInvalidHandle;
+
+		uint16_t denseIdx = m_denseIdx;
+		m_denseIdx = UINT16_MAX;
+
+		return denseIdx;
 	}
 
 	void FrameBufferD3D12::preReset()
@@ -5016,18 +5043,6 @@ data.NumQualityLevels = 0;
 		}
 	}
 
-	uint16_t FrameBufferD3D12::destroy()
-	{
-		m_numTh = 0;
-
-		m_depth.idx = bgfx::kInvalidHandle;
-
-		uint16_t denseIdx = m_denseIdx;
-		m_denseIdx = UINT16_MAX;
-
-		return denseIdx;
-	}
-
 	void FrameBufferD3D12::resolve()
 	{
 	}

+ 8 - 0
src/renderer_d3d12.h

@@ -87,6 +87,12 @@ extern "C" uint64_t                    WINAPI bgfx_PIXEventsReplaceBlock(bool _g
 
 namespace bgfx { namespace d3d12
 {
+#if BX_PLATFORM_WINDOWS
+	typedef ::DXGI_SWAP_CHAIN_DESC  DXGI_SWAP_CHAIN_DESC;
+#else
+	typedef ::DXGI_SWAP_CHAIN_DESC1 DXGI_SWAP_CHAIN_DESC;
+#endif // BX_PLATFORM_WINDOWS
+
 	struct Rdt
 	{
 		enum Enum
@@ -341,6 +347,7 @@ namespace bgfx { namespace d3d12
 			, m_denseIdx(UINT16_MAX)
 			, m_num(0)
 			, m_numTh(0)
+			, m_needPresent(false)
 		{
 			m_depth.idx = bgfx::kInvalidHandle;
 		}
@@ -362,6 +369,7 @@ namespace bgfx { namespace d3d12
 		uint8_t m_num;
 		uint8_t m_numTh;
 		Attachment m_attachment[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
+		bool m_needPresent;
 	};
 
 	struct CommandQueueD3D12