ffmpeg | branch: master | Wu Jianhua <toq...@outlook.com> | Tue Dec 26 01:36:45 
2023 +0800| [94949d4770d7b95af2f46b2d375632d517172b9d] | committer: Haihao Xiang

avcodec/d3d12va_decode: don't change the resource state if the referenced frame 
is the same as the current frame

This commit removes the follow warning and error:

D3D12 WARNING: ID3D12CommandList::ResourceBarrier: Called on the same 
subresource(s) of
Resource(0x000002236E0E00D0:'Unnamed ID3D12Resource Object') in separate 
Barrier Descs
which is inefficient and likely unintentional. Desc[0] and Desc[1] on 
(subresource :
4294967295). [RESOURCE_MANIPULATION WARNING #1008: 
RESOURCE_BARRIER_DUPLICATE_SUBRESOURCE_TRANSITIONS]

D3D12 ERROR: ID3D12CommandList::ResourceBarrier: Before state (0x0: 
D3D12_RESOURCE_STATE_[COMMON|PRESENT])
of resource (0x000002236E0E00D0:'Unnamed ID3D12Resource Object') (subresource: 
0) specified
by transition barrier does not match with the state (0x20000: 
D3D12_RESOURCE_STATE_VIDEO_DECODE_WRITE)
specified in the previous call to ResourceBarrier [RESOURCE_MANIPULATION ERROR 
#527:
RESOURCE_BARRIER_BEFORE_AFTER_MISMATCH]

Tested-by: Tong Wu <tong1...@intel.com>
Signed-off-by: Wu Jianhua <toq...@outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=94949d4770d7b95af2f46b2d375632d517172b9d
---

 libavcodec/d3d12va_decode.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libavcodec/d3d12va_decode.c b/libavcodec/d3d12va_decode.c
index babb2aaa0f..c5c599675e 100644
--- a/libavcodec/d3d12va_decode.c
+++ b/libavcodec/d3d12va_decode.c
@@ -404,7 +404,8 @@ int ff_d3d12va_decode_uninit(AVCodecContext *avctx)
     return 0;
 }
 
-static inline int d3d12va_update_reference_frames_state(AVCodecContext *avctx, 
D3D12_RESOURCE_BARRIER *barriers, int state_before, int state_end)
+static inline int d3d12va_update_reference_frames_state(AVCodecContext *avctx, 
D3D12_RESOURCE_BARRIER *barriers,
+                                                        ID3D12Resource 
*current_resource, int state_before, int state_end)
 {
     D3D12VADecodeContext   *ctx          = D3D12VA_DECODE_CONTEXT(avctx);
     AVHWFramesContext      *frames_ctx   = D3D12VA_FRAMES_CONTEXT(avctx);
@@ -412,7 +413,7 @@ static inline int 
d3d12va_update_reference_frames_state(AVCodecContext *avctx, D
 
     int num_barrier = 0;
     for (int i = 0; i < ctx->max_num_ref; i++) {
-        if (((ctx->used_mask >> i) & 0x1) && ctx->ref_resources[i]) {
+        if (((ctx->used_mask >> i) & 0x1) && ctx->ref_resources[i] && 
ctx->ref_resources[i] != current_resource) {
             barriers[num_barrier].Type  = 
D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
             barriers[num_barrier].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
             barriers[num_barrier].Transition = 
(D3D12_RESOURCE_TRANSITION_BARRIER){
@@ -504,15 +505,14 @@ int ff_d3d12va_common_end_frame(AVCodecContext *avctx, 
AVFrame *frame,
 
     DX_CHECK(ID3D12VideoDecodeCommandList_Reset(cmd_list, command_allocator));
 
-    num_barrier += d3d12va_update_reference_frames_state(avctx, &barriers[1], 
D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_READ);
+    num_barrier += d3d12va_update_reference_frames_state(avctx, &barriers[1], 
resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VIDEO_DECODE_READ);
 
     ID3D12VideoDecodeCommandList_ResourceBarrier(cmd_list, num_barrier, 
barriers);
 
     ID3D12VideoDecodeCommandList_DecodeFrame(cmd_list, ctx->decoder, 
&output_args, &input_args);
 
-    barriers[0].Transition.StateBefore = barriers[0].Transition.StateAfter;
-    barriers[0].Transition.StateAfter  = D3D12_RESOURCE_STATE_COMMON;
-    d3d12va_update_reference_frames_state(avctx, &barriers[1], 
D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, D3D12_RESOURCE_STATE_COMMON);
+    for (int i = 0; i < num_barrier; i++)
+        FFSWAP(D3D12_RESOURCE_STATES, barriers[i].Transition.StateBefore, 
barriers[i].Transition.StateAfter);
 
     ID3D12VideoDecodeCommandList_ResourceBarrier(cmd_list, num_barrier, 
barriers);
 

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to