d3d11window: Invoke initial resize method from baseclass
authorSeungha Yang <seungha.yang@navercorp.com>
Fri, 10 Jan 2020 12:45:43 +0000 (21:45 +0900)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 5 Feb 2020 00:52:48 +0000 (00:52 +0000)
... instead of calling from subclass in order for baseclass to handle
more things between swapchain creation and resource creation.

sys/d3d11/gstd3d11window.cpp
sys/d3d11/gstd3d11window.h
sys/d3d11/gstd3d11window_corewindow.cpp
sys/d3d11/gstd3d11window_swapchainpanel.cpp
sys/d3d11/gstd3d11window_win32.cpp

index 96f26ef..d9fb46e 100644 (file)
@@ -103,6 +103,8 @@ static void gst_d3d11_window_get_property (GObject * object, guint prop_id,
 static void gst_d3d11_window_dispose (GObject * object);
 static GstFlowReturn gst_d3d111_window_present (GstD3D11Window * self,
     GstBuffer * buffer);
+static void gst_d3d11_window_on_resize_default (GstD3D11Window * window,
+    guint width, guint height);
 
 static void
 gst_d3d11_window_class_init (GstD3D11WindowClass * klass)
@@ -113,6 +115,8 @@ gst_d3d11_window_class_init (GstD3D11WindowClass * klass)
   gobject_class->get_property = gst_d3d11_window_get_property;
   gobject_class->dispose = gst_d3d11_window_dispose;
 
+  klass->on_resize = GST_DEBUG_FUNCPTR (gst_d3d11_window_on_resize_default);
+
   g_object_class_install_property (gobject_class, PROP_D3D11_DEVICE,
       g_param_spec_object ("d3d11device", "D3D11 Device",
           "GstD3D11Device object for creating swapchain",
@@ -283,8 +287,9 @@ gst_d3d11_window_dispose (GObject * object)
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
-void
-gst_d3d11_window_on_resize (GstD3D11Window * window, guint width, guint height)
+static void
+gst_d3d11_window_on_resize_default (GstD3D11Window * window, guint width,
+    guint height)
 {
   HRESULT hr;
   ID3D11Device *device_handle;
@@ -690,6 +695,9 @@ gst_d3d11_window_prepare (GstD3D11Window * window, guint width, guint height,
   }
 #endif
 
+  /* call resize to allocated resources */
+  klass->on_resize (window, width, height);
+
   if (window->requested_fullscreen != window->fullscreen) {
     klass->change_fullscreen_mode (window);
   }
index 60ba7b8..f1ecf20 100644 (file)
@@ -134,6 +134,10 @@ struct _GstD3D11WindowClass
   gboolean      (*unlock)                 (GstD3D11Window * window);
 
   gboolean      (*unlock_stop)            (GstD3D11Window * window);
+
+  void          (*on_resize)              (GstD3D11Window * window,
+                                           guint width,
+                                           guint height);
 };
 
 GType         gst_d3d11_window_get_type             (void);
@@ -161,10 +165,6 @@ gboolean      gst_d3d11_window_unlock               (GstD3D11Window * window);
 
 gboolean      gst_d3d11_window_unlock_stop          (GstD3D11Window * window);
 
-void          gst_d3d11_window_on_resize            (GstD3D11Window * window,
-                                                     guint width,
-                                                     guint height);
-
 void          gst_d3d11_window_on_key_event         (GstD3D11Window * window,
                                                      const gchar * event,
                                                      const gchar * key);
index 10e98bd..0bf8394 100644 (file)
@@ -94,8 +94,10 @@ gst_d3d11_window_core_window_unlock (GstD3D11Window * window);
 static gboolean
 gst_d3d11_window_core_window_unlock_stop (GstD3D11Window * window);
 static void
-gst_d3d11_window_core_window_on_resize (GstD3D11WindowCoreWindow * self,
+gst_d3d11_window_core_window_on_resize (GstD3D11Window * window,
     guint width, guint height);
+static void
+gst_d3d11_window_core_window_on_resize_sync (GstD3D11Window * window);
 
 static float
 get_logical_dpi (void)
@@ -130,7 +132,7 @@ class CoreResizeHandler
 {
 public:
   CoreResizeHandler () {}
-  HRESULT RuntimeClassInitialize (GstD3D11WindowCoreWindow * listener)
+  HRESULT RuntimeClassInitialize (GstD3D11Window * listener)
   {
     if (!listener)
       return E_INVALIDARG;
@@ -151,7 +153,9 @@ public:
         width = (guint) dip_to_pixel (new_size.Width);
         height = (guint) dip_to_pixel (new_size.Height);
 
-        gst_d3d11_window_core_window_on_resize (window, width, height);
+        window->surface_width = width;
+        window->surface_height = height;
+        gst_d3d11_window_core_window_on_resize_sync (window);
       }
     }
 
@@ -159,7 +163,7 @@ public:
   }
 
 private:
-  GstD3D11WindowCoreWindow * window;
+  GstD3D11Window * window;
 };
 
 template <typename CB>
@@ -253,6 +257,8 @@ gst_d3d11_window_core_window_class_init (GstD3D11WindowCoreWindowClass * klass)
       GST_DEBUG_FUNCPTR (gst_d3d11_window_core_window_unlock);
   window_class->unlock_stop =
       GST_DEBUG_FUNCPTR (gst_d3d11_window_core_window_unlock_stop);
+  window_class->on_resize =
+      GST_DEBUG_FUNCPTR (gst_d3d11_window_core_window_on_resize);
 }
 
 static void
@@ -299,7 +305,7 @@ gst_d3d11_window_core_window_constructed (GObject * object)
   window->surface_width = size.Width;
   window->surface_height = size.Height;
 
-  hr = MakeAndInitialize<CoreResizeHandler>(&resize_handler, self);
+  hr = MakeAndInitialize<CoreResizeHandler>(&resize_handler, window);
   if (!gst_d3d11_result (hr, NULL))
     goto error;
 
@@ -389,13 +395,6 @@ gst_d3d11_window_core_window_create_swap_chain (GstD3D11Window * window,
 
   new_swapchain.CopyTo (swap_chain);
 
-  run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
-      [window] {
-        gst_d3d11_window_on_resize (window,
-            window->surface_width, window->surface_height);
-        return S_OK;
-      });
-
   return TRUE;
 }
 
@@ -450,14 +449,9 @@ static void
 gst_d3d11_window_core_window_update_swap_chain (GstD3D11Window * window)
 {
   GstD3D11WindowCoreWindow *self = GST_D3D11_WINDOW_CORE_WINDOW (window);
-  CoreWindowWinRTStorage *storage = self->storage;
 
-  run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
-      [window] {
-        gst_d3d11_window_on_resize (window,
-            window->surface_width, window->surface_height);
-        return S_OK;
-      });
+  gst_d3d11_window_core_window_on_resize (window,
+      window->surface_width, window->surface_height);
 
   return;
 }
@@ -471,17 +465,27 @@ gst_d3d11_window_core_window_change_fullscreen_mode (GstD3D11Window * window)
 }
 
 static void
-gst_d3d11_window_core_window_on_resize (GstD3D11WindowCoreWindow * self,
+gst_d3d11_window_core_window_on_resize (GstD3D11Window * window,
     guint width, guint height)
 {
-  GstD3D11Window *window = GST_D3D11_WINDOW (self);
+  GstD3D11WindowCoreWindow *self = GST_D3D11_WINDOW_CORE_WINDOW (window);
+  CoreWindowWinRTStorage *storage = self->storage;
 
-  window->surface_width = width;
-  window->surface_height = height;
+  run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
+      [window] {
+        gst_d3d11_window_core_window_on_resize_sync (window);
+        return S_OK;
+      });
+}
 
-  GST_LOG_OBJECT (self, "New size %dx%d", width, height);
+static void
+gst_d3d11_window_core_window_on_resize_sync (GstD3D11Window * window)
+{
+  GST_LOG_OBJECT (window,
+      "New size %dx%d", window->surface_width, window->surface_height);
 
-  gst_d3d11_window_on_resize (GST_D3D11_WINDOW (self), width, height);
+  GST_D3D11_WINDOW_CLASS (parent_class)->on_resize (window,
+      window->surface_width, window->surface_height);
 }
 
 GstD3D11Window *
index c780d04..f3c3a0e 100644 (file)
@@ -91,16 +91,18 @@ gst_d3d11_window_swap_chain_panel_unlock (GstD3D11Window * window);
 static gboolean
 gst_d3d11_window_swap_chain_panel_unlock_stop (GstD3D11Window * window);
 static void
-gst_d3d11_window_swap_chain_panel_on_resize (GstD3D11WindowSwapChainPanel *
-    self, guint width, guint height);
-
+gst_d3d11_window_swap_chain_panel_on_resize (GstD3D11Window * window,
+    guint width, guint height);
+static void
+gst_d3d11_window_swap_chain_panel_on_resize_sync (GstD3D11Window *
+    window);
 class PanelResizeHandler
     : public RuntimeClass<RuntimeClassFlags<ClassicCom>,
         Xaml::ISizeChangedEventHandler>
 {
 public:
   PanelResizeHandler () {}
-  HRESULT RuntimeClassInitialize (GstD3D11WindowSwapChainPanel * listener)
+  HRESULT RuntimeClassInitialize (GstD3D11Window * listener)
   {
     if (!listener)
       return E_INVALIDARG;
@@ -116,8 +118,9 @@ public:
       Size new_size;
       HRESULT hr = args->get_NewSize(&new_size);
       if (SUCCEEDED(hr)) {
-        gst_d3d11_window_swap_chain_panel_on_resize (window,
-            new_size.Width, new_size.Height);
+        window->surface_width = new_size.Width;
+        window->surface_height = new_size.Height;
+        gst_d3d11_window_swap_chain_panel_on_resize_sync (window);
       }
     }
 
@@ -125,7 +128,7 @@ public:
   }
 
 private:
-  GstD3D11WindowSwapChainPanel * window;
+  GstD3D11Window * window;
 };
 
 template <typename CB>
@@ -219,6 +222,8 @@ gst_d3d11_window_swap_chain_panel_class_init (GstD3D11WindowSwapChainPanelClass
       GST_DEBUG_FUNCPTR (gst_d3d11_window_swap_chain_panel_unlock);
   window_class->unlock_stop =
       GST_DEBUG_FUNCPTR (gst_d3d11_window_swap_chain_panel_unlock_stop);
+  window_class->on_resize =
+      GST_DEBUG_FUNCPTR (gst_d3d11_window_swap_chain_panel_on_resize);
 }
 
 static void
@@ -270,7 +275,7 @@ gst_d3d11_window_swap_chain_panel_constructed (GObject * object)
   window->surface_width = size.Width;
   window->surface_height = size.Height;
 
-  hr = MakeAndInitialize<PanelResizeHandler>(&resize_handler, self);
+  hr = MakeAndInitialize<PanelResizeHandler>(&resize_handler, window);
   if (!gst_d3d11_result (hr, NULL))
     goto error;
 
@@ -378,13 +383,6 @@ gst_d3d11_window_swap_chain_panel_create_swap_chain (GstD3D11Window * window,
 
   new_swapchain.CopyTo (swap_chain);
 
-  run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
-      [window] {
-        gst_d3d11_window_on_resize (window,
-            window->surface_width, window->surface_height);
-        return S_OK;
-      });
-
   return TRUE;
 }
 
@@ -443,14 +441,9 @@ gst_d3d11_window_swap_chain_panel_update_swap_chain (GstD3D11Window * window)
 {
   GstD3D11WindowSwapChainPanel *self =
       GST_D3D11_WINDOW_SWAP_CHAIN_PANEL (window);
-  SwapChainPanelWinRTStorage *storage = self->storage;
 
-  run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
-      [window] {
-        gst_d3d11_window_on_resize (window,
-            window->surface_width, window->surface_height);
-        return S_OK;
-      });
+  gst_d3d11_window_swap_chain_panel_on_resize (window, window->surface_width,
+      window->surface_height);
 
   return;
 }
@@ -465,16 +458,28 @@ gst_d3d11_window_swap_chain_panel_change_fullscreen_mode (GstD3D11Window *
 }
 
 static void
-gst_d3d11_window_swap_chain_panel_on_resize (GstD3D11WindowSwapChainPanel *
-    self, guint width, guint height)
+gst_d3d11_window_swap_chain_panel_on_resize (GstD3D11Window * window,
+    guint width, guint height)
 {
-  GstD3D11Window *window = GST_D3D11_WINDOW (self);
-  window->surface_width = width;
-  window->surface_height = height;
+  GstD3D11WindowSwapChainPanel *self =
+      GST_D3D11_WINDOW_SWAP_CHAIN_PANEL (window);
+  SwapChainPanelWinRTStorage *storage = self->storage;
+
+  run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
+      [window] {
+        gst_d3d11_window_swap_chain_panel_on_resize_sync (window);
+        return S_OK;
+      });
+}
 
-  GST_LOG_OBJECT (self, "New size %dx%d", width, height);
+static void
+gst_d3d11_window_swap_chain_panel_on_resize_sync (GstD3D11Window * window)
+{
+  GST_LOG_OBJECT (window,
+      "New size %dx%d", window->surface_width, window->surface_height);
 
-  gst_d3d11_window_on_resize (GST_D3D11_WINDOW (self), width, height);
+  GST_D3D11_WINDOW_CLASS (parent_class)->on_resize (window,
+      window->surface_width, window->surface_height);
 }
 
 GstD3D11Window *
index 565dcb7..9e1dcc6 100644 (file)
@@ -115,6 +115,9 @@ static void gst_d3d11_window_win32_release_external_handle (GstD3D11WindowWin32
 static void
 gst_d3d11_window_win32_set_window_handle (GstD3D11WindowWin32 * self,
     guintptr handle);
+static void
+gst_d3d11_window_win32_on_resize (GstD3D11Window * window,
+    guint width, guint height);
 
 static void
 gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass)
@@ -134,6 +137,8 @@ gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass)
   window_class->create_swap_chain =
       GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_create_swap_chain);
   window_class->present = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_present);
+  window_class->on_resize =
+      GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_on_resize);
 }
 
 static void
@@ -573,7 +578,7 @@ gst_d3d11_window_win32_handle_window_proc (GstD3D11WindowWin32 * self,
 
   switch (uMsg) {
     case WM_SIZE:
-      gst_d3d11_window_on_resize (window, 0, 0);
+      gst_d3d11_window_win32_on_resize (window, 0, 0);
       break;
     case WM_CLOSE:
       if (self->internal_hwnd) {
@@ -790,9 +795,6 @@ gst_d3d11_window_win32_create_swap_chain (GstD3D11Window * window,
 
   *swap_chain = new_swapchain;
 
-  /* Set zero width and height here. dxgi will decide client area by itself */
-  gst_d3d11_window_on_resize (window, 0, 0);
-
   return TRUE;
 }
 
@@ -884,6 +886,14 @@ gst_d3d11_window_win32_present (GstD3D11Window * window, guint present_flags)
 }
 
 static void
+gst_d3d11_window_win32_on_resize (GstD3D11Window * window,
+    guint width, guint height)
+{
+  /* Set zero width and height here. dxgi will decide client area by itself */
+  GST_D3D11_WINDOW_CLASS (parent_class)->on_resize (window, 0, 0);
+}
+
+static void
 gst_d3d11_window_win32_update_swap_chain (GstD3D11Window * window)
 {
   GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window);