mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-02 13:00:51 +00:00
d3d12: Add a helper method for device equality check
GstD3D12Device object itself is not singltons anymore but underlying private struct is singltons. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6494>
This commit is contained in:
parent
faddaa8ba5
commit
0527f27204
|
@ -202,7 +202,7 @@ gst_d3d12_base_filter_before_transform (GstBaseTransform * trans,
|
|||
|
||||
dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
/* d3d12 devices are singletons per adapter */
|
||||
if (dmem->device == self->device)
|
||||
if (gst_d3d12_device_is_equal (dmem->device, self->device))
|
||||
return;
|
||||
|
||||
GST_INFO_OBJECT (self, "Updating device %" GST_PTR_FORMAT " -> %"
|
||||
|
|
|
@ -2132,7 +2132,7 @@ gst_d3d12_compositor_decide_allocation (GstAggregator * agg, GstQuery * query)
|
|||
gst_clear_object (&pool);
|
||||
} else {
|
||||
GstD3D12BufferPool *dpool = GST_D3D12_BUFFER_POOL (pool);
|
||||
if (dpool->device != self->device) {
|
||||
if (!gst_d3d12_device_is_equal (dpool->device, self->device)) {
|
||||
GST_DEBUG_OBJECT (self, "Different device, will create new one");
|
||||
gst_clear_object (&pool);
|
||||
}
|
||||
|
@ -2487,7 +2487,7 @@ gst_d3d12_compositor_check_device_update (GstElement * agg,
|
|||
dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
|
||||
/* We can use existing device */
|
||||
if (dmem->device == self->device) {
|
||||
if (gst_d3d12_device_is_equal (dmem->device, self->device)) {
|
||||
data->have_same_device = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -1457,7 +1457,7 @@ gst_d3d12_convert_propose_allocation (GstBaseTransform * trans,
|
|||
gst_clear_object (&pool);
|
||||
} else {
|
||||
auto dpool = GST_D3D12_BUFFER_POOL (pool);
|
||||
if (dpool->device != filter->device)
|
||||
if (!gst_d3d12_device_is_equal (dpool->device, filter->device))
|
||||
gst_clear_object (&pool);
|
||||
}
|
||||
}
|
||||
|
@ -1548,7 +1548,7 @@ gst_d3d12_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
|||
gst_clear_object (&pool);
|
||||
} else {
|
||||
auto dpool = GST_D3D12_BUFFER_POOL (pool);
|
||||
if (dpool->device != filter->device)
|
||||
if (!gst_d3d12_device_is_equal (dpool->device, filter->device))
|
||||
gst_clear_object (&pool);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2192,7 +2192,7 @@ gst_d3d12_converter_check_needs_upload (GstD3D12Converter * self,
|
|||
return TRUE;
|
||||
|
||||
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
if (dmem->device != self->device)
|
||||
if (!gst_d3d12_device_is_equal (dmem->device, self->device))
|
||||
return TRUE;
|
||||
|
||||
auto resource = gst_d3d12_memory_get_resource_handle (dmem);
|
||||
|
|
|
@ -1420,7 +1420,7 @@ gst_d3d12_decoder_process_output (GstD3D12Decoder * self,
|
|||
mem = gst_buffer_peek_memory (frame->output_buffer, 0);
|
||||
if (gst_is_d3d12_memory (mem)) {
|
||||
dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
if (dmem->device == self->device) {
|
||||
if (gst_d3d12_device_is_equal (dmem->device, self->device)) {
|
||||
out_resource = gst_d3d12_memory_get_resource_handle (dmem);
|
||||
gst_d3d12_memory_get_subresource_index (dmem, 0, &out_subresource[0]);
|
||||
gst_d3d12_memory_get_subresource_index (dmem, 1, &out_subresource[1]);
|
||||
|
@ -1791,7 +1791,7 @@ gst_d3d12_decoder_decide_allocation (GstD3D12Decoder * decoder,
|
|||
gst_clear_object (&pool);
|
||||
} else {
|
||||
GstD3D12BufferPool *dpool = GST_D3D12_BUFFER_POOL (pool);
|
||||
if (dpool->device != decoder->device) {
|
||||
if (!gst_d3d12_device_is_equal (dpool->device, decoder->device)) {
|
||||
GST_DEBUG_OBJECT (videodec, "Different device, will create new one");
|
||||
gst_clear_object (&pool);
|
||||
}
|
||||
|
|
|
@ -1253,3 +1253,21 @@ gst_d3d12_device_clear_yuv_texture (GstD3D12Device * device, GstMemory * mem)
|
|||
gst_d3d12_command_allocator_unref (gst_ca);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_d3d12_device_is_equal (GstD3D12Device * device1, GstD3D12Device * device2)
|
||||
{
|
||||
if (!device1 || !device2)
|
||||
return FALSE;
|
||||
|
||||
g_return_val_if_fail (GST_IS_D3D12_DEVICE (device1), FALSE);
|
||||
g_return_val_if_fail (GST_IS_D3D12_DEVICE (device2), FALSE);
|
||||
|
||||
if (device1 == device2)
|
||||
return TRUE;
|
||||
|
||||
if (device1->priv->inner == device2->priv->inner)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -119,5 +119,8 @@ void gst_d3d12_device_d3d12_debug (GstD3D12Devic
|
|||
const gchar * function,
|
||||
gint line);
|
||||
|
||||
gboolean gst_d3d12_device_is_equal (GstD3D12Device * device1,
|
||||
GstD3D12Device * device2);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -702,7 +702,7 @@ gst_d3d12_encoder_upload_frame (GstD3D12Encoder * self, GstBuffer * buffer)
|
|||
auto mem = gst_buffer_peek_memory (buffer, 0);
|
||||
if (gst_is_d3d12_memory (mem)) {
|
||||
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
if (dmem->device == self->device) {
|
||||
if (gst_d3d12_device_is_equal (dmem->device, self->device)) {
|
||||
GstMapInfo map_info;
|
||||
if (!gst_memory_map (mem, &map_info,
|
||||
(GstMapFlags) (GST_MAP_READ | GST_MAP_D3D12))) {
|
||||
|
|
|
@ -515,7 +515,7 @@ gst_d3d12_ipc_upload (GstD3D12IpcSink * self, GstBuffer * buf)
|
|||
mem = gst_buffer_peek_memory (buf, 0);
|
||||
if (gst_is_d3d12_memory (mem)) {
|
||||
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
if (dmem->device == priv->device) {
|
||||
if (gst_d3d12_device_is_equal (dmem->device, priv->device)) {
|
||||
D3D12_RESOURCE_DESC desc;
|
||||
D3D12_HEAP_FLAGS heap_flags = D3D12_HEAP_FLAG_NONE;
|
||||
|
||||
|
@ -575,7 +575,7 @@ gst_d3d12_ipc_sink_ensure_server (GstD3D12IpcSink * self, GstBuffer * buffer)
|
|||
mem = gst_buffer_peek_memory (buffer, 0);
|
||||
if (gst_is_d3d12_memory (mem)) {
|
||||
GstD3D12Memory *dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
if (dmem->device != priv->device) {
|
||||
if (!gst_d3d12_device_is_equal (dmem->device, priv->device)) {
|
||||
g_object_get (dmem->device, "adapter-luid", &adapter_luid, nullptr);
|
||||
gst_object_unref (priv->device);
|
||||
priv->device = (GstD3D12Device *) gst_object_ref (dmem->device);
|
||||
|
|
|
@ -221,7 +221,7 @@ gst_d3d12_buffer_copy_into (GstBuffer * dst, GstBuffer * src,
|
|||
auto src_dmem = GST_D3D12_MEMORY_CAST (src_mem);
|
||||
|
||||
device = dst_dmem->device;
|
||||
if (device != src_dmem->device) {
|
||||
if (!gst_d3d12_device_is_equal (device, src_dmem->device)) {
|
||||
GST_LOG ("different device, perform fallback copy");
|
||||
return gst_d3d12_buffer_copy_into_fallback (dst, src, info);
|
||||
}
|
||||
|
|
|
@ -751,7 +751,7 @@ gst_d3d12_screen_capture_src_decide_allocation (GstBaseSrc * bsrc,
|
|||
gst_clear_object (&pool);
|
||||
} else {
|
||||
auto dpool = GST_D3D12_BUFFER_POOL (pool);
|
||||
if (dpool->device != self->device)
|
||||
if (!gst_d3d12_device_is_equal (dpool->device, self->device))
|
||||
gst_clear_object (&pool);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1814,7 +1814,7 @@ gst_d3d12_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
|
|||
gst_clear_object (&pool);
|
||||
} else {
|
||||
GstD3D12BufferPool *dpool = GST_D3D12_BUFFER_POOL (pool);
|
||||
if (dpool->device != self->device)
|
||||
if (!gst_d3d12_device_is_equal (dpool->device, self->device))
|
||||
gst_clear_object (&pool);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1025,7 +1025,7 @@ gst_d3d12_video_sink_check_device_update (GstD3D12VideoSink * self,
|
|||
return;
|
||||
|
||||
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||
if (dmem->device == self->device)
|
||||
if (gst_d3d12_device_is_equal (dmem->device, self->device))
|
||||
return;
|
||||
|
||||
GST_INFO_OBJECT (self, "Updating device %" GST_PTR_FORMAT " -> %"
|
||||
|
|
|
@ -1232,7 +1232,7 @@ gst_d3d12_window_prepare (GstD3D12Window * window, GstD3D12Device * device,
|
|||
std::unique_lock < std::recursive_mutex > lk (priv->lock);
|
||||
HRESULT hr;
|
||||
|
||||
if (window->device != device) {
|
||||
if (!gst_d3d12_device_is_equal (window->device, device)) {
|
||||
priv->ctx = nullptr;
|
||||
gst_clear_object (&window->device);
|
||||
window->device = (GstD3D12Device *) gst_object_ref (device);
|
||||
|
|
Loading…
Reference in a new issue