mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-06 07:28:53 +00:00
d3d11device: Remove optional helper methods
Most of Direct3D11 APIs can be called without GstD3D11Device abstraction. This is a part of prework for public GstD3D11 library to introduce minimal APIs Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1892>
This commit is contained in:
parent
28174b14d3
commit
ac04681b6f
8 changed files with 175 additions and 290 deletions
|
@ -568,6 +568,7 @@ gst_d3d11_decoder_open (GstD3D11Decoder * decoder, GstD3D11Codec codec,
|
||||||
guint aligned_width, aligned_height;
|
guint aligned_width, aligned_height;
|
||||||
guint alignment;
|
guint alignment;
|
||||||
GstD3D11DeviceVendor vendor;
|
GstD3D11DeviceVendor vendor;
|
||||||
|
ID3D11Device *device_handle;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE);
|
g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE);
|
||||||
g_return_val_if_fail (codec > GST_D3D11_CODEC_NONE, FALSE);
|
g_return_val_if_fail (codec > GST_D3D11_CODEC_NONE, FALSE);
|
||||||
|
@ -583,6 +584,8 @@ gst_d3d11_decoder_open (GstD3D11Decoder * decoder, GstD3D11Codec codec,
|
||||||
decoder->opened = FALSE;
|
decoder->opened = FALSE;
|
||||||
priv->use_array_of_texture = FALSE;
|
priv->use_array_of_texture = FALSE;
|
||||||
|
|
||||||
|
device_handle = gst_d3d11_device_get_device_handle (priv->device);
|
||||||
|
|
||||||
d3d11_format = gst_d3d11_device_format_from_gst (priv->device,
|
d3d11_format = gst_d3d11_device_format_from_gst (priv->device,
|
||||||
GST_VIDEO_INFO_FORMAT (info));
|
GST_VIDEO_INFO_FORMAT (info));
|
||||||
if (!d3d11_format || d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
if (!d3d11_format || d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||||
|
@ -749,9 +752,9 @@ gst_d3d11_decoder_open (GstD3D11Decoder * decoder, GstD3D11Codec codec,
|
||||||
staging_desc.Usage = D3D11_USAGE_STAGING;
|
staging_desc.Usage = D3D11_USAGE_STAGING;
|
||||||
staging_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
|
staging_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
|
||||||
|
|
||||||
priv->staging = gst_d3d11_device_create_texture (priv->device,
|
hr = ID3D11Device_CreateTexture2D (device_handle, &staging_desc, NULL,
|
||||||
&staging_desc, NULL);
|
&priv->staging);
|
||||||
if (!priv->staging) {
|
if (!gst_d3d11_result (hr, priv->device)) {
|
||||||
GST_ERROR_OBJECT (decoder, "Couldn't create staging texture");
|
GST_ERROR_OBJECT (decoder, "Couldn't create staging texture");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -803,17 +806,17 @@ gst_d3d11_decoder_open (GstD3D11Decoder * decoder, GstD3D11Codec codec,
|
||||||
texture_desc.Usage = D3D11_USAGE_DEFAULT;
|
texture_desc.Usage = D3D11_USAGE_DEFAULT;
|
||||||
texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET;
|
texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET;
|
||||||
|
|
||||||
priv->fallback_shader_output_texture =
|
hr = ID3D11Device_CreateTexture2D (device_handle, &texture_desc, NULL,
|
||||||
gst_d3d11_device_create_texture (priv->device, &texture_desc, NULL);
|
&priv->fallback_shader_output_texture);
|
||||||
if (!priv->fallback_shader_output_texture) {
|
if (!gst_d3d11_result (hr, priv->device)) {
|
||||||
GST_ERROR_OBJECT (decoder, "Couldn't create shader output texture");
|
GST_ERROR_OBJECT (decoder, "Couldn't create shader output texture");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
priv->shader_resource_texture =
|
hr = ID3D11Device_CreateTexture2D (device_handle, &texture_desc, NULL,
|
||||||
gst_d3d11_device_create_texture (priv->device, &texture_desc, NULL);
|
&priv->shader_resource_texture);
|
||||||
if (!priv->shader_resource_texture) {
|
if (!gst_d3d11_result (hr, priv->device)) {
|
||||||
GST_ERROR_OBJECT (decoder, "Couldn't create shader input texture");
|
GST_ERROR_OBJECT (decoder, "Couldn't create shader input texture");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -933,6 +933,14 @@ gst_d3d11_device_get_device_context_handle (GstD3D11Device * device)
|
||||||
return device->priv->device_context;
|
return device->priv->device_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IDXGIFactory1 *
|
||||||
|
gst_d3d11_device_get_dxgi_factory_handle (GstD3D11Device * device)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
||||||
|
|
||||||
|
return device->priv->factory;
|
||||||
|
}
|
||||||
|
|
||||||
GstD3D11DXGIFactoryVersion
|
GstD3D11DXGIFactoryVersion
|
||||||
gst_d3d11_device_get_chosen_dxgi_factory_version (GstD3D11Device * device)
|
gst_d3d11_device_get_chosen_dxgi_factory_version (GstD3D11Device * device)
|
||||||
{
|
{
|
||||||
|
@ -950,236 +958,6 @@ gst_d3d11_device_get_chosen_feature_level (GstD3D11Device * device)
|
||||||
return device->priv->feature_level;
|
return device->priv->feature_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_d3d11_device_create_swap_chain:
|
|
||||||
* @device: a #GstD3D11Device
|
|
||||||
* @desc: a DXGI_SWAP_CHAIN_DESC structure for swapchain
|
|
||||||
*
|
|
||||||
* Create a IDXGISwapChain object. Caller must release returned swap chain object
|
|
||||||
* via IDXGISwapChain_Release()
|
|
||||||
*
|
|
||||||
* Returns: (transfer full) (nullable): a new IDXGISwapChain or %NULL
|
|
||||||
* when failed to create swap chain with given @desc
|
|
||||||
*/
|
|
||||||
IDXGISwapChain *
|
|
||||||
gst_d3d11_device_create_swap_chain (GstD3D11Device * device,
|
|
||||||
const DXGI_SWAP_CHAIN_DESC * desc)
|
|
||||||
{
|
|
||||||
GstD3D11DevicePrivate *priv;
|
|
||||||
HRESULT hr;
|
|
||||||
IDXGISwapChain *swap_chain = NULL;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
|
||||||
|
|
||||||
priv = device->priv;
|
|
||||||
|
|
||||||
gst_d3d11_device_lock (device);
|
|
||||||
hr = IDXGIFactory1_CreateSwapChain (priv->factory, (IUnknown *) priv->device,
|
|
||||||
(DXGI_SWAP_CHAIN_DESC *) desc, &swap_chain);
|
|
||||||
gst_d3d11_device_unlock (device);
|
|
||||||
|
|
||||||
if (!gst_d3d11_result (hr, device)) {
|
|
||||||
GST_WARNING_OBJECT (device, "Cannot create SwapChain Object: 0x%x",
|
|
||||||
(guint) hr);
|
|
||||||
swap_chain = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return swap_chain;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (DXGI_HEADER_VERSION >= 2)
|
|
||||||
#if (!GST_D3D11_WINAPI_ONLY_APP)
|
|
||||||
/**
|
|
||||||
* gst_d3d11_device_create_swap_chain_for_hwnd:
|
|
||||||
* @device: a #GstD3D11Device
|
|
||||||
* @hwnd: HWND handle
|
|
||||||
* @desc: a DXGI_SWAP_CHAIN_DESC1 structure for swapchain
|
|
||||||
* @fullscreen_desc: (nullable): a DXGI_SWAP_CHAIN_FULLSCREEN_DESC
|
|
||||||
* structure for swapchain
|
|
||||||
* @output: (nullable): a IDXGIOutput interface for the output to restrict content to
|
|
||||||
*
|
|
||||||
* Create a IDXGISwapChain1 object. Caller must release returned swap chain object
|
|
||||||
* via IDXGISwapChain1_Release()
|
|
||||||
*
|
|
||||||
* Returns: (transfer full) (nullable): a new IDXGISwapChain1 or %NULL
|
|
||||||
* when failed to create swap chain with given @desc
|
|
||||||
*/
|
|
||||||
IDXGISwapChain1 *
|
|
||||||
gst_d3d11_device_create_swap_chain_for_hwnd (GstD3D11Device * device,
|
|
||||||
HWND hwnd, const DXGI_SWAP_CHAIN_DESC1 * desc,
|
|
||||||
const DXGI_SWAP_CHAIN_FULLSCREEN_DESC * fullscreen_desc,
|
|
||||||
IDXGIOutput * output)
|
|
||||||
{
|
|
||||||
GstD3D11DevicePrivate *priv;
|
|
||||||
IDXGISwapChain1 *swap_chain = NULL;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
|
||||||
|
|
||||||
priv = device->priv;
|
|
||||||
|
|
||||||
gst_d3d11_device_lock (device);
|
|
||||||
hr = IDXGIFactory2_CreateSwapChainForHwnd ((IDXGIFactory2 *) priv->factory,
|
|
||||||
(IUnknown *) priv->device, hwnd, desc, fullscreen_desc,
|
|
||||||
output, &swap_chain);
|
|
||||||
gst_d3d11_device_unlock (device);
|
|
||||||
|
|
||||||
if (!gst_d3d11_result (hr, device)) {
|
|
||||||
GST_WARNING_OBJECT (device, "Cannot create SwapChain Object: 0x%x",
|
|
||||||
(guint) hr);
|
|
||||||
swap_chain = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return swap_chain;
|
|
||||||
}
|
|
||||||
#endif /* GST_D3D11_WINAPI_ONLY_APP */
|
|
||||||
|
|
||||||
#if GST_D3D11_WINAPI_ONLY_APP
|
|
||||||
/**
|
|
||||||
* gst_d3d11_device_create_swap_chain_for_core_window:
|
|
||||||
* @device: a #GstD3D11Device
|
|
||||||
* @core_window: CoreWindow handle
|
|
||||||
* @desc: a DXGI_SWAP_CHAIN_DESC1 structure for swapchain
|
|
||||||
* @output: (nullable): a IDXGIOutput interface for the output to restrict content to
|
|
||||||
*
|
|
||||||
* Create a IDXGISwapChain1 object. Caller must release returned swap chain object
|
|
||||||
* via IDXGISwapChain1_Release()
|
|
||||||
*
|
|
||||||
* Returns: (transfer full) (nullable): a new IDXGISwapChain1 or %NULL
|
|
||||||
* when failed to create swap chain with given @desc
|
|
||||||
*/
|
|
||||||
IDXGISwapChain1 *
|
|
||||||
gst_d3d11_device_create_swap_chain_for_core_window (GstD3D11Device * device,
|
|
||||||
guintptr core_window, const DXGI_SWAP_CHAIN_DESC1 * desc,
|
|
||||||
IDXGIOutput * output)
|
|
||||||
{
|
|
||||||
GstD3D11DevicePrivate *priv;
|
|
||||||
IDXGISwapChain1 *swap_chain = NULL;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
|
||||||
|
|
||||||
priv = device->priv;
|
|
||||||
|
|
||||||
gst_d3d11_device_lock (device);
|
|
||||||
hr = IDXGIFactory2_CreateSwapChainForCoreWindow ((IDXGIFactory2 *)
|
|
||||||
priv->factory, (IUnknown *) priv->device, (IUnknown *) core_window, desc,
|
|
||||||
output, &swap_chain);
|
|
||||||
gst_d3d11_device_unlock (device);
|
|
||||||
|
|
||||||
if (!gst_d3d11_result (hr, device)) {
|
|
||||||
GST_WARNING_OBJECT (device, "Cannot create SwapChain Object: 0x%x",
|
|
||||||
(guint) hr);
|
|
||||||
swap_chain = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return swap_chain;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_d3d11_device_create_swap_chain_for_composition:
|
|
||||||
* @device: a #GstD3D11Device
|
|
||||||
* @desc: a DXGI_SWAP_CHAIN_DESC1 structure for swapchain
|
|
||||||
* @output: (nullable): a IDXGIOutput interface for the output to restrict content to
|
|
||||||
*
|
|
||||||
* Create a IDXGISwapChain1 object. Caller must release returned swap chain object
|
|
||||||
* via IDXGISwapChain1_Release()
|
|
||||||
*
|
|
||||||
* Returns: (transfer full) (nullable): a new IDXGISwapChain1 or %NULL
|
|
||||||
* when failed to create swap chain with given @desc
|
|
||||||
*/
|
|
||||||
IDXGISwapChain1 *
|
|
||||||
gst_d3d11_device_create_swap_chain_for_composition (GstD3D11Device * device,
|
|
||||||
const DXGI_SWAP_CHAIN_DESC1 * desc, IDXGIOutput * output)
|
|
||||||
{
|
|
||||||
GstD3D11DevicePrivate *priv;
|
|
||||||
IDXGISwapChain1 *swap_chain = NULL;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
|
||||||
|
|
||||||
priv = device->priv;
|
|
||||||
|
|
||||||
gst_d3d11_device_lock (device);
|
|
||||||
hr = IDXGIFactory2_CreateSwapChainForComposition ((IDXGIFactory2 *)
|
|
||||||
priv->factory, (IUnknown *) priv->device, desc, output, &swap_chain);
|
|
||||||
gst_d3d11_device_unlock (device);
|
|
||||||
|
|
||||||
if (!gst_d3d11_result (hr, device)) {
|
|
||||||
GST_WARNING_OBJECT (device, "Cannot create SwapChain Object: 0x%x",
|
|
||||||
(guint) hr);
|
|
||||||
swap_chain = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return swap_chain;
|
|
||||||
}
|
|
||||||
#endif /* GST_D3D11_WINAPI_ONLY_APP */
|
|
||||||
#endif /* (DXGI_HEADER_VERSION >= 2) */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_d3d11_device_release_swap_chain:
|
|
||||||
* @device: a #GstD3D11Device
|
|
||||||
* @swap_chain: a IDXGISwapChain
|
|
||||||
*
|
|
||||||
* Release a @swap_chain from device thread
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_d3d11_device_release_swap_chain (GstD3D11Device * device,
|
|
||||||
IDXGISwapChain * swap_chain)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GST_IS_D3D11_DEVICE (device));
|
|
||||||
g_return_if_fail (swap_chain != NULL);
|
|
||||||
|
|
||||||
gst_d3d11_device_lock (device);
|
|
||||||
IDXGISwapChain_Release (swap_chain);
|
|
||||||
gst_d3d11_device_unlock (device);
|
|
||||||
}
|
|
||||||
|
|
||||||
ID3D11Texture2D *
|
|
||||||
gst_d3d11_device_create_texture (GstD3D11Device * device,
|
|
||||||
const D3D11_TEXTURE2D_DESC * desc,
|
|
||||||
const D3D11_SUBRESOURCE_DATA * inital_data)
|
|
||||||
{
|
|
||||||
GstD3D11DevicePrivate *priv;
|
|
||||||
HRESULT hr;
|
|
||||||
ID3D11Texture2D *texture;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
|
||||||
g_return_val_if_fail (desc != NULL, NULL);
|
|
||||||
|
|
||||||
priv = device->priv;
|
|
||||||
|
|
||||||
hr = ID3D11Device_CreateTexture2D (priv->device, desc, inital_data, &texture);
|
|
||||||
if (!gst_d3d11_result (hr, device)) {
|
|
||||||
GST_ERROR ("Failed to create texture (0x%x)", (guint) hr);
|
|
||||||
|
|
||||||
GST_WARNING ("Direct3D11 Allocation params");
|
|
||||||
GST_WARNING ("\t%dx%d, DXGI format %d",
|
|
||||||
desc->Width, desc->Height, desc->Format);
|
|
||||||
GST_WARNING ("\tMipLevel %d, ArraySize %d",
|
|
||||||
desc->MipLevels, desc->ArraySize);
|
|
||||||
GST_WARNING ("\tSampleDesc.Count %d, SampleDesc.Quality %d",
|
|
||||||
desc->SampleDesc.Count, desc->SampleDesc.Quality);
|
|
||||||
GST_WARNING ("\tUsage %d", desc->Usage);
|
|
||||||
GST_WARNING ("\tBindFlags 0x%x", desc->BindFlags);
|
|
||||||
GST_WARNING ("\tCPUAccessFlags 0x%x", desc->CPUAccessFlags);
|
|
||||||
GST_WARNING ("\tMiscFlags 0x%x", desc->MiscFlags);
|
|
||||||
texture = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_d3d11_device_release_texture (GstD3D11Device * device,
|
|
||||||
ID3D11Texture2D * texture)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GST_IS_D3D11_DEVICE (device));
|
|
||||||
g_return_if_fail (texture != NULL);
|
|
||||||
|
|
||||||
ID3D11Texture2D_Release (texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_d3d11_device_lock (GstD3D11Device * device)
|
gst_d3d11_device_lock (GstD3D11Device * device)
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,45 +83,12 @@ ID3D11Device * gst_d3d11_device_get_device_handle (GstD3D11Device * devi
|
||||||
|
|
||||||
ID3D11DeviceContext * gst_d3d11_device_get_device_context_handle (GstD3D11Device * device);
|
ID3D11DeviceContext * gst_d3d11_device_get_device_context_handle (GstD3D11Device * device);
|
||||||
|
|
||||||
|
IDXGIFactory1 * gst_d3d11_device_get_dxgi_factory_handle (GstD3D11Device * device);
|
||||||
|
|
||||||
GstD3D11DXGIFactoryVersion gst_d3d11_device_get_chosen_dxgi_factory_version (GstD3D11Device * device);
|
GstD3D11DXGIFactoryVersion gst_d3d11_device_get_chosen_dxgi_factory_version (GstD3D11Device * device);
|
||||||
|
|
||||||
D3D_FEATURE_LEVEL gst_d3d11_device_get_chosen_feature_level (GstD3D11Device * device);
|
D3D_FEATURE_LEVEL gst_d3d11_device_get_chosen_feature_level (GstD3D11Device * device);
|
||||||
|
|
||||||
IDXGISwapChain * gst_d3d11_device_create_swap_chain (GstD3D11Device * device,
|
|
||||||
const DXGI_SWAP_CHAIN_DESC * desc);
|
|
||||||
|
|
||||||
#if (DXGI_HEADER_VERSION >= 2)
|
|
||||||
#if (!GST_D3D11_WINAPI_ONLY_APP)
|
|
||||||
IDXGISwapChain1 * gst_d3d11_device_create_swap_chain_for_hwnd (GstD3D11Device * device,
|
|
||||||
HWND hwnd,
|
|
||||||
const DXGI_SWAP_CHAIN_DESC1 * desc,
|
|
||||||
const DXGI_SWAP_CHAIN_FULLSCREEN_DESC * fullscreen_desc,
|
|
||||||
IDXGIOutput * output);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if GST_D3D11_WINAPI_ONLY_APP
|
|
||||||
IDXGISwapChain1 * gst_d3d11_device_create_swap_chain_for_core_window (GstD3D11Device * device,
|
|
||||||
guintptr core_window,
|
|
||||||
const DXGI_SWAP_CHAIN_DESC1 * desc,
|
|
||||||
IDXGIOutput * output);
|
|
||||||
|
|
||||||
IDXGISwapChain1 * gst_d3d11_device_create_swap_chain_for_composition (GstD3D11Device * device,
|
|
||||||
const DXGI_SWAP_CHAIN_DESC1 * desc,
|
|
||||||
IDXGIOutput * output);
|
|
||||||
|
|
||||||
#endif /* GST_D3D11_WINAPI_ONLY_APP */
|
|
||||||
#endif /* (DXGI_HEADER_VERSION >= 2) */
|
|
||||||
|
|
||||||
void gst_d3d11_device_release_swap_chain (GstD3D11Device * device,
|
|
||||||
IDXGISwapChain * swap_chain);
|
|
||||||
|
|
||||||
ID3D11Texture2D * gst_d3d11_device_create_texture (GstD3D11Device * device,
|
|
||||||
const D3D11_TEXTURE2D_DESC * desc,
|
|
||||||
const D3D11_SUBRESOURCE_DATA *inital_data);
|
|
||||||
|
|
||||||
void gst_d3d11_device_release_texture (GstD3D11Device * device,
|
|
||||||
ID3D11Texture2D * texture);
|
|
||||||
|
|
||||||
void gst_d3d11_device_lock (GstD3D11Device * device);
|
void gst_d3d11_device_lock (GstD3D11Device * device);
|
||||||
|
|
||||||
void gst_d3d11_device_unlock (GstD3D11Device * device);
|
void gst_d3d11_device_unlock (GstD3D11Device * device);
|
||||||
|
|
|
@ -229,6 +229,9 @@ create_staging_texture (GstD3D11Device * device,
|
||||||
const D3D11_TEXTURE2D_DESC * ref)
|
const D3D11_TEXTURE2D_DESC * ref)
|
||||||
{
|
{
|
||||||
D3D11_TEXTURE2D_DESC desc = { 0, };
|
D3D11_TEXTURE2D_DESC desc = { 0, };
|
||||||
|
ID3D11Texture2D *texture = NULL;
|
||||||
|
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
desc.Width = ref->Width;
|
desc.Width = ref->Width;
|
||||||
desc.Height = ref->Height;
|
desc.Height = ref->Height;
|
||||||
|
@ -239,7 +242,13 @@ create_staging_texture (GstD3D11Device * device,
|
||||||
desc.Usage = D3D11_USAGE_STAGING;
|
desc.Usage = D3D11_USAGE_STAGING;
|
||||||
desc.CPUAccessFlags = (D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE);
|
desc.CPUAccessFlags = (D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE);
|
||||||
|
|
||||||
return gst_d3d11_device_create_texture (device, &desc, NULL);
|
hr = ID3D11Device_CreateTexture2D (device_handle, &desc, NULL, &texture);
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_ERROR_OBJECT (device, "Failed to create texture");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -498,8 +507,8 @@ gst_d3d11_allocator_dispose (GObject * object)
|
||||||
g_clear_pointer (&priv->decoder_output_view_array, g_array_unref);
|
g_clear_pointer (&priv->decoder_output_view_array, g_array_unref);
|
||||||
g_clear_pointer (&priv->processor_input_view_array, g_array_unref);
|
g_clear_pointer (&priv->processor_input_view_array, g_array_unref);
|
||||||
|
|
||||||
if (alloc->device && priv->texture) {
|
if (priv->texture) {
|
||||||
gst_d3d11_device_release_texture (alloc->device, priv->texture);
|
ID3D11Texture2D_Release (priv->texture);
|
||||||
priv->texture = NULL;
|
priv->texture = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -820,6 +829,8 @@ gst_d3d11_allocator_alloc (GstD3D11Allocator * allocator,
|
||||||
guint index_to_use = 0;
|
guint index_to_use = 0;
|
||||||
GstD3D11AllocatorPrivate *priv;
|
GstD3D11AllocatorPrivate *priv;
|
||||||
GstD3D11MemoryType type = GST_D3D11_MEMORY_TYPE_TEXTURE;
|
GstD3D11MemoryType type = GST_D3D11_MEMORY_TYPE_TEXTURE;
|
||||||
|
HRESULT hr;
|
||||||
|
ID3D11Device *device_handle;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_D3D11_ALLOCATOR (allocator), NULL);
|
g_return_val_if_fail (GST_IS_D3D11_ALLOCATOR (allocator), NULL);
|
||||||
g_return_val_if_fail (desc != NULL, NULL);
|
g_return_val_if_fail (desc != NULL, NULL);
|
||||||
|
@ -827,6 +838,7 @@ gst_d3d11_allocator_alloc (GstD3D11Allocator * allocator,
|
||||||
|
|
||||||
priv = allocator->priv;
|
priv = allocator->priv;
|
||||||
device = allocator->device;
|
device = allocator->device;
|
||||||
|
device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
|
||||||
if ((flags & GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY)) {
|
if ((flags & GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY)) {
|
||||||
gint i;
|
gint i;
|
||||||
|
@ -882,8 +894,9 @@ gst_d3d11_allocator_alloc (GstD3D11Allocator * allocator,
|
||||||
GST_D3D11_ALLOCATOR_UNLOCK (allocator);
|
GST_D3D11_ALLOCATOR_UNLOCK (allocator);
|
||||||
|
|
||||||
if (!priv->texture) {
|
if (!priv->texture) {
|
||||||
priv->texture = gst_d3d11_device_create_texture (device, desc, NULL);
|
hr = ID3D11Device_CreateTexture2D (device_handle, desc, NULL,
|
||||||
if (!priv->texture) {
|
&priv->texture);
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
GST_ERROR_OBJECT (allocator, "Couldn't create texture");
|
GST_ERROR_OBJECT (allocator, "Couldn't create texture");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -894,8 +907,8 @@ gst_d3d11_allocator_alloc (GstD3D11Allocator * allocator,
|
||||||
|
|
||||||
type = GST_D3D11_MEMORY_TYPE_ARRAY;
|
type = GST_D3D11_MEMORY_TYPE_ARRAY;
|
||||||
} else {
|
} else {
|
||||||
texture = gst_d3d11_device_create_texture (device, desc, NULL);
|
hr = ID3D11Device_CreateTexture2D (device_handle, desc, NULL, &texture);
|
||||||
if (!texture) {
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
GST_ERROR_OBJECT (allocator, "Couldn't create texture");
|
GST_ERROR_OBJECT (allocator, "Couldn't create texture");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -917,7 +930,7 @@ gst_d3d11_allocator_alloc (GstD3D11Allocator * allocator,
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (texture)
|
if (texture)
|
||||||
gst_d3d11_device_release_texture (device, texture);
|
ID3D11Texture2D_Release (texture);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -969,7 +982,7 @@ gst_d3d11_allocator_alloc_staging (GstD3D11Allocator * allocator,
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (texture)
|
if (texture)
|
||||||
gst_d3d11_device_release_texture (device, texture);
|
ID3D11Texture2D_Release (texture);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,11 +180,11 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self,
|
||||||
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
texture_desc.CPUAccessFlags = 0;
|
texture_desc.CPUAccessFlags = 0;
|
||||||
|
|
||||||
texture = gst_d3d11_device_create_texture (device,
|
hr = ID3D11Device_CreateTexture2D (device_handle, &texture_desc,
|
||||||
&texture_desc, &subresource_data);
|
&subresource_data, &texture);
|
||||||
gst_video_meta_unmap (vmeta, 0, &info);
|
gst_video_meta_unmap (vmeta, 0, &info);
|
||||||
|
|
||||||
if (!texture) {
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
GST_ERROR ("Failed to create texture");
|
GST_ERROR ("Failed to create texture");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -370,6 +370,39 @@ gst_d3d11_window_core_window_unprepare (GstD3D11Window * window)
|
||||||
self->storage = NULL;
|
self->storage = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IDXGISwapChain1 *
|
||||||
|
create_swap_chain_for_core_window (GstD3D11WindowCoreWindow * self,
|
||||||
|
GstD3D11Device * device, guintptr core_window, DXGI_SWAP_CHAIN_DESC1 * desc,
|
||||||
|
IDXGIOutput * output)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IDXGISwapChain1 *swap_chain = NULL;
|
||||||
|
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
IDXGIFactory1 *factory = gst_d3d11_device_get_dxgi_factory_handle (device);
|
||||||
|
IDXGIFactory2 *factory2 = NULL;
|
||||||
|
|
||||||
|
hr = factory->QueryInterface (IID_PPV_ARGS (&factory2));
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "IDXGIFactory2 interface is unavailable");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_d3d11_device_lock (device);
|
||||||
|
hr = factory2->CreateSwapChainForCoreWindow ((IUnknown *) device_handle,
|
||||||
|
(IUnknown *) core_window, desc, output, &swap_chain);
|
||||||
|
gst_d3d11_device_unlock (device);
|
||||||
|
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x",
|
||||||
|
(guint) hr);
|
||||||
|
swap_chain = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
factory2->Release ();
|
||||||
|
|
||||||
|
return swap_chain;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_d3d11_window_core_window_create_swap_chain (GstD3D11Window * window,
|
gst_d3d11_window_core_window_create_swap_chain (GstD3D11Window * window,
|
||||||
DXGI_FORMAT format, guint width, guint height, guint swapchain_flags,
|
DXGI_FORMAT format, guint width, guint height, guint swapchain_flags,
|
||||||
|
@ -395,7 +428,7 @@ gst_d3d11_window_core_window_create_swap_chain (GstD3D11Window * window,
|
||||||
desc1.Flags = swapchain_flags;
|
desc1.Flags = swapchain_flags;
|
||||||
|
|
||||||
new_swapchain =
|
new_swapchain =
|
||||||
gst_d3d11_device_create_swap_chain_for_core_window (device,
|
create_swap_chain_for_core_window (self, device,
|
||||||
window->external_handle, &desc1, NULL);
|
window->external_handle, &desc1, NULL);
|
||||||
|
|
||||||
if (!new_swapchain) {
|
if (!new_swapchain) {
|
||||||
|
|
|
@ -344,6 +344,38 @@ gst_d3d11_window_swap_chain_panel_unprepare (GstD3D11Window * window)
|
||||||
self->storage = NULL;
|
self->storage = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IDXGISwapChain1 *
|
||||||
|
create_swap_chain_for_composition (GstD3D11WindowSwapChainPanel * self,
|
||||||
|
GstD3D11Device * device, DXGI_SWAP_CHAIN_DESC1 * desc, IDXGIOutput * output)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IDXGISwapChain1 *swap_chain = NULL;
|
||||||
|
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
IDXGIFactory1 *factory = gst_d3d11_device_get_dxgi_factory_handle (device);
|
||||||
|
IDXGIFactory2 *factory2 = NULL;
|
||||||
|
|
||||||
|
hr = factory->QueryInterface (IID_PPV_ARGS (&factory2));
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "IDXGIFactory2 interface is unavailable");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_d3d11_device_lock (device);
|
||||||
|
hr = factory2->CreateSwapChainForComposition ((IUnknown *) device_handle,
|
||||||
|
desc, output, &swap_chain);
|
||||||
|
gst_d3d11_device_unlock (device);
|
||||||
|
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x",
|
||||||
|
(guint) hr);
|
||||||
|
swap_chain = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
factory2->Release ();
|
||||||
|
|
||||||
|
return swap_chain;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_d3d11_window_swap_chain_panel_create_swap_chain (GstD3D11Window * window,
|
gst_d3d11_window_swap_chain_panel_create_swap_chain (GstD3D11Window * window,
|
||||||
DXGI_FORMAT format, guint width, guint height, guint swapchain_flags,
|
DXGI_FORMAT format, guint width, guint height, guint swapchain_flags,
|
||||||
|
@ -372,7 +404,7 @@ gst_d3d11_window_swap_chain_panel_create_swap_chain (GstD3D11Window * window,
|
||||||
desc1.Flags = swapchain_flags;
|
desc1.Flags = swapchain_flags;
|
||||||
|
|
||||||
new_swapchain =
|
new_swapchain =
|
||||||
gst_d3d11_device_create_swap_chain_for_composition (device, &desc1, NULL);
|
create_swap_chain_for_composition (self, device, &desc1, NULL);
|
||||||
|
|
||||||
if (!new_swapchain) {
|
if (!new_swapchain) {
|
||||||
GST_ERROR_OBJECT (self, "Cannot create swapchain");
|
GST_ERROR_OBJECT (self, "Cannot create swapchain");
|
||||||
|
|
|
@ -750,6 +750,65 @@ gst_d3d11_window_win32_disable_alt_enter (GstD3D11WindowWin32 * self,
|
||||||
factory->Release ();
|
factory->Release ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IDXGISwapChain *
|
||||||
|
create_swap_chain (GstD3D11WindowWin32 * self, GstD3D11Device * device,
|
||||||
|
DXGI_SWAP_CHAIN_DESC * desc)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IDXGISwapChain *swap_chain = NULL;
|
||||||
|
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
IDXGIFactory1 *factory = gst_d3d11_device_get_dxgi_factory_handle (device);
|
||||||
|
|
||||||
|
gst_d3d11_device_lock (device);
|
||||||
|
hr = factory->CreateSwapChain ((IUnknown *) device_handle,
|
||||||
|
desc, &swap_chain);
|
||||||
|
gst_d3d11_device_unlock (device);
|
||||||
|
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x",
|
||||||
|
(guint) hr);
|
||||||
|
swap_chain = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return swap_chain;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (DXGI_HEADER_VERSION >= 2)
|
||||||
|
static IDXGISwapChain1 *
|
||||||
|
create_swap_chain_for_hwnd (GstD3D11WindowWin32 * self, GstD3D11Device * device,
|
||||||
|
HWND hwnd, DXGI_SWAP_CHAIN_DESC1 * desc,
|
||||||
|
DXGI_SWAP_CHAIN_FULLSCREEN_DESC * fullscreen_desc, IDXGIOutput * output)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IDXGISwapChain1 *swap_chain = NULL;
|
||||||
|
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
IDXGIFactory1 *factory = gst_d3d11_device_get_dxgi_factory_handle (device);
|
||||||
|
IDXGIFactory2 *factory2 = NULL;
|
||||||
|
|
||||||
|
hr = factory->QueryInterface (IID_PPV_ARGS (&factory2));
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "IDXGIFactory2 interface is unavailable");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_d3d11_device_lock (device);
|
||||||
|
hr = factory2->CreateSwapChainForHwnd (
|
||||||
|
(IUnknown *) device_handle, hwnd, desc, fullscreen_desc,
|
||||||
|
output, &swap_chain);
|
||||||
|
gst_d3d11_device_unlock (device);
|
||||||
|
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_WARNING_OBJECT (self, "Cannot create SwapChain Object: 0x%x",
|
||||||
|
(guint) hr);
|
||||||
|
swap_chain = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
factory2->Release ();
|
||||||
|
|
||||||
|
return swap_chain;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_d3d11_window_win32_create_swap_chain (GstD3D11Window * window,
|
gst_d3d11_window_win32_create_swap_chain (GstD3D11Window * window,
|
||||||
DXGI_FORMAT format, guint width, guint height,
|
DXGI_FORMAT format, guint width, guint height,
|
||||||
|
@ -785,7 +844,7 @@ gst_d3d11_window_win32_create_swap_chain (GstD3D11Window * window,
|
||||||
desc1.Flags = swapchain_flags;
|
desc1.Flags = swapchain_flags;
|
||||||
|
|
||||||
new_swapchain = (IDXGISwapChain *)
|
new_swapchain = (IDXGISwapChain *)
|
||||||
gst_d3d11_device_create_swap_chain_for_hwnd (device,
|
create_swap_chain_for_hwnd (self, device,
|
||||||
self->internal_hwnd, &desc1, NULL, NULL);
|
self->internal_hwnd, &desc1, NULL, NULL);
|
||||||
|
|
||||||
if (!new_swapchain) {
|
if (!new_swapchain) {
|
||||||
|
@ -820,7 +879,7 @@ gst_d3d11_window_win32_create_swap_chain (GstD3D11Window * window,
|
||||||
desc.Windowed = TRUE;
|
desc.Windowed = TRUE;
|
||||||
desc.Flags = swapchain_flags;
|
desc.Flags = swapchain_flags;
|
||||||
|
|
||||||
new_swapchain = gst_d3d11_device_create_swap_chain (device, &desc);
|
new_swapchain = create_swap_chain (self, device, &desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!new_swapchain) {
|
if (!new_swapchain) {
|
||||||
|
|
Loading…
Reference in a new issue