From 1f004472cccf313547677074d2e284c6dd290649 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Mon, 18 Dec 2017 21:34:44 +1100 Subject: [PATCH] [host] dxgi: re-mapping is required to sync memory changes properly --- host/Capture/DXGI.cpp | 53 +++++++++++++++++-------------------------- host/Capture/DXGI.h | 3 --- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/host/Capture/DXGI.cpp b/host/Capture/DXGI.cpp index 1527cb86..c7af6625 100644 --- a/host/Capture/DXGI.cpp +++ b/host/Capture/DXGI.cpp @@ -186,25 +186,6 @@ bool DXGI::Initialize(CaptureOptions * options) DeInitialize(); return false; } - - status = m_deviceContext->Map(m_texture, 0, D3D11_MAP_READ, 0, &m_mapping); - if (FAILED(status)) - { - DEBUG_ERROR("Failed to map the texture: %08x", (int)status); - DeInitialize(); - 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; @@ -212,9 +193,6 @@ bool DXGI::Initialize(CaptureOptions * options) void DXGI::DeInitialize() { - if (m_eventQuery) - m_eventQuery.Release(); - if (m_releaseFrame) { m_releaseFrame = false; @@ -303,6 +281,7 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) { m_releaseFrame = false; status = m_dup->ReleaseFrame(); + switch (status) { case S_OK: @@ -325,8 +304,8 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) continue; // send the last frame again if we timeout to prevent the client stalling on restart - frame.width = m_desc.Width; - frame.height = m_desc.Height; + frame.width = m_width; + frame.height = m_height; frame.pitch = m_mapping.RowPitch; frame.stride = m_mapping.RowPitch / 4; @@ -445,22 +424,32 @@ GrabStatus DXGI::GrabFrame(FrameInfo & frame) return GRAB_STATUS_ERROR; } - src->GetDesc(&m_desc); m_deviceContext->CopyResource(m_texture, src); - m_deviceContext->End(m_eventQuery); - src.Release(); + src.Release(); - m_width = m_desc.Width; - m_height = m_desc.Height; + if (m_surfaceMapped) + { + m_deviceContext->Unmap(m_texture, 0); + m_surfaceMapped = false; + } - frame.width = m_desc.Width; - frame.height = m_desc.Height; + status = m_deviceContext->Map(m_texture, 0, D3D11_MAP_READ, 0, &m_mapping); + if (FAILED(status)) + { + DEBUG_ERROR("Failed to map the texture: %08x", (int)status); + DeInitialize(); + return GRAB_STATUS_ERROR; + } + m_surfaceMapped = true; + + frame.width = m_width; + frame.height = m_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)) {} +// 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 6b454884..3dc6300a 100644 --- a/host/Capture/DXGI.h +++ b/host/Capture/DXGI.h @@ -32,7 +32,6 @@ _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,8 +83,6 @@ namespace Capture IDXGIOutputDuplicationPtr m_dup; 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;