From 71ae632b25737f1b3615f133855845699c6ebc93 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sun, 1 Dec 2019 16:13:38 +0900 Subject: [PATCH] d3d11colorconvert: Disable color conversion with software rasterizer It's much slower than our CPU based color-converter in most case. --- sys/d3d11/gstd3d11colorconvert.c | 30 +++++++++++++++++++++++++++++- sys/d3d11/gstd3d11colorconvert.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/sys/d3d11/gstd3d11colorconvert.c b/sys/d3d11/gstd3d11colorconvert.c index a1f0969..6c61d32 100644 --- a/sys/d3d11/gstd3d11colorconvert.c +++ b/sys/d3d11/gstd3d11colorconvert.c @@ -254,6 +254,7 @@ gst_d3d11_color_convert_propose_allocation (GstBaseTransform * trans, static gboolean gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query); +static gboolean gst_d3d11_color_convert_start (GstBaseTransform * trans); static GstFlowReturn gst_d3d11_color_convert_transform (GstBaseTransform * trans, GstBuffer * inbuf, GstBuffer * outbuf); @@ -456,6 +457,7 @@ 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->start = GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_start); bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_set_info); @@ -560,11 +562,15 @@ static GstCaps * gst_d3d11_color_convert_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) { + GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (trans); GstCaps *tmp, *tmp2; GstCaps *result; /* Get all possible caps that we can transform to */ - tmp = gst_d3d11_color_convert_caps_remove_format_info (caps); + if (self->can_convert) + tmp = gst_d3d11_color_convert_caps_remove_format_info (caps); + else + tmp = gst_caps_copy (caps); if (filter) { tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); @@ -840,6 +846,28 @@ gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans, query); } +static gboolean +gst_d3d11_color_convert_start (GstBaseTransform * trans) +{ + GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); + GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (trans); + gboolean is_hardware; + + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->start (trans)) + return FALSE; + + g_object_get (filter->device, "hardware", &is_hardware, NULL); + + if (!is_hardware) { + GST_WARNING_OBJECT (trans, "D3D11 device is running on software emulation"); + self->can_convert = FALSE; + } else { + self->can_convert = TRUE; + } + + return TRUE; +} + /* from video-converter.c */ typedef struct { diff --git a/sys/d3d11/gstd3d11colorconvert.h b/sys/d3d11/gstd3d11colorconvert.h index d44db5d..d30d8ad 100644 --- a/sys/d3d11/gstd3d11colorconvert.h +++ b/sys/d3d11/gstd3d11colorconvert.h @@ -59,6 +59,7 @@ struct _GstD3D11ColorConvert guint num_output_view; D3D11_VIEWPORT viewport; + gboolean can_convert; GstD3D11ColorConvertPrivate *priv; }; -- 2.7.4