dx12 video decoder fix

This commit is contained in:
Turanszki Janos
2025-05-04 09:45:52 +02:00
parent 99a891ebdc
commit 0dbb81b190
4 changed files with 15 additions and 32 deletions
+8 -15
View File
@@ -1547,11 +1547,6 @@ namespace dx12_internal
ComPtr<ID3D12VideoDecoderHeap> decoder_heap;
ComPtr<ID3D12VideoDecoder> decoder;
std::atomic<uint32_t> 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
+2 -12
View File
@@ -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);
}
+1 -1
View File
@@ -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);
+4 -4
View File
@@ -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);
}