Skip to content

Commit

Permalink
[d3d11] Implicitly begin scoped queries in End if necessary
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
doitsujin committed Jan 22, 2020
1 parent 35a9934 commit a57dc75
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 9 deletions.
12 changes: 8 additions & 4 deletions src/d3d11/d3d11_context_def.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
8 changes: 6 additions & 2 deletions src/d3d11/d3d11_context_imm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 5 additions & 3 deletions src/d3d11/d3d11_query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}


Expand Down

0 comments on commit a57dc75

Please sign in to comment.