86 cursor_view { 0, 0, 0, 0, 0.0f, 1.0f } {};
89 set_pos(LONG topleft_x, LONG topleft_y, LONG display_width, LONG display_height, DXGI_MODE_ROTATION display_rotation,
bool visible) {
90 this->topleft_x = topleft_x;
91 this->topleft_y = topleft_y;
92 this->display_width = display_width;
93 this->display_height = display_height;
94 this->display_rotation = display_rotation;
95 this->visible = visible;
100 set_texture(LONG texture_width, LONG texture_height,
texture2d_t &&texture) {
101 this->texture = std::move(texture);
102 this->texture_width = texture_width;
103 this->texture_height = texture_height;
109 switch (display_rotation) {
110 case DXGI_MODE_ROTATION_UNSPECIFIED:
111 case DXGI_MODE_ROTATION_IDENTITY:
112 cursor_view.TopLeftX = topleft_x;
113 cursor_view.TopLeftY = topleft_y;
114 cursor_view.Width = texture_width;
115 cursor_view.Height = texture_height;
118 case DXGI_MODE_ROTATION_ROTATE90:
119 cursor_view.TopLeftX = topleft_y;
120 cursor_view.TopLeftY = display_width - texture_width - topleft_x;
121 cursor_view.Width = texture_height;
122 cursor_view.Height = texture_width;
125 case DXGI_MODE_ROTATION_ROTATE180:
126 cursor_view.TopLeftX = display_width - texture_width - topleft_x;
127 cursor_view.TopLeftY = display_height - texture_height - topleft_y;
128 cursor_view.Width = texture_width;
129 cursor_view.Height = texture_height;
132 case DXGI_MODE_ROTATION_ROTATE270:
133 cursor_view.TopLeftX = display_height - texture_height - topleft_y;
134 cursor_view.TopLeftY = topleft_x;
135 cursor_view.Width = texture_height;
136 cursor_view.Height = texture_width;
150 DXGI_MODE_ROTATION display_rotation;
154 D3D11_VIEWPORT cursor_view;
162 init(const ::video::config_t &config,
const std::string &display_name);
172 DXGI_RATIONAL display_refresh_rate;
173 int display_refresh_rate_rounded;
175 DXGI_MODE_ROTATION display_rotation = DXGI_MODE_ROTATION_UNSPECIFIED;
176 int width_before_rotation;
177 int height_before_rotation;
179 int client_frame_rate;
181 DXGI_FORMAT capture_format;
182 D3D_FEATURE_LEVEL feature_level;
193 } D3DKMT_SCHEDULINGPRIORITYCLASS;
195 typedef UINT D3DKMT_HANDLE;
199 D3DKMT_HANDLE hAdapter;
206 UINT HwSchSupported : 1;
207 UINT HwSchEnabled : 1;
208 UINT HwSchEnabledByDefault : 1;
209 UINT IndependentVidPnVSyncControl : 1;
217 D3DKMT_HANDLE hAdapter;
219 VOID *pPrivateDriverData;
220 UINT PrivateDriverDataSize;
223 const UINT KMTQAITYPE_WDDM_2_7_CAPS = 70;
226 D3DKMT_HANDLE hAdapter;
229 typedef NTSTATUS(WINAPI *PD3DKMTSetProcessSchedulingPriorityClass)(HANDLE, D3DKMT_SCHEDULINGPRIORITYCLASS);
237 get_hdr_metadata(SS_HDR_METADATA &metadata)
override;
240 dxgi_format_to_string(DXGI_FORMAT format);
242 colorspace_to_string(DXGI_COLOR_SPACE_TYPE type);
243 virtual std::vector<DXGI_FORMAT>
244 get_supported_capture_formats() = 0;
249 return (capture_format == DXGI_FORMAT_R16G16B16A16_FLOAT) ? 8 : 4;
253 snapshot(
const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr<platf::img_t> &img_out, std::chrono::milliseconds timeout,
bool cursor_visible) = 0;
255 release_snapshot() = 0;
257 complete_img(
img_t *img,
bool dummy) = 0;
286 std::shared_ptr<img_t>
287 alloc_img()
override;
289 dummy_img(
img_t *img_base)
override;
291 complete_img(
img_t *img_base,
bool dummy)
override;
292 std::vector<DXGI_FORMAT>
293 get_supported_capture_formats()
override;
298 std::unique_ptr<avcodec_encode_device_t>
299 make_avcodec_encode_device(
pix_fmt_e pix_fmt)
override;
301 std::unique_ptr<nvenc_encode_device_t>
302 make_nvenc_encode_device(
pix_fmt_e pix_fmt)
override;
304 std::atomic<uint32_t> next_image_id;
314 std::chrono::steady_clock::time_point last_protected_content_warning_time {};
319 next_frame(DXGI_OUTDUPL_FRAME_INFO &frame_info, std::chrono::milliseconds
timeout, resource_t::pointer *res_p);
321 reset(dup_t::pointer dup_p = dup_t::pointer());
350 init(const ::video::config_t &config,
const std::string &display_name);
352 snapshot(
const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr<platf::img_t> &img_out, std::chrono::milliseconds
timeout,
bool cursor_visible)
override;
354 release_snapshot()
override;
370 std::chrono::steady_clock::time_point old_surface_timestamp;
371 std::variant<std::monostate, texture2d_t, std::shared_ptr<platf::img_t>> last_frame_variant;
378 winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice uwp_device {
nullptr };
379 winrt::Windows::Graphics::Capture::GraphicsCaptureItem item {
nullptr };
380 winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool frame_pool {
nullptr };
381 winrt::Windows::Graphics::Capture::GraphicsCaptureSession capture_session {
nullptr };
382 winrt::Windows::Graphics::Capture::Direct3D11CaptureFrame produced_frame {
nullptr }, consumed_frame {
nullptr };
383 SRWLOCK frame_lock = SRWLOCK_INIT;
384 CONDITION_VARIABLE frame_present_cv;
387 on_frame_arrived(winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool
const &sender, winrt::Windows::Foundation::IInspectable
const &);
396 next_frame(std::chrono::milliseconds
timeout, ID3D11Texture2D **out, uint64_t &out_time);
400 set_cursor_visible(
bool);
std::function< bool(std::shared_ptr< img_t > &&img, bool frame_captured)> push_captured_image_cb_t
Callback for when a new image is ready. When display has a new image ready or a timeout occurs,...
Definition common.h:457
capture_e capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override
Capture a frame.
Definition display_base.cpp:199
bool is_codec_supported(std::string_view name, const ::video::config_t &config) override
Check that a given codec is supported by the display device.
Definition display_vram.cpp:1841
capture_e snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr< platf::img_t > &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override
Get the next frame from the Windows.Graphics.Capture API and copy it into a new snapshot texture.
Definition display_wgc.cpp:248
capture_e snapshot(const pull_free_image_cb_t &pull_free_image_cb, std::shared_ptr< platf::img_t > &img_out, std::chrono::milliseconds timeout, bool cursor_visible) override
Definition display_vram.cpp:1640
capture_e next_frame(std::chrono::milliseconds timeout, ID3D11Texture2D **out, uint64_t &out_time)
Get the next frame from the producer thread. If not available, the capture thread blocks until one is...
Definition display_wgc.cpp:182
std::shared_ptr< display_t > display(mem_type_e hwdevice_type, const std::string &display_name, const video::config_t &config)
Get the display_t instance for the given hwdevice_type. If display_name is empty, use the first monit...
Definition misc.cpp:909