diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12videosink.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12videosink.cpp index f2b240e424..b1814939f4 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12videosink.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12videosink.cpp @@ -1532,7 +1532,7 @@ gst_d3d12_video_sink_overlay_expose (GstVideoOverlay * overlay) auto self = GST_D3D12_VIDEO_SINK (overlay); auto priv = self->priv; - gst_d3d12_window_set_buffer (priv->window, nullptr); + gst_d3d12_window_expose (priv->window); } static void diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.cpp index 9c3f0fbcb1..8d514033e3 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.cpp @@ -585,6 +585,18 @@ SwapChain::present () return GST_FLOW_OK; } +void +SwapChain::expose (GstD3D12Window * window) +{ + std::lock_guard lk (lock_); + if (!resource_->swapchain || !resource_->cached_buf) + return; + + auto ret = set_buffer (window, resource_->cached_buf); + if (ret == GST_FLOW_OK) + present (); +} + void SwapChain::before_rendering () { diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.h b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.h index d9d2e98948..8a67e5e0c2 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.h +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-swapchain.h @@ -40,6 +40,7 @@ public: GstFlowReturn resize_buffer (GstD3D12Window * window); GstFlowReturn set_buffer (GstD3D12Window * window, GstBuffer * buffer); GstFlowReturn present (); + void expose (GstD3D12Window * window); private: void before_rendering (); diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.cpp index 27a6db3937..b5d3bb091f 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.cpp @@ -547,6 +547,14 @@ SwapChainProxy::present () return sc->present (); } +void +SwapChainProxy::expose () +{ + auto sc = get_swapchain (); + if (sc) + sc->expose (window_); +} + void HwndServer::register_window (GstD3D12Window * window) { diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.h b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.h index 85a3e81f65..af916a03ef 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.h +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window-win32.h @@ -69,6 +69,7 @@ public: GstFlowReturn resize_buffer (INT width, INT height); GstFlowReturn set_buffer (GstBuffer * buffer); GstFlowReturn present (); + void expose (); private: std::shared_ptr get_swapchain (); diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.cpp index 02cf9d54e2..cd8bc7bef6 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.cpp @@ -720,6 +720,16 @@ gst_d3d12_window_render (GstD3D12Window * self, SwapChainResource * resource, return GST_FLOW_OK; } +void +gst_d3d12_window_expose (GstD3D12Window * window) +{ + auto priv = window->priv; + auto proxy = priv->proxy.lock (); + + if (proxy) + proxy->expose (); +} + GstFlowReturn gst_d3d12_window_set_buffer (GstD3D12Window * window, GstBuffer * buffer) { diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.h b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.h index 959cb8b848..f896d4c11c 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.h +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12window.h @@ -76,6 +76,8 @@ void gst_d3d12_window_unlock (GstD3D12Window * window); void gst_d3d12_window_unlock_stop (GstD3D12Window * window); +void gst_d3d12_window_expose (GstD3D12Window * window); + GstFlowReturn gst_d3d12_window_set_buffer (GstD3D12Window * window, GstBuffer * buffer);