bkaradzic 13 лет назад
Родитель
Сommit
4eace601ec
1 измененных файлов с 67 добавлено и 3 удалено
  1. 67 3
      src/renderer_d3d11.cpp

+ 67 - 3
src/renderer_d3d11.cpp

@@ -279,7 +279,9 @@ namespace bgfx
 	struct RendererContext
 	{
 		RendererContext()
-			: m_wireframe(false)
+			: m_captureTexture(NULL)
+			, m_captureResolve(NULL)
+			, m_wireframe(false)
 			, m_vsChanges(0)
 			, m_fsChanges(0)
 		{
@@ -766,16 +768,74 @@ namespace bgfx
 			commitTextureStage();
 		}
 
-		void capturePreReset()
+		void capturePostReset()
 		{
+			ID3D11Texture2D* backBuffer;
+			DX_CHECK(m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer) );
+
+			D3D11_TEXTURE2D_DESC backBufferDesc;
+			backBuffer->GetDesc(&backBufferDesc);
+
+			D3D11_TEXTURE2D_DESC desc;
+			memcpy(&desc, &backBufferDesc, sizeof(desc) );
+			desc.SampleDesc.Count = 1;
+			desc.SampleDesc.Quality = 0;
+			desc.Usage = D3D11_USAGE_STAGING;
+			desc.BindFlags = 0;
+			desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+
+			HRESULT hr = m_device->CreateTexture2D(&desc, NULL, &m_captureTexture);
+			if (SUCCEEDED(hr) )
+			{
+				if (backBufferDesc.SampleDesc.Count != 1)
+				{
+					desc.Usage = D3D11_USAGE_DEFAULT;
+					desc.CPUAccessFlags = 0;
+					m_device->CreateTexture2D(&desc, NULL, &m_captureResolve);
+				}
+
+				g_callback->captureBegin(backBufferDesc.Width, backBufferDesc.Height, backBufferDesc.Width*4, TextureFormat::BGRA8, false);
+			}
+
+			DX_RELEASE(backBuffer, 0);
 		}
 
-		void capturePostReset()
+		void capturePreReset()
 		{
+			if (NULL != m_captureTexture)
+			{
+				g_callback->captureEnd();
+			}
+
+			DX_RELEASE(m_captureResolve, 0);
+			DX_RELEASE(m_captureTexture, 0);
 		}
 
 		void capture()
 		{
+			ID3D11Texture2D* backBuffer;
+			DX_CHECK(m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer) );
+
+			DXGI_MODE_DESC& desc = m_scd.BufferDesc;
+
+			if (NULL == m_captureResolve)
+			{
+				m_deviceCtx->CopyResource(m_captureTexture, backBuffer);
+			}
+			else
+			{
+				m_deviceCtx->ResolveSubresource(m_captureResolve, 0, backBuffer, 0, desc.Format);
+				m_deviceCtx->CopyResource(m_captureTexture, m_captureResolve);
+			}
+
+			D3D11_MAPPED_SUBRESOURCE mapped;
+			DX_CHECK(m_deviceCtx->Map(m_captureTexture, 0, D3D11_MAP_READ, 0, &mapped) );
+
+			g_callback->captureFrame(mapped.pData, desc.Height*mapped.RowPitch);
+
+			m_deviceCtx->Unmap(m_captureTexture, 0);
+
+			DX_RELEASE(backBuffer, 0);
 		}
 
 		void saveScreenShot(Memory* _mem)
@@ -843,6 +903,10 @@ namespace bgfx
 		ID3D11RenderTargetView* m_currentColor;
 		ID3D11DepthStencilView* m_currentDepthStencil;
 
+		ID3D11Texture2D* m_captureTexture;
+		ID3D11Texture2D* m_captureResolve;
+		DXGI_FORMAT m_captureFormat;
+
 		bool m_wireframe;
 
 		DXGI_SWAP_CHAIN_DESC m_scd;