From c1d2d9171d8b87863f133a94b385ade77b943aaf Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Fri, 10 Jan 2020 21:45:43 +0900 Subject: [PATCH] d3d11window: Invoke initial resize method from baseclass ... instead of calling from subclass in order for baseclass to handle more things between swapchain creation and resource creation. --- sys/d3d11/gstd3d11window.cpp | 12 +++++- sys/d3d11/gstd3d11window.h | 8 ++-- sys/d3d11/gstd3d11window_corewindow.cpp | 54 +++++++++++++------------ sys/d3d11/gstd3d11window_swapchainpanel.cpp | 63 ++++++++++++++++------------- sys/d3d11/gstd3d11window_win32.cpp | 18 +++++++-- 5 files changed, 91 insertions(+), 64 deletions(-) diff --git a/sys/d3d11/gstd3d11window.cpp b/sys/d3d11/gstd3d11window.cpp index 96f26ef..d9fb46e 100644 --- a/sys/d3d11/gstd3d11window.cpp +++ b/sys/d3d11/gstd3d11window.cpp @@ -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); } diff --git a/sys/d3d11/gstd3d11window.h b/sys/d3d11/gstd3d11window.h index 60ba7b8..f1ecf20 100644 --- a/sys/d3d11/gstd3d11window.h +++ b/sys/d3d11/gstd3d11window.h @@ -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); diff --git a/sys/d3d11/gstd3d11window_corewindow.cpp b/sys/d3d11/gstd3d11window_corewindow.cpp index 10e98bd..0bf8394 100644 --- a/sys/d3d11/gstd3d11window_corewindow.cpp +++ b/sys/d3d11/gstd3d11window_corewindow.cpp @@ -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 @@ -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(&resize_handler, self); + hr = MakeAndInitialize(&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 * diff --git a/sys/d3d11/gstd3d11window_swapchainpanel.cpp b/sys/d3d11/gstd3d11window_swapchainpanel.cpp index c780d04..f3c3a0e 100644 --- a/sys/d3d11/gstd3d11window_swapchainpanel.cpp +++ b/sys/d3d11/gstd3d11window_swapchainpanel.cpp @@ -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, 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 @@ -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(&resize_handler, self); + hr = MakeAndInitialize(&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 * diff --git a/sys/d3d11/gstd3d11window_win32.cpp b/sys/d3d11/gstd3d11window_win32.cpp index 565dcb7..9e1dcc6 100644 --- a/sys/d3d11/gstd3d11window_win32.cpp +++ b/sys/d3d11/gstd3d11window_win32.cpp @@ -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); -- 2.7.4