summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2024-04-27 23:30:40 +0900
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2024-04-28 12:49:07 +0000
commit2c203e0d40f2a835870f07e41cd7cb7a426d5462 (patch)
tree7517484e008c408df5c233dff2c5d75e070bf58c
parent2a14793ee1c0d93bf0cb44f12a60a06a2200d1ec (diff)
d3d12encoder: Handle external fence explicitly
Waits for external fence if any Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6749>
-rw-r--r--subprojects/gst-plugins-bad/sys/d3d12/gstd3d12encoder.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12encoder.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12encoder.cpp
index 160b2ccd30..1ba0c07a05 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12encoder.cpp
+++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12encoder.cpp
@@ -736,6 +736,12 @@ gst_d3d12_encoder_upload_frame (GstD3D12Encoder * self, GstBuffer * buffer)
std::vector < GstD3D12CopyTextureRegionArgs > copy_args;
auto dmem = GST_D3D12_MEMORY_CAST (mem);
auto src_resource = gst_d3d12_memory_get_resource_handle (dmem);
+ ComPtr < ID3D12Fence > fence_to_wait;
+ guint64 fence_val_to_wait = 0;
+
+ gst_d3d12_memory_get_external_fence (dmem,
+ &fence_to_wait, &fence_val_to_wait);
+
dmem = (GstD3D12Memory *) gst_buffer_peek_memory (upload, 0);
auto dst_resource = gst_d3d12_memory_get_resource_handle (dmem);
D3D12_BOX src_box[2];
@@ -771,8 +777,8 @@ gst_d3d12_encoder_upload_frame (GstD3D12Encoder * self, GstBuffer * buffer)
guint64 fence_val = 0;
gst_d3d12_device_copy_texture_region (self->device, copy_args.size (),
- copy_args.data (), nullptr, nullptr, 0, D3D12_COMMAND_LIST_TYPE_DIRECT,
- &fence_val);
+ copy_args.data (), nullptr, fence_to_wait.Get (), fence_val_to_wait,
+ D3D12_COMMAND_LIST_TYPE_DIRECT, &fence_val);
gst_d3d12_buffer_after_write (upload, fence_val);
} else {
GstVideoFrame src_frame, dst_frame;
@@ -1425,6 +1431,14 @@ gst_d3d12_encoder_handle_frame (GstVideoEncoder * encoder,
return GST_FLOW_ERROR;
}
+ ComPtr < ID3D12Fence > fence_to_wait;
+ guint64 fence_val_to_wait = 0;
+ if (gst_d3d12_memory_get_external_fence (mem,
+ &fence_to_wait, &fence_val_to_wait)) {
+ gst_d3d12_command_queue_execute_wait (priv->cmd->queue,
+ fence_to_wait.Get (), fence_val_to_wait);
+ }
+
auto completed = gst_d3d12_device_get_completed_value (self->device,
D3D12_COMMAND_LIST_TYPE_DIRECT);
if (completed < mem->fence_value) {