From 0dbb81b190ace952d3d3042e8f102625146eab84 Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Sun, 4 May 2025 09:45:52 +0200 Subject: [PATCH] dx12 video decoder fix --- WickedEngine/wiGraphicsDevice_DX12.cpp | 23 ++++++++--------------- WickedEngine/wiRenderer.cpp | 14 ++------------ WickedEngine/wiVersion.cpp | 2 +- WickedEngine/wiVideo.cpp | 8 ++++---- 4 files changed, 15 insertions(+), 32 deletions(-) diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index f88a78fcc..c1b19a7b0 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -1547,11 +1547,6 @@ namespace dx12_internal ComPtr decoder_heap; ComPtr decoder; - std::atomic current_param_idx{ 0 }; - DXVA_PicParams_H264 pic_params[32] = {}; - DXVA_Qmatrix_H264 qmatrix[32] = {}; - DXVA_Slice_H264_Short slices[32] = {}; - ~VideoDecoder_DX12() { std::scoped_lock lck(allocationhandler->destroylocker); @@ -7469,10 +7464,13 @@ std::mutex queue_locker; auto output_internal = to_internal(op->output); output.pOutputTexture2D = output_internal->resource.Get(); output.OutputSubresource = 0; + output.ConversionArguments.Enable = TRUE; + output.ConversionArguments.pReferenceTexture2D = dpb_internal->resource.Get(); + output.ConversionArguments.ReferenceSubresource = D3D12CalcSubresource(0, op->current_dpb, 0, op->DPB->desc.mip_levels, op->DPB->desc.array_size); } - ID3D12Resource* reference_frames[16] = {}; - UINT reference_subresources[16] = {}; + ID3D12Resource* reference_frames[32] = {}; + UINT reference_subresources[32] = {}; for (size_t i = 0; i < op->DPB->desc.array_size; ++i) { reference_frames[i] = dpb_internal->resource.Get(); @@ -7491,14 +7489,9 @@ std::mutex queue_locker; const h264::PPS* pps = (const h264::PPS*)op->pps; const h264::SPS* sps = (const h264::SPS*)op->sps; - const uint32_t current_param_idx = decoder_internal->current_param_idx.fetch_add(1) % arraysize(decoder_internal->slices); - DXVA_PicParams_H264& pic_params = decoder_internal->pic_params[current_param_idx]; - DXVA_Qmatrix_H264& qmatrix = decoder_internal->qmatrix[current_param_idx]; - DXVA_Slice_H264_Short& sliceinfo = decoder_internal->slices[current_param_idx]; - - pic_params = {}; - qmatrix = {}; - sliceinfo = {}; + DXVA_PicParams_H264 pic_params = {}; + DXVA_Qmatrix_H264 qmatrix = {}; + DXVA_Slice_H264_Short sliceinfo = {}; // DirectX Video Acceleration for H.264/MPEG-4 AVC Decoding, Microsoft, Updated 2010, Page 21 // https://www.microsoft.com/en-us/download/details.aspx?id=11323 diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index bf4feaf86..0defeed84 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -17856,12 +17856,7 @@ void YUV_to_RGB( }; device->BindUAVs(uavs, 0, arraysize(uavs), cmd); - { - GPUBarrier barriers[] = { - GPUBarrier::Image(&output, output.desc.layout, ResourceState::UNORDERED_ACCESS), - }; - device->Barrier(barriers, arraysize(barriers), cmd); - } + device->Barrier(GPUBarrier::Image(&output, output.desc.layout, ResourceState::UNORDERED_ACCESS), cmd); device->Dispatch( (output_desc.width + POSTPROCESS_BLOCKSIZE - 1) / POSTPROCESS_BLOCKSIZE, @@ -17870,12 +17865,7 @@ void YUV_to_RGB( cmd ); - { - GPUBarrier barriers[] = { - GPUBarrier::Image(&output, ResourceState::UNORDERED_ACCESS, output.desc.layout), - }; - device->Barrier(barriers, arraysize(barriers), cmd); - } + device->Barrier(GPUBarrier::Image(&output, ResourceState::UNORDERED_ACCESS, output.desc.layout), cmd); device->EventEnd(cmd); } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index a99eb8ea3..9f6811d68 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 760; + const int revision = 761; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision); diff --git a/WickedEngine/wiVideo.cpp b/WickedEngine/wiVideo.cpp index 63ff9e3bd..82aa7e035 100644 --- a/WickedEngine/wiVideo.cpp +++ b/WickedEngine/wiVideo.cpp @@ -649,8 +649,8 @@ namespace wi::video { // if DPB_AND_OUTPUT_COINCIDE is NOT supported, then DPB is kept always in DPB state, and only the output tex is ever a shader resource: decode_operation.output = &instance->dpb.output; - instance->barriers.push_back(GPUBarrier::Image(&instance->dpb.output, ResourceState::SHADER_RESOURCE_COMPUTE, ResourceState::VIDEO_DECODE_DST, -1, -1, &aspect_luma)); - instance->barriers.push_back(GPUBarrier::Image(&instance->dpb.output, ResourceState::SHADER_RESOURCE_COMPUTE, ResourceState::VIDEO_DECODE_DST, -1, -1, &aspect_chroma)); + instance->barriers.push_back(GPUBarrier::Image(&instance->dpb.output, instance->dpb.output.desc.layout, ResourceState::VIDEO_DECODE_DST, -1, -1, &aspect_luma)); + instance->barriers.push_back(GPUBarrier::Image(&instance->dpb.output, instance->dpb.output.desc.layout, ResourceState::VIDEO_DECODE_DST, -1, -1, &aspect_chroma)); } if (!instance->barriers.empty()) { @@ -678,8 +678,8 @@ namespace wi::video { // if DPB_AND_OUTPUT_COINCIDE is NOT supported, then DPB is kept always in DPB state, and only the output tex is ever a shader resource: GPUBarrier barriers[] = { - GPUBarrier::Image(&instance->dpb.output, ResourceState::VIDEO_DECODE_DST, ResourceState::SHADER_RESOURCE_COMPUTE, -1, -1, &aspect_luma), - GPUBarrier::Image(&instance->dpb.output, ResourceState::VIDEO_DECODE_DST, ResourceState::SHADER_RESOURCE_COMPUTE, -1, -1, &aspect_chroma), + GPUBarrier::Image(&instance->dpb.output, ResourceState::VIDEO_DECODE_DST, instance->dpb.output.desc.layout, -1, -1, &aspect_luma), + GPUBarrier::Image(&instance->dpb.output, ResourceState::VIDEO_DECODE_DST, instance->dpb.output.desc.layout, -1, -1, &aspect_chroma), }; device->Barrier(barriers, arraysize(barriers), cmd); }