mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
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:
parent
7aad9187e4
commit
c1d2d9171d
5 changed files with 91 additions and 64 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue