diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index ab4a68d6..42bc9073 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -2,6 +2,7 @@ #include "d3d11_context.h" #include "d3d11_device.h" +#include "d3d11_query.h" #include "d3d11_texture.h" #include "../dxbc/dxbc_util.h" @@ -299,8 +300,21 @@ namespace dxvk { void* pData, UINT DataSize, UINT GetDataFlags) { - Logger::err("D3D11DeviceContext::GetData: Not implemented"); - return E_NOTIMPL; + if (pAsync->GetDataSize() != DataSize) { + Logger::err("D3D11DeviceContext: GetData: Data size mismatch"); + return E_INVALIDARG; + } + + // This method handles various different but incompatible interfaces, + // so we have to find out what we are actually dealing with + Com query; + + if (SUCCEEDED(pAsync->QueryInterface(__uuidof(ID3D11Query), reinterpret_cast(&query)))) + return static_cast(query.ptr())->GetData(pData, GetDataFlags); + + // The interface is not supported + Logger::err("D3D11DeviceContext: GetData: Unsupported Async type"); + return E_INVALIDARG; } diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 2f421e73..b0105136 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1058,7 +1058,7 @@ namespace dxvk { return S_FALSE; try { - *ppQuery = new D3D11Query(this, *pQueryDesc); + *ppQuery = ref(new D3D11Query(this, *pQueryDesc)); return S_OK; } catch (const DxvkError& e) { Logger::err(e.message()); diff --git a/src/d3d11/d3d11_query.cpp b/src/d3d11/d3d11_query.cpp index 53f7a8a2..41139406 100644 --- a/src/d3d11/d3d11_query.cpp +++ b/src/d3d11/d3d11_query.cpp @@ -76,4 +76,29 @@ namespace dxvk { *pDesc = m_desc; } + + HRESULT STDMETHODCALLTYPE D3D11Query::GetData( + void* pData, + UINT GetDataFlags) { + static bool errorShown = false; + + if (!std::exchange(errorShown, true)) + Logger::warn("D3D11Query::GetData: Stub"); + + if (pData == nullptr) + return S_OK; + + switch (m_desc.Query) { + case D3D11_QUERY_OCCLUSION: + *static_cast(pData) = 1; + return S_OK; + + case D3D11_QUERY_OCCLUSION_PREDICATE: + *static_cast(pData) = TRUE; + return S_OK; + + default: return E_INVALIDARG; + } + } + } diff --git a/src/d3d11/d3d11_query.h b/src/d3d11/d3d11_query.h index 5297f9d5..682a210d 100644 --- a/src/d3d11/d3d11_query.h +++ b/src/d3d11/d3d11_query.h @@ -26,6 +26,10 @@ namespace dxvk { void STDMETHODCALLTYPE GetDesc( D3D11_QUERY_DESC *pDesc) final; + HRESULT STDMETHODCALLTYPE GetData( + void* pData, + UINT GetDataFlags); + private: D3D11Device* const m_device;