d3d11: Aggregate d3d11 memory usage query for dynamic-usage type decision
authorSeungha Yang <seungha.yang@navercorp.com>
Thu, 26 Dec 2019 10:55:40 +0000 (19:55 +0900)
committerSeungha Yang <seungha.yang@navercorp.com>
Sat, 28 Dec 2019 05:43:44 +0000 (05:43 +0000)
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
sys/d3d11/gstd3d11download.c
sys/d3d11/gstd3d11upload.c
sys/d3d11/gstd3d11utils.c
sys/d3d11/gstd3d11utils.h
sys/d3d11/gstd3d11videosink.c

index 821d66d..38b788d 100644 (file)
@@ -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)
 {
index 05c0a62..dc66ea4 100644 (file)
@@ -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);
+}
index ff43bfe..0437637 100644 (file)
@@ -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);
index 4419b02..cf933b7 100644 (file)
@@ -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
index 5deafce..fc7b397 100644 (file)
@@ -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,
index 626b62c..5fceabf 100644 (file)
@@ -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: