diff --git a/host/Capture/DXGI.cpp b/host/Capture/DXGI.cpp index 6f55711d..1527cb86 100644 --- a/host/Capture/DXGI.cpp +++ b/host/Capture/DXGI.cpp @@ -195,6 +195,16 @@ bool DXGI::Initialize(CaptureOptions * options) return false; } m_surfaceMapped = true; + + D3D11_QUERY_DESC qd; + qd.MiscFlags = 0; + qd.Query = D3D11_QUERY_EVENT; + if (FAILED(m_device->CreateQuery(&qd, &this->m_eventQuery))) + { + DEBUG_ERROR("Failed to create event query"); + DeInitialize(); + return false; + } m_initialized = true; return true; @@ -202,6 +212,9 @@ bool DXGI::Initialize(CaptureOptions * options) void DXGI::DeInitialize() { + if (m_eventQuery) + m_eventQuery.Release(); + if (m_releaseFrame) { m_releaseFrame = false; @@ -434,6 +447,7 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) src->GetDesc(&m_desc); m_deviceContext->CopyResource(m_texture, src); + m_deviceContext->End(m_eventQuery); src.Release(); m_width = m_desc.Width; @@ -443,8 +457,10 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) frame.height = m_desc.Height; frame.pitch = m_mapping.RowPitch; frame.stride = m_mapping.RowPitch / 4; - unsigned int size = m_height * m_mapping.RowPitch; + + // wait for the copy to complete before trying to perform the copy + while(S_FALSE == m_deviceContext->GetData(m_eventQuery, NULL, 0, 0)) {} memcpySSE(frame.buffer, m_mapping.pData, size < frame.bufferSize ? size : frame.bufferSize); return GRAB_STATUS_OK; diff --git a/host/Capture/DXGI.h b/host/Capture/DXGI.h index b0689917..6b454884 100644 --- a/host/Capture/DXGI.h +++ b/host/Capture/DXGI.h @@ -32,6 +32,7 @@ _COM_SMARTPTR_TYPEDEF(IDXGIFactory1 , __uuidof(IDXGIFactory1 )); _COM_SMARTPTR_TYPEDEF(ID3D11Device , __uuidof(ID3D11Device )); _COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext , __uuidof(ID3D11DeviceContext )); _COM_SMARTPTR_TYPEDEF(IDXGIDevice , __uuidof(IDXGIDevice )); +_COM_SMARTPTR_TYPEDEF(ID3D11Query , __uuidof(ID3D11Query )); _COM_SMARTPTR_TYPEDEF(IDXGIOutput1 , __uuidof(IDXGIOutput1 )); _COM_SMARTPTR_TYPEDEF(IDXGIOutput , __uuidof(IDXGIOutput )); _COM_SMARTPTR_TYPEDEF(IDXGIAdapter1 , __uuidof(IDXGIAdapter1 )); @@ -84,6 +85,7 @@ namespace Capture bool m_releaseFrame; ID3D11Texture2DPtr m_texture; D3D11_TEXTURE2D_DESC m_desc; + ID3D11QueryPtr m_eventQuery; D3D11_MAPPED_SUBRESOURCE m_mapping; bool m_surfaceMapped; BYTE * m_pointer;