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.
This commit is contained in:
Seungha Yang 2020-01-10 21:45:43 +09:00 committed by GStreamer Merge Bot
parent 7aad9187e4
commit c1d2d9171d
5 changed files with 91 additions and 64 deletions

View 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);
}

View 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);

View 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,
gst_d3d11_window_core_window_on_resize (window,
window->surface_width, window->surface_height);
return S_OK;
});
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 *

View 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;
GST_LOG_OBJECT (self, "New size %dx%d", width, height);
run_async (storage->dispatcher, storage->cancellable, DEFAULT_ASYNC_TIMEOUT,
[window] {
gst_d3d11_window_swap_chain_panel_on_resize_sync (window);
return S_OK;
});
}
gst_d3d11_window_on_resize (GST_D3D11_WINDOW (self), 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_CLASS (parent_class)->on_resize (window,
window->surface_width, window->surface_height);
}
GstD3D11Window *

View 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;
}
@ -883,6 +885,14 @@ gst_d3d11_window_win32_present (GstD3D11Window * window, guint present_flags)
return GST_FLOW_OK;
}
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)
{