d3d11videosink: Always clear back buffer on resize
authorSeungha Yang <seungha@centricular.com>
Sat, 5 Nov 2022 12:35:08 +0000 (21:35 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 5 Nov 2022 17:23:24 +0000 (17:23 +0000)
Swapchain may not need to be resized if the size of backbuffer
is equal to the previous size. Then previously rendered frame will be stay
on the screen. Do clear back buffer whenever resize() is called

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3341>

subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window.cpp

index 1e4894d..b4de7a6 100644 (file)
@@ -299,8 +299,10 @@ gst_d3d11_window_on_resize_default (GstD3D11Window * self, guint width,
   GstMemory *mem;
   GstD3D11Memory *dmem;
   ID3D11RenderTargetView *rtv;
+  ID3D11DeviceContext *context;
   gsize size;
   GstD3D11DeviceLockGuard lk (device);
+  const FLOAT clear_color[] = { 0.0, 0.0, 0.0, 1.0 };
 
   gst_clear_buffer (&self->backbuffer);
   if (!self->swap_chain)
@@ -348,6 +350,9 @@ gst_d3d11_window_on_resize_default (GstD3D11Window * self, guint width,
     return;
   }
 
+  context = gst_d3d11_device_get_device_context_handle (self->device);
+  context->ClearRenderTargetView (rtv, clear_color);
+
   self->backbuffer = gst_buffer_new ();
   gst_buffer_append_memory (self->backbuffer, mem);