From fe4ec03a4b44c97befdafebd20e00c62b6698a26 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sun, 22 Aug 2021 00:33:58 +0900 Subject: [PATCH] d3d11bufferpool: Hide buffer_size field from header User can get the required buffer size by using buffer pool config. Since d3d11 implementation is a candidate for public library in the future, we need to hide everything from header as much as possible. Note that the total size of allocated d3d11 texture memory by GPU is not controllable factor. It depends on hardware specific alignment/padding requirement. So, GstD3D11 implementation updates actual buffer size by allocating D3D11 texture, since there's no way to get CPU accessible memory size without allocating real D3D11 texture. Part-of: --- gst-libs/gst/d3d11/gstd3d11bufferpool.cpp | 4 +--- gst-libs/gst/d3d11/gstd3d11bufferpool.h | 3 --- sys/d3d11/gstd3d11compositor.cpp | 17 +++++++++++++---- sys/d3d11/gstd3d11convert.cpp | 13 +++++++++++-- sys/d3d11/gstd3d11decoder.cpp | 10 ++++++++-- sys/d3d11/gstd3d11deinterlace.cpp | 13 +++++++++++-- sys/d3d11/gstd3d11desktopdupsrc.cpp | 8 +++++--- sys/d3d11/gstd3d11download.cpp | 8 ++++++-- sys/d3d11/gstd3d11upload.cpp | 18 +++++++++++++----- sys/d3d11/gstd3d11videosink.cpp | 10 ++++++++-- sys/mediafoundation/gstmfvideoenc.cpp | 11 ++++++++--- 11 files changed, 84 insertions(+), 31 deletions(-) diff --git a/gst-libs/gst/d3d11/gstd3d11bufferpool.cpp b/gst-libs/gst/d3d11/gstd3d11bufferpool.cpp index 903fb17fd5..64336a14ce 100644 --- a/gst-libs/gst/d3d11/gstd3d11bufferpool.cpp +++ b/gst-libs/gst/d3d11/gstd3d11bufferpool.cpp @@ -307,10 +307,8 @@ gst_d3d11_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config) priv->offset[1] = priv->stride[0] * desc[0].Height; } - self->buffer_size = offset; - gst_buffer_pool_config_set_params (config, - caps, self->buffer_size, min_buffers, max_buffers); + caps, offset, min_buffers, max_buffers); return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret; diff --git a/gst-libs/gst/d3d11/gstd3d11bufferpool.h b/gst-libs/gst/d3d11/gstd3d11bufferpool.h index e809000ea7..114288ccf0 100644 --- a/gst-libs/gst/d3d11/gstd3d11bufferpool.h +++ b/gst-libs/gst/d3d11/gstd3d11bufferpool.h @@ -41,9 +41,6 @@ struct _GstD3D11BufferPool GstD3D11Device *device; - /* re-calculated buffer size based on d3d11 pitch and stride */ - guint buffer_size; - /*< private >*/ GstD3D11BufferPoolPrivate *priv; diff --git a/sys/d3d11/gstd3d11compositor.cpp b/sys/d3d11/gstd3d11compositor.cpp index ce7b1dcb13..1f9198705c 100644 --- a/sys/d3d11/gstd3d11compositor.cpp +++ b/sys/d3d11/gstd3d11compositor.cpp @@ -1955,6 +1955,7 @@ gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator, if (gst_query_get_n_allocation_pools (query) == 0) { GstD3D11AllocationParams *d3d11_params; + GstStructure *config; d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, (GstD3D11AllocationFlags) 0, D3D11_BIND_SHADER_RESOURCE); @@ -1968,8 +1969,12 @@ gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator, return FALSE; } - /* d3d11 buffer pool might update buffer size by self */ - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); gst_query_add_allocation_pool (query, pool, size, 0, 0); gst_object_unref (pool); @@ -2042,8 +2047,12 @@ gst_d3d11_compositor_decide_allocation (GstAggregator * aggregator, gst_d3d11_allocation_params_free (d3d11_params); gst_buffer_pool_set_config (pool, config); - /* d3d11 buffer pool might update buffer size by self */ - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); if (n > 0) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); diff --git a/sys/d3d11/gstd3d11convert.cpp b/sys/d3d11/gstd3d11convert.cpp index 4ce213ff04..058b8e9bba 100644 --- a/sys/d3d11/gstd3d11convert.cpp +++ b/sys/d3d11/gstd3d11convert.cpp @@ -1252,7 +1252,12 @@ gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans, gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL); - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + gst_query_add_allocation_pool (query, pool, size, 0, 0); gst_object_unref (pool); @@ -1359,7 +1364,11 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans, gst_buffer_pool_config_set_params (config, outcaps, size, min, max); gst_buffer_pool_set_config (pool, config); - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); if (update_pool) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); diff --git a/sys/d3d11/gstd3d11decoder.cpp b/sys/d3d11/gstd3d11decoder.cpp index b06f260469..3ae416bdac 100644 --- a/sys/d3d11/gstd3d11decoder.cpp +++ b/sys/d3d11/gstd3d11decoder.cpp @@ -1702,8 +1702,14 @@ gst_d3d11_decoder_decide_allocation (GstD3D11Decoder * decoder, } gst_buffer_pool_set_config (pool, config); - if (use_d3d11_pool) - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + if (use_d3d11_pool) { + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + } if (n > 0) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); diff --git a/sys/d3d11/gstd3d11deinterlace.cpp b/sys/d3d11/gstd3d11deinterlace.cpp index 64e04b47ee..b961cf043e 100644 --- a/sys/d3d11/gstd3d11deinterlace.cpp +++ b/sys/d3d11/gstd3d11deinterlace.cpp @@ -948,7 +948,12 @@ gst_d3d11_deinterlace_propose_allocation (GstBaseTransform * trans, gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL); - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + gst_query_add_allocation_pool (query, pool, size, min_buffers, 0); gst_object_unref (pool); @@ -1022,7 +1027,11 @@ gst_d3d11_deinterlace_decide_allocation (GstBaseTransform * trans, gst_buffer_pool_config_set_params (config, outcaps, size, min, max); gst_buffer_pool_set_config (pool, config); - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); if (update_pool) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); diff --git a/sys/d3d11/gstd3d11desktopdupsrc.cpp b/sys/d3d11/gstd3d11desktopdupsrc.cpp index a01ef16b1e..39ec4cde7b 100644 --- a/sys/d3d11/gstd3d11desktopdupsrc.cpp +++ b/sys/d3d11/gstd3d11desktopdupsrc.cpp @@ -378,9 +378,11 @@ gst_d3d11_desktop_dup_src_decide_allocation (GstBaseSrc * bsrc, gst_buffer_pool_set_config (pool, config); - /* buffer size might be recalculated by pool depending on - * device's stride/padding constraints */ - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); if (update_pool) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); diff --git a/sys/d3d11/gstd3d11download.cpp b/sys/d3d11/gstd3d11download.cpp index b0b5695419..1cf096d9b1 100644 --- a/sys/d3d11/gstd3d11download.cpp +++ b/sys/d3d11/gstd3d11download.cpp @@ -295,9 +295,13 @@ gst_d3d11_download_propose_allocation (GstBaseTransform * trans, gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); - /* d3d11 buffer pool might update buffer size by self */ if (is_d3d11) { - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, + nullptr); + gst_structure_free (config); } gst_query_add_allocation_pool (query, pool, size, 0, 0); diff --git a/sys/d3d11/gstd3d11upload.cpp b/sys/d3d11/gstd3d11upload.cpp index a0bce4c195..758268416b 100644 --- a/sys/d3d11/gstd3d11upload.cpp +++ b/sys/d3d11/gstd3d11upload.cpp @@ -326,9 +326,14 @@ gst_d3d11_upload_propose_allocation (GstBaseTransform * trans, if (!gst_buffer_pool_set_config (pool, config)) goto config_failed; - /* d3d11 buffer pool might update buffer size by self */ - if (is_d3d11) - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + if (is_d3d11) { + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + } gst_query_add_allocation_pool (query, pool, size, 0, 0); gst_object_unref (pool); @@ -446,8 +451,11 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query) gst_buffer_pool_set_config (pool, config); - /* update size with calculated one */ - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr); + gst_structure_free (config); if (update_pool) gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); diff --git a/sys/d3d11/gstd3d11videosink.cpp b/sys/d3d11/gstd3d11videosink.cpp index 9dacfe7da4..9b6db1348d 100644 --- a/sys/d3d11/gstd3d11videosink.cpp +++ b/sys/d3d11/gstd3d11videosink.cpp @@ -885,8 +885,14 @@ gst_d3d11_video_sink_propose_allocation (GstBaseSink * sink, GstQuery * query) return FALSE; } - if (is_d3d11) - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + if (is_d3d11) { + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, + nullptr); + gst_structure_free (config); + } } /* We need at least 2 buffers because we hold on to the last one for redrawing diff --git a/sys/mediafoundation/gstmfvideoenc.cpp b/sys/mediafoundation/gstmfvideoenc.cpp index f03edfb43c..312bb8ec2f 100644 --- a/sys/mediafoundation/gstmfvideoenc.cpp +++ b/sys/mediafoundation/gstmfvideoenc.cpp @@ -1360,9 +1360,14 @@ gst_mf_video_enc_propose_allocation (GstVideoEncoder * enc, GstQuery * query) if (!gst_buffer_pool_set_config (pool, config)) goto config_failed; - /* d3d11 buffer pool might update buffer size by self */ - if (is_d3d11) - size = GST_D3D11_BUFFER_POOL (pool)->buffer_size; + /* d3d11 buffer pool will update buffer size based on allocated texture, + * get size from config again */ + if (is_d3d11) { + config = gst_buffer_pool_get_config (pool); + gst_buffer_pool_config_get_params (config, + nullptr, &size, nullptr, nullptr); + gst_structure_free (config); + } gst_query_add_allocation_pool (query, pool, size, 0, 0); gst_object_unref (pool);