mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
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.wu@intel.com> Signed-off-by: Wu Jianhua <toqsxw@outlook.com>
This commit is contained in:
parent
270cd14bbb
commit
94949d4770
@ -404,7 +404,8 @@ int ff_d3d12va_decode_uninit(AVCodecContext *avctx)
|
|||||||
return 0;
|
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);
|
D3D12VADecodeContext *ctx = D3D12VA_DECODE_CONTEXT(avctx);
|
||||||
AVHWFramesContext *frames_ctx = D3D12VA_FRAMES_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;
|
int num_barrier = 0;
|
||||||
for (int i = 0; i < ctx->max_num_ref; i++) {
|
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].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
|
||||||
barriers[num_barrier].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
|
barriers[num_barrier].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
|
||||||
barriers[num_barrier].Transition = (D3D12_RESOURCE_TRANSITION_BARRIER){
|
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));
|
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_ResourceBarrier(cmd_list, num_barrier, barriers);
|
||||||
|
|
||||||
ID3D12VideoDecodeCommandList_DecodeFrame(cmd_list, ctx->decoder, &output_args, &input_args);
|
ID3D12VideoDecodeCommandList_DecodeFrame(cmd_list, ctx->decoder, &output_args, &input_args);
|
||||||
|
|
||||||
barriers[0].Transition.StateBefore = barriers[0].Transition.StateAfter;
|
for (int i = 0; i < num_barrier; i++)
|
||||||
barriers[0].Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON;
|
FFSWAP(D3D12_RESOURCE_STATES, barriers[i].Transition.StateBefore, barriers[i].Transition.StateAfter);
|
||||||
d3d12va_update_reference_frames_state(avctx, &barriers[1], D3D12_RESOURCE_STATE_VIDEO_DECODE_READ, D3D12_RESOURCE_STATE_COMMON);
|
|
||||||
|
|
||||||
ID3D12VideoDecodeCommandList_ResourceBarrier(cmd_list, num_barrier, barriers);
|
ID3D12VideoDecodeCommandList_ResourceBarrier(cmd_list, num_barrier, barriers);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user