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);
|
dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||||
/* d3d12 devices are singletons per adapter */
|
/* d3d12 devices are singletons per adapter */
|
||||||
if (dmem->device == self->device)
|
if (gst_d3d12_device_is_equal (dmem->device, self->device))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GST_INFO_OBJECT (self, "Updating device %" GST_PTR_FORMAT " -> %"
|
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);
|
gst_clear_object (&pool);
|
||||||
} else {
|
} else {
|
||||||
GstD3D12BufferPool *dpool = GST_D3D12_BUFFER_POOL (pool);
|
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_DEBUG_OBJECT (self, "Different device, will create new one");
|
||||||
gst_clear_object (&pool);
|
gst_clear_object (&pool);
|
||||||
}
|
}
|
||||||
@ -2487,7 +2487,7 @@ gst_d3d12_compositor_check_device_update (GstElement * agg,
|
|||||||
dmem = GST_D3D12_MEMORY_CAST (mem);
|
dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||||
|
|
||||||
/* We can use existing device */
|
/* 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;
|
data->have_same_device = TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1457,7 +1457,7 @@ gst_d3d12_convert_propose_allocation (GstBaseTransform * trans,
|
|||||||
gst_clear_object (&pool);
|
gst_clear_object (&pool);
|
||||||
} else {
|
} else {
|
||||||
auto dpool = GST_D3D12_BUFFER_POOL (pool);
|
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);
|
gst_clear_object (&pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1548,7 +1548,7 @@ gst_d3d12_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
|||||||
gst_clear_object (&pool);
|
gst_clear_object (&pool);
|
||||||
} else {
|
} else {
|
||||||
auto dpool = GST_D3D12_BUFFER_POOL (pool);
|
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);
|
gst_clear_object (&pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2192,7 +2192,7 @@ gst_d3d12_converter_check_needs_upload (GstD3D12Converter * self,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||||
if (dmem->device != self->device)
|
if (!gst_d3d12_device_is_equal (dmem->device, self->device))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
auto resource = gst_d3d12_memory_get_resource_handle (dmem);
|
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);
|
mem = gst_buffer_peek_memory (frame->output_buffer, 0);
|
||||||
if (gst_is_d3d12_memory (mem)) {
|
if (gst_is_d3d12_memory (mem)) {
|
||||||
dmem = GST_D3D12_MEMORY_CAST (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);
|
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, 0, &out_subresource[0]);
|
||||||
gst_d3d12_memory_get_subresource_index (dmem, 1, &out_subresource[1]);
|
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);
|
gst_clear_object (&pool);
|
||||||
} else {
|
} else {
|
||||||
GstD3D12BufferPool *dpool = GST_D3D12_BUFFER_POOL (pool);
|
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_DEBUG_OBJECT (videodec, "Different device, will create new one");
|
||||||
gst_clear_object (&pool);
|
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);
|
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,
|
const gchar * function,
|
||||||
gint line);
|
gint line);
|
||||||
|
|
||||||
|
gboolean gst_d3d12_device_is_equal (GstD3D12Device * device1,
|
||||||
|
GstD3D12Device * device2);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -702,7 +702,7 @@ gst_d3d12_encoder_upload_frame (GstD3D12Encoder * self, GstBuffer * buffer)
|
|||||||
auto mem = gst_buffer_peek_memory (buffer, 0);
|
auto mem = gst_buffer_peek_memory (buffer, 0);
|
||||||
if (gst_is_d3d12_memory (mem)) {
|
if (gst_is_d3d12_memory (mem)) {
|
||||||
auto dmem = GST_D3D12_MEMORY_CAST (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;
|
GstMapInfo map_info;
|
||||||
if (!gst_memory_map (mem, &map_info,
|
if (!gst_memory_map (mem, &map_info,
|
||||||
(GstMapFlags) (GST_MAP_READ | GST_MAP_D3D12))) {
|
(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);
|
mem = gst_buffer_peek_memory (buf, 0);
|
||||||
if (gst_is_d3d12_memory (mem)) {
|
if (gst_is_d3d12_memory (mem)) {
|
||||||
auto dmem = GST_D3D12_MEMORY_CAST (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_RESOURCE_DESC desc;
|
||||||
D3D12_HEAP_FLAGS heap_flags = D3D12_HEAP_FLAG_NONE;
|
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);
|
mem = gst_buffer_peek_memory (buffer, 0);
|
||||||
if (gst_is_d3d12_memory (mem)) {
|
if (gst_is_d3d12_memory (mem)) {
|
||||||
GstD3D12Memory *dmem = GST_D3D12_MEMORY_CAST (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);
|
g_object_get (dmem->device, "adapter-luid", &adapter_luid, nullptr);
|
||||||
gst_object_unref (priv->device);
|
gst_object_unref (priv->device);
|
||||||
priv->device = (GstD3D12Device *) gst_object_ref (dmem->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);
|
auto src_dmem = GST_D3D12_MEMORY_CAST (src_mem);
|
||||||
|
|
||||||
device = dst_dmem->device;
|
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");
|
GST_LOG ("different device, perform fallback copy");
|
||||||
return gst_d3d12_buffer_copy_into_fallback (dst, src, info);
|
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);
|
gst_clear_object (&pool);
|
||||||
} else {
|
} else {
|
||||||
auto dpool = GST_D3D12_BUFFER_POOL (pool);
|
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);
|
gst_clear_object (&pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1814,7 +1814,7 @@ gst_d3d12_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
|
|||||||
gst_clear_object (&pool);
|
gst_clear_object (&pool);
|
||||||
} else {
|
} else {
|
||||||
GstD3D12BufferPool *dpool = GST_D3D12_BUFFER_POOL (pool);
|
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);
|
gst_clear_object (&pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1025,7 +1025,7 @@ gst_d3d12_video_sink_check_device_update (GstD3D12VideoSink * self,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
auto dmem = GST_D3D12_MEMORY_CAST (mem);
|
||||||
if (dmem->device == self->device)
|
if (gst_d3d12_device_is_equal (dmem->device, self->device))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GST_INFO_OBJECT (self, "Updating device %" GST_PTR_FORMAT " -> %"
|
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);
|
std::unique_lock < std::recursive_mutex > lk (priv->lock);
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if (window->device != device) {
|
if (!gst_d3d12_device_is_equal (window->device, device)) {
|
||||||
priv->ctx = nullptr;
|
priv->ctx = nullptr;
|
||||||
gst_clear_object (&window->device);
|
gst_clear_object (&window->device);
|
||||||
window->device = (GstD3D12Device *) gst_object_ref (device);
|
window->device = (GstD3D12Device *) gst_object_ref (device);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user