From a9b6421f603db2ebf796969378fa60b85f5da2b3 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 19 Mar 2020 23:29:32 +0100 Subject: [PATCH] [d3d11] Support signaling event in Flush1 --- src/d3d11/d3d11_context_imm.cpp | 19 ++++++++++++++++++- src/d3d11/d3d11_context_imm.h | 7 +++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp index a0c5ff09..c88833d9 100644 --- a/src/d3d11/d3d11_context_imm.cpp +++ b/src/d3d11/d3d11_context_imm.cpp @@ -156,7 +156,7 @@ namespace dxvk { m_parent->FlushInitContext(); if (hEvent) - Logger::warn("D3D11: Flush1: Ignoring event"); + SignalEvent(hEvent); D3D10DeviceLock lock = LockContext(); @@ -646,5 +646,22 @@ namespace dxvk { Flush(); } } + + + void D3D11ImmediateContext::SignalEvent(HANDLE hEvent) { + uint64_t value = ++m_eventCount; + + if (m_eventSignal == nullptr) + m_eventSignal = new sync::Win32Fence(); + + m_eventSignal->setEvent(hEvent, value); + + EmitCs([ + cSignal = m_eventSignal, + cValue = value + ] (DxvkContext* ctx) { + ctx->signal(cSignal, cValue); + }); + } } diff --git a/src/d3d11/d3d11_context_imm.h b/src/d3d11/d3d11_context_imm.h index 51c7d7a3..02e72f1e 100644 --- a/src/d3d11/d3d11_context_imm.h +++ b/src/d3d11/d3d11_context_imm.h @@ -2,6 +2,8 @@ #include "../util/util_time.h" +#include "../util/sync/sync_signal_win32.h" + #include "d3d11_context.h" #include "d3d11_state_object.h" @@ -116,6 +118,9 @@ namespace dxvk { std::atomic m_refCount = { 0 }; + Rc m_eventSignal; + uint64_t m_eventCount = 0; + dxvk::high_resolution_clock::time_point m_lastFlush = dxvk::high_resolution_clock::now(); @@ -148,6 +153,8 @@ namespace dxvk { void EmitCsChunk(DxvkCsChunkRef&& chunk); void FlushImplicit(BOOL StrongHint); + + void SignalEvent(HANDLE hEvent); };