[d3d11] Implicitly begin scoped queries in End if necessary

Matches (undocumented) D3D11 behaviour. Warriors Orochi 4 runs into
this because it does not begin some of its timestamp disjoint queries
before ending them and retrieving data.
This commit is contained in:
Philip Rebohle 2020-01-22 04:17:13 +01:00
parent 35a9934cde
commit a57dc75247
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 19 additions and 9 deletions

View File

@ -80,10 +80,14 @@ namespace dxvk {
m_queriesBegun.begin(),
m_queriesBegun.end(), query);
if (unlikely(entry == m_queriesBegun.end()))
return;
m_queriesBegun.erase(entry);
if (likely(entry != m_queriesBegun.end())) {
m_queriesBegun.erase(entry);
} else {
EmitCs([cQuery = query]
(DxvkContext* ctx) {
cQuery->Begin(ctx);
});
}
}
m_commandList->AddQuery(query.ptr());

View File

@ -124,8 +124,12 @@ namespace dxvk {
auto query = static_cast<D3D11Query*>(pAsync);
if (unlikely(!query->DoEnd()))
return;
if (unlikely(!query->DoEnd())) {
EmitCs([cQuery = Com<D3D11Query, false>(query)]
(DxvkContext* ctx) {
cQuery->Begin(ctx);
});
}
EmitCs([cQuery = Com<D3D11Query, false>(query)]
(DxvkContext* ctx) {

View File

@ -228,12 +228,14 @@ namespace dxvk {
}
bool STDMETHODCALLTYPE D3D11Query::DoEnd() {
if (IsScoped() && m_state != D3D11_VK_QUERY_BEGUN)
return false;
// Apparently the D3D11 runtime implicitly begins the query
// if it is in the wrong state at the time End is called, so
// let the caller react to it instead of just failing here.
bool result = m_state == D3D11_VK_QUERY_BEGUN || !IsScoped();
m_state = D3D11_VK_QUERY_ENDED;
m_resetCtr.fetch_add(1, std::memory_order_acquire);
return true;
return result;
}