mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-02 10:24:12 +01:00
[d3d11] Flush more aggressively on stalling Event queries
Increases GPU utilization in Quake Champions.
This commit is contained in:
parent
af45f810b2
commit
45be1dfb53
@ -80,17 +80,33 @@ namespace dxvk {
|
||||
SynchronizeCsThread();
|
||||
|
||||
// Get query status directly from the query object
|
||||
HRESULT hr = static_cast<D3D11Query*>(pAsync)->GetData(pData, GetDataFlags);
|
||||
auto query = static_cast<D3D11Query*>(pAsync);
|
||||
HRESULT hr = query->GetData(pData, GetDataFlags);
|
||||
|
||||
// If we're likely going to spin on the asynchronous object,
|
||||
// flush the context so that we're keeping the GPU busy
|
||||
if (hr == S_FALSE)
|
||||
if (hr == S_FALSE) {
|
||||
query->NotifyStall();
|
||||
FlushImplicit(FALSE);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
void STDMETHODCALLTYPE D3D11ImmediateContext::End(ID3D11Asynchronous* pAsync) {
|
||||
D3D11DeviceContext::End(pAsync);
|
||||
|
||||
auto query = static_cast<D3D11Query*>(pAsync);
|
||||
if (unlikely(query && query->IsEvent())) {
|
||||
query->NotifyEnd();
|
||||
query->IsStalling()
|
||||
? Flush()
|
||||
: FlushImplicit(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void STDMETHODCALLTYPE D3D11ImmediateContext::Flush() {
|
||||
m_parent->FlushInitContext();
|
||||
|
||||
|
@ -32,6 +32,8 @@ namespace dxvk {
|
||||
UINT DataSize,
|
||||
UINT GetDataFlags);
|
||||
|
||||
void STDMETHODCALLTYPE End(ID3D11Asynchronous *pAsync);
|
||||
|
||||
void STDMETHODCALLTYPE Flush();
|
||||
|
||||
void STDMETHODCALLTYPE ExecuteCommandList(
|
||||
|
@ -47,6 +47,23 @@ namespace dxvk {
|
||||
|
||||
DxvkBufferSlice GetPredicate(DxvkContext* ctx);
|
||||
|
||||
bool IsEvent() const {
|
||||
return m_desc.Query == D3D11_QUERY_EVENT;
|
||||
}
|
||||
|
||||
bool IsStalling() const {
|
||||
return m_stallFlag;
|
||||
}
|
||||
|
||||
void NotifyEnd() {
|
||||
m_stallMask <<= 1;
|
||||
}
|
||||
|
||||
void NotifyStall() {
|
||||
m_stallMask |= 1;
|
||||
m_stallFlag |= bit::popcnt(m_stallMask) >= 16;
|
||||
}
|
||||
|
||||
D3D10Query* GetD3D10Iface() {
|
||||
return &m_d3d10;
|
||||
}
|
||||
@ -66,6 +83,9 @@ namespace dxvk {
|
||||
|
||||
D3D10Query m_d3d10;
|
||||
|
||||
uint32_t m_stallMask = 0;
|
||||
bool m_stallFlag = false;
|
||||
|
||||
UINT64 GetTimestampQueryFrequency() const;
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user