1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-12 13:08:50 +01:00

[d3d11] Determine pending commands based on sequence number

We get this for free and this allows us to query how many CS chunks
have been emitted since the last flush.
This commit is contained in:
Philip Rebohle 2023-01-14 14:30:30 +01:00 committed by Philip Rebohle
parent 0ac247c89c
commit f952418958
2 changed files with 12 additions and 8 deletions

View File

@ -170,7 +170,7 @@ namespace dxvk {
D3D10DeviceLock lock = LockContext(); D3D10DeviceLock lock = LockContext();
if (m_csIsBusy || !m_csChunk->empty()) { if (GetPendingCsChunks()) {
// Add commands to flush the threaded // Add commands to flush the threaded
// context, then flush the command list // context, then flush the command list
EmitCs([] (DxvkContext* ctx) { EmitCs([] (DxvkContext* ctx) {
@ -181,7 +181,7 @@ namespace dxvk {
// Reset flush timer used for implicit flushes // Reset flush timer used for implicit flushes
m_lastFlush = dxvk::high_resolution_clock::now(); m_lastFlush = dxvk::high_resolution_clock::now();
m_csIsBusy = false; m_flushSeqNum = m_csSeqNum;
} }
} }
@ -257,10 +257,6 @@ namespace dxvk {
RestoreCommandListState(); RestoreCommandListState();
else else
ResetContextState(); ResetContextState();
// Mark CS thread as busy so that subsequent
// flush operations get executed correctly.
m_csIsBusy = true;
} }
@ -833,7 +829,6 @@ namespace dxvk {
void D3D11ImmediateContext::EmitCsChunk(DxvkCsChunkRef&& chunk) { void D3D11ImmediateContext::EmitCsChunk(DxvkCsChunkRef&& chunk) {
m_csSeqNum = m_csThread.dispatchChunk(std::move(chunk)); m_csSeqNum = m_csThread.dispatchChunk(std::move(chunk));
m_csIsBusy = true;
} }
@ -864,6 +859,11 @@ namespace dxvk {
} }
uint64_t D3D11ImmediateContext::GetPendingCsChunks() {
return GetCurrentSequenceNumber() - m_flushSeqNum;
}
void D3D11ImmediateContext::FlushImplicit(BOOL StrongHint) { void D3D11ImmediateContext::FlushImplicit(BOOL StrongHint) {
// Flush only if the GPU is about to go idle, in // Flush only if the GPU is about to go idle, in
// order to keep the number of submissions low. // order to keep the number of submissions low.

View File

@ -88,7 +88,6 @@ namespace dxvk {
DxvkCsThread m_csThread; DxvkCsThread m_csThread;
uint64_t m_csSeqNum = 0ull; uint64_t m_csSeqNum = 0ull;
bool m_csIsBusy = false;
Rc<sync::CallbackFence> m_eventSignal; Rc<sync::CallbackFence> m_eventSignal;
uint64_t m_eventCount = 0ull; uint64_t m_eventCount = 0ull;
@ -96,6 +95,9 @@ namespace dxvk {
VkDeviceSize m_maxImplicitDiscardSize = 0ull; VkDeviceSize m_maxImplicitDiscardSize = 0ull;
uint64_t m_flushSeqNum = 0ull;
dxvk::high_resolution_clock::time_point m_lastFlush dxvk::high_resolution_clock::time_point m_lastFlush
= dxvk::high_resolution_clock::now(); = dxvk::high_resolution_clock::now();
@ -158,6 +160,8 @@ namespace dxvk {
uint64_t GetCurrentSequenceNumber(); uint64_t GetCurrentSequenceNumber();
uint64_t GetPendingCsChunks();
void FlushImplicit(BOOL StrongHint); void FlushImplicit(BOOL StrongHint);
void SignalEvent(HANDLE hEvent); void SignalEvent(HANDLE hEvent);