platform/windows: add optional DwmFlush() call to improve Windows capture

Invoke DwmFlush() before acquiring the next frame to alleviate visual stutter
during mouse movement at the cost of constraining the capture rate to the host's
monitor refresh.

Disabled by default; enable via "dwmflush" boolean configuration parameter.
This commit is contained in:
Conn O'Griofa
2022-05-18 18:20:33 +01:00
parent d051b58190
commit 211b25848f
7 changed files with 45 additions and 5 deletions
+5 -3
View File
@@ -226,9 +226,10 @@ video_t video {
1,
-1 }, // vt
{}, // encoder
{}, // adapter_name
{}, // output_name
{}, // encoder
{}, // adapter_name
{}, // output_name
false // dwmflush
};
audio_t audio {};
@@ -735,6 +736,7 @@ void apply_config(std::unordered_map<std::string, std::string> &&vars) {
string_f(vars, "encoder", video.encoder);
string_f(vars, "adapter_name", video.adapter_name);
string_f(vars, "output_name", video.output_name);
bool_f(vars, "dwmflush", video.dwmflush);
path_f(vars, "pkey", nvhttp.pkey);
path_f(vars, "cert", nvhttp.cert);
+1
View File
@@ -44,6 +44,7 @@ struct video_t {
std::string encoder;
std::string adapter_name;
std::string output_name;
bool dwmflush;
};
struct audio_t {
+2 -1
View File
@@ -8,6 +8,7 @@
#include <d3d11.h>
#include <d3d11_4.h>
#include <d3dcommon.h>
#include <dwmapi.h>
#include <dxgi.h>
#include <dxgi1_2.h>
@@ -172,4 +173,4 @@ public:
};
} // namespace platf::dxgi
#endif
#endif
@@ -20,6 +20,10 @@ capture_e duplication_t::next_frame(DXGI_OUTDUPL_FRAME_INFO &frame_info, std::ch
return capture_status;
}
if(config::video.dwmflush) {
DwmFlush();
}
auto status = dup->AcquireNextFrame(timeout.count(), &frame_info, res_p);
switch(status) {