From 81dde0f5b818e6e5dbfb07442b0173c6663e11fd Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Thu, 26 Dec 2019 19:55:40 +0900 Subject: [PATCH] d3d11: Aggregate d3d11 memory usage query for dynamic-usage type decision Even if one of downstream d3d11 elements can support dynamic-usage memory, another one might not support it. Also, to support dynamic-usage, both upstream and downstream d3d11device must be the same object. --- sys/d3d11/gstd3d11colorconvert.c | 23 ----------------------- sys/d3d11/gstd3d11download.c | 29 +++++++++++++++++++++++++++++ sys/d3d11/gstd3d11upload.c | 3 ++- sys/d3d11/gstd3d11utils.c | 11 ++++++++--- sys/d3d11/gstd3d11utils.h | 4 +++- sys/d3d11/gstd3d11videosink.c | 13 +++++++++---- 6 files changed, 51 insertions(+), 32 deletions(-) diff --git a/sys/d3d11/gstd3d11colorconvert.c b/sys/d3d11/gstd3d11colorconvert.c index 821d66d..38b788de 100644 --- a/sys/d3d11/gstd3d11colorconvert.c +++ b/sys/d3d11/gstd3d11colorconvert.c @@ -96,8 +96,6 @@ static GstFlowReturn gst_d3d11_color_convert_transform (GstBaseTransform * static gboolean gst_d3d11_color_convert_set_info (GstD3D11BaseFilter * filter, GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info); -static gboolean gst_d3d11_color_convert_query (GstBaseTransform * trans, - GstPadDirection direction, GstQuery * query); /* copies the given caps */ static GstCaps * @@ -170,7 +168,6 @@ gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass) GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_decide_allocation); trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_transform); - trans_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_query); bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_set_info); @@ -455,26 +452,6 @@ gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans, } static gboolean -gst_d3d11_color_convert_query (GstBaseTransform * trans, - GstPadDirection direction, GstQuery * query) -{ - if (gst_query_is_d3d11_usage (query) && direction == GST_PAD_SINK) { - D3D11_USAGE usage = D3D11_USAGE_DEFAULT; - - gst_query_parse_d3d11_usage (query, &usage); - if (usage == D3D11_USAGE_DEFAULT || usage == D3D11_USAGE_DYNAMIC) - gst_query_set_d3d11_usage_result (query, TRUE); - else - gst_query_set_d3d11_usage_result (query, FALSE); - - return TRUE; - } - - return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, - query); -} - -static gboolean create_shader_input_resource (GstD3D11ColorConvert * self, GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info) { diff --git a/sys/d3d11/gstd3d11download.c b/sys/d3d11/gstd3d11download.c index 05c0a62..dc66ea4 100644 --- a/sys/d3d11/gstd3d11download.c +++ b/sys/d3d11/gstd3d11download.c @@ -25,6 +25,7 @@ #include "gstd3d11memory.h" #include "gstd3d11device.h" #include "gstd3d11bufferpool.h" +#include "gstd3d11utils.h" GST_DEBUG_CATEGORY_STATIC (gst_d3d11_download_debug); #define GST_CAT_DEFAULT gst_d3d11_download_debug @@ -67,6 +68,8 @@ static gboolean gst_d3d11_download_decide_allocation (GstBaseTransform * trans, GstQuery * query); static GstFlowReturn gst_d3d11_download_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); +static gboolean gst_d3d11_download_query (GstBaseTransform * trans, + GstPadDirection direction, GstQuery * query); static void gst_d3d11_download_class_init (GstD3D11DownloadClass * klass) @@ -91,6 +94,7 @@ gst_d3d11_download_class_init (GstD3D11DownloadClass * klass) trans_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_d3d11_download_decide_allocation); trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_download_transform); + trans_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_download_query); GST_DEBUG_CATEGORY_INIT (gst_d3d11_download_debug, "d3d11download", 0, "d3d11download Element"); @@ -315,3 +319,28 @@ invalid_buffer: return GST_FLOW_ERROR; } } + +static gboolean +gst_d3d11_download_query (GstBaseTransform * trans, GstPadDirection direction, + GstQuery * query) +{ + if (gst_query_is_d3d11_usage (query) && direction == GST_PAD_SINK) { + GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); + D3D11_USAGE usage = D3D11_USAGE_DEFAULT; + GstD3D11Device *device; + + gst_query_parse_d3d11_usage (query, &device, &usage); + if (filter->device == device && usage == D3D11_USAGE_DEFAULT) { + gst_query_set_d3d11_usage_result (query, TRUE); + gst_object_unref (device); + } else { + gst_query_set_d3d11_usage_result (query, FALSE); + gst_object_unref (device); + + return TRUE; + } + } + + return GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, + query); +} diff --git a/sys/d3d11/gstd3d11upload.c b/sys/d3d11/gstd3d11upload.c index ff43bfe..0437637 100644 --- a/sys/d3d11/gstd3d11upload.c +++ b/sys/d3d11/gstd3d11upload.c @@ -315,7 +315,8 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query) GstQuery *usage_query; gboolean can_dynamic = FALSE; - usage_query = gst_query_new_d3d11_usage (D3D11_USAGE_DYNAMIC); + usage_query = + gst_query_new_d3d11_usage (filter->device, D3D11_USAGE_DYNAMIC); gst_pad_peer_query (GST_BASE_TRANSFORM_SRC_PAD (trans), usage_query); gst_query_parse_d3d11_usage_result (usage_query, &can_dynamic); gst_query_unref (usage_query); diff --git a/sys/d3d11/gstd3d11utils.c b/sys/d3d11/gstd3d11utils.c index 4419b02..cf933b7 100644 --- a/sys/d3d11/gstd3d11utils.c +++ b/sys/d3d11/gstd3d11utils.c @@ -341,12 +341,15 @@ gst_d3d11_is_windows_8_or_greater (void) } GstQuery * -gst_query_new_d3d11_usage (D3D11_USAGE usage) +gst_query_new_d3d11_usage (GstD3D11Device * device, D3D11_USAGE usage) { GstQuery *query; GstStructure *structure; + g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); + structure = gst_structure_new ("GstQueryD3D11Usage", + "device", GST_TYPE_D3D11_DEVICE, device, "usage", G_TYPE_INT, usage, "result", G_TYPE_BOOLEAN, FALSE, NULL); query = gst_query_new_custom (GST_QUERY_CUSTOM, structure); @@ -354,7 +357,8 @@ gst_query_new_d3d11_usage (D3D11_USAGE usage) } void -gst_query_parse_d3d11_usage (GstQuery * query, D3D11_USAGE * usage) +gst_query_parse_d3d11_usage (GstQuery * query, GstD3D11Device ** device, + D3D11_USAGE * usage) { const GstStructure *structure; @@ -365,7 +369,8 @@ gst_query_parse_d3d11_usage (GstQuery * query, D3D11_USAGE * usage) structure = gst_query_get_structure (query); - gst_structure_get (structure, "usage", G_TYPE_INT, usage, NULL); + gst_structure_get (structure, "device", GST_TYPE_D3D11_DEVICE, device, + "usage", G_TYPE_INT, usage, NULL); } void diff --git a/sys/d3d11/gstd3d11utils.h b/sys/d3d11/gstd3d11utils.h index 5deafce..fc7b397 100644 --- a/sys/d3d11/gstd3d11utils.h +++ b/sys/d3d11/gstd3d11utils.h @@ -42,9 +42,11 @@ gboolean gst_d3d11_ensure_element_data (GstElement * element, gboolean gst_d3d11_is_windows_8_or_greater (void); -GstQuery * gst_query_new_d3d11_usage (D3D11_USAGE usage); +GstQuery * gst_query_new_d3d11_usage (GstD3D11Device * device, + D3D11_USAGE usage); void gst_query_parse_d3d11_usage (GstQuery * query, + GstD3D11Device ** device, D3D11_USAGE *usage); void gst_query_set_d3d11_usage_result (GstQuery * query, diff --git a/sys/d3d11/gstd3d11videosink.c b/sys/d3d11/gstd3d11videosink.c index 626b62c..5fceabf 100644 --- a/sys/d3d11/gstd3d11videosink.c +++ b/sys/d3d11/gstd3d11videosink.c @@ -660,14 +660,19 @@ gst_d3d11_video_sink_query (GstBaseSink * sink, GstQuery * query) case GST_QUERY_CUSTOM: if (gst_query_is_d3d11_usage (query)) { D3D11_USAGE usage = D3D11_USAGE_DEFAULT; + GstD3D11Device *device; - gst_query_parse_d3d11_usage (query, &usage); - if (usage == D3D11_USAGE_DEFAULT || usage == D3D11_USAGE_DYNAMIC) + gst_query_parse_d3d11_usage (query, &device, &usage); + if (device == self->device && + (usage == D3D11_USAGE_DEFAULT || usage == D3D11_USAGE_DYNAMIC)) { gst_query_set_d3d11_usage_result (query, TRUE); - else + gst_object_unref (device); + } else { gst_query_set_d3d11_usage_result (query, FALSE); + gst_object_unref (device); - return TRUE; + return TRUE; + } } break; default: -- 2.7.4