From 9d5277e70e959f8c8ebd1b8d67f87105434a246f Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 2 Jan 2024 23:36:48 +0900 Subject: [PATCH] d3d12decoder: Fix barrier usage Common state promotion and decay does not seem to be applied to decoder commands. Use barriers explicitly Part-of: --- .../sys/d3d12/gstd3d12decoder.cpp | 55 ++++++++----------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12decoder.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12decoder.cpp index d89d077a41..b06e48b3c9 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12decoder.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12decoder.cpp @@ -1184,12 +1184,9 @@ gst_d3d12_decoder_end_picture (GstD3D12Decoder * decoder, pre_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_READ)); - - if (priv->session->reference_only) { - post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, - D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, - D3D12_RESOURCE_STATE_COMMON)); - } + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, + D3D12_RESOURCE_STATE_COMMON)); } else { gst_d3d12_memory_get_subresource_index (dmem, 0, &subresource[0]); gst_d3d12_memory_get_subresource_index (dmem, 1, &subresource[1]); @@ -1200,15 +1197,12 @@ gst_d3d12_decoder_end_picture (GstD3D12Decoder * decoder, pre_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, subresource[1])); - - if (priv->session->reference_only) { - post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, - D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, - D3D12_RESOURCE_STATE_COMMON, subresource[0])); - post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, - D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, - D3D12_RESOURCE_STATE_COMMON, subresource[1])); - } + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, + D3D12_RESOURCE_STATE_COMMON, subresource[0])); + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, + D3D12_RESOURCE_STATE_COMMON, subresource[1])); } } @@ -1220,8 +1214,9 @@ gst_d3d12_decoder_end_picture (GstD3D12Decoder * decoder, pre_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (out_resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE)); - /* output resource is allocated with simultaneous-access flag. - * resource barrier to common state is not needed */ + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (out_resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, + D3D12_RESOURCE_STATE_COMMON)); } dmem = (GstD3D12Memory *) gst_buffer_peek_memory (decoder_pic->buffer, 0); @@ -1233,12 +1228,9 @@ gst_d3d12_decoder_end_picture (GstD3D12Decoder * decoder, pre_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE)); - - if (priv->session->reference_only) { - post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, - D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, - D3D12_RESOURCE_STATE_COMMON)); - } + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, + D3D12_RESOURCE_STATE_COMMON)); } else { gst_d3d12_memory_get_subresource_index (GST_D3D12_MEMORY_CAST (dmem), 1, &subresource[1]); @@ -1249,15 +1241,12 @@ gst_d3d12_decoder_end_picture (GstD3D12Decoder * decoder, pre_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, subresource[1])); - - if (priv->session->reference_only) { - post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, - D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, - D3D12_RESOURCE_STATE_COMMON, subresource[0])); - post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, - D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, - D3D12_RESOURCE_STATE_COMMON, subresource[1])); - } + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, + D3D12_RESOURCE_STATE_COMMON, subresource[0])); + post_barriers.push_back (CD3DX12_RESOURCE_BARRIER::Transition (resource, + D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE, + D3D12_RESOURCE_STATE_COMMON, subresource[1])); } priv->cmd->cl->ResourceBarrier (pre_barriers.size (), &pre_barriers[0]); @@ -1267,7 +1256,7 @@ gst_d3d12_decoder_end_picture (GstD3D12Decoder * decoder, out_args.OutputSubresource = 0; out_args.ConversionArguments.Enable = TRUE; out_args.ConversionArguments.pReferenceTexture2D = resource; - out_args.ConversionArguments.ReferenceSubresource = 0; + out_args.ConversionArguments.ReferenceSubresource = subresource[0]; } else { out_args.pOutputTexture2D = resource; out_args.OutputSubresource = subresource[0];