mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-23 01:50:24 +01:00
d3d12: Improve error detection and reporting for video encoder
Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26456>
This commit is contained in:
parent
0233cdd00d
commit
ba85ca3721
8 changed files with 46 additions and 8 deletions
|
|
@ -2009,6 +2009,7 @@ d3d12_video_encoder_encode_bitstream(struct pipe_video_codec * codec,
|
|||
if (FAILED(hr)) {
|
||||
debug_printf("CreateCommittedResource failed with HR %x\n", hr);
|
||||
pD3D12Enc->m_inflightResourcesPool[d3d12_video_encoder_pool_current_index(pD3D12Enc)].encode_result = PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_FAILED;
|
||||
pD3D12Enc->m_spEncodedFrameMetadata[pD3D12Enc->m_fenceValue % D3D12_VIDEO_ENC_METADATA_BUFFERS_COUNT].encode_result = PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_FAILED;
|
||||
assert(false);
|
||||
return;
|
||||
}
|
||||
|
|
@ -2144,7 +2145,14 @@ d3d12_video_encoder_encode_bitstream(struct pipe_video_codec * codec,
|
|||
// Update current frame pic params state after reconfiguring above.
|
||||
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA currentPicParams =
|
||||
d3d12_video_encoder_get_current_picture_param_settings(pD3D12Enc);
|
||||
pD3D12Enc->m_upDPBManager->get_current_frame_picture_control_data(currentPicParams);
|
||||
|
||||
if (!pD3D12Enc->m_upDPBManager->get_current_frame_picture_control_data(currentPicParams)) {
|
||||
debug_printf("[d3d12_video_encoder_encode_bitstream] get_current_frame_picture_control_data failed!\n");
|
||||
pD3D12Enc->m_inflightResourcesPool[d3d12_video_encoder_pool_current_index(pD3D12Enc)].encode_result = PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_FAILED;
|
||||
pD3D12Enc->m_spEncodedFrameMetadata[pD3D12Enc->m_fenceValue % D3D12_VIDEO_ENC_METADATA_BUFFERS_COUNT].encode_result = PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_FAILED;
|
||||
assert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
// Stores D3D12_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_DESCRIPTOR in the associated metadata
|
||||
// for header generation after execution (if applicable)
|
||||
|
|
@ -2292,6 +2300,8 @@ d3d12_video_encoder_get_feedback(struct pipe_video_codec *codec,
|
|||
requested_metadata_fence,
|
||||
hr);
|
||||
assert(false);
|
||||
if(pMetadata)
|
||||
*pMetadata = opt_metadata;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2302,6 +2312,8 @@ d3d12_video_encoder_get_feedback(struct pipe_video_codec *codec,
|
|||
requested_metadata_fence,
|
||||
opt_metadata.encode_result);
|
||||
assert(false);
|
||||
if(pMetadata)
|
||||
*pMetadata = opt_metadata;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2313,6 +2325,8 @@ d3d12_video_encoder_get_feedback(struct pipe_video_codec *codec,
|
|||
requested_metadata_fence,
|
||||
opt_metadata.encode_result);
|
||||
assert(false);
|
||||
if(pMetadata)
|
||||
*pMetadata = opt_metadata;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2332,6 +2346,8 @@ d3d12_video_encoder_get_feedback(struct pipe_video_codec *codec,
|
|||
D3D12_VIDEO_ENC_METADATA_BUFFERS_COUNT);
|
||||
opt_metadata.encode_result = PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_FAILED;
|
||||
assert(false);
|
||||
if(pMetadata)
|
||||
*pMetadata = opt_metadata;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -2352,6 +2368,8 @@ d3d12_video_encoder_get_feedback(struct pipe_video_codec *codec,
|
|||
requested_metadata_fence,
|
||||
encoderMetadata.EncodeErrorFlags);
|
||||
assert(false);
|
||||
if(pMetadata)
|
||||
*pMetadata = opt_metadata;
|
||||
return;
|
||||
}
|
||||
debug_printf("WrittenSubregionsCount: %" PRIu64" \n", encoderMetadata.WrittenSubregionsCount);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class d3d12_video_encoder_references_manager_interface
|
|||
virtual void begin_frame(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA, bool bUsedAsReference, struct pipe_picture_desc* picture) = 0;
|
||||
virtual void end_frame() = 0;
|
||||
virtual D3D12_VIDEO_ENCODER_RECONSTRUCTED_PICTURE get_current_frame_recon_pic_output_allocation() = 0;
|
||||
virtual void
|
||||
virtual bool
|
||||
get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation) = 0;
|
||||
virtual bool is_current_frame_used_as_reference() = 0;
|
||||
virtual D3D12_VIDEO_ENCODE_REFERENCE_FRAMES get_current_reference_frames() = 0;
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ d3d12_video_encoder_references_manager_av1::get_dpb_physical_slot_refcount_from_
|
|||
return refCount;
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
d3d12_video_encoder_references_manager_av1::get_current_frame_picture_control_data(
|
||||
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation)
|
||||
{
|
||||
|
|
@ -321,6 +321,7 @@ d3d12_video_encoder_references_manager_av1::get_current_frame_picture_control_da
|
|||
#endif
|
||||
|
||||
*codecAllocation.pAV1PicData = m_CurrentFramePicParams;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class d3d12_video_encoder_references_manager_av1 : public d3d12_video_encoder_re
|
|||
bool bUsedAsReference,
|
||||
struct pipe_picture_desc *picture);
|
||||
D3D12_VIDEO_ENCODER_RECONSTRUCTED_PICTURE get_current_frame_recon_pic_output_allocation();
|
||||
void get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation);
|
||||
bool get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation);
|
||||
bool is_current_frame_used_as_reference();
|
||||
D3D12_VIDEO_ENCODE_REFERENCE_FRAMES get_current_reference_frames();
|
||||
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ d3d12_video_encoder_references_manager_h264::reset_gop_tracking_and_dpb()
|
|||
}
|
||||
|
||||
// Calculates the picture control structure for the current frame
|
||||
void
|
||||
bool
|
||||
d3d12_video_encoder_references_manager_h264::get_current_frame_picture_control_data(
|
||||
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation)
|
||||
{
|
||||
|
|
@ -122,6 +122,10 @@ d3d12_video_encoder_references_manager_h264::get_current_frame_picture_control_d
|
|||
});
|
||||
|
||||
assert(foundItemIt != m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end());
|
||||
if (foundItemIt == m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
m_curFrameState.pList0ReferenceFrames[l0Idx] =
|
||||
std::distance(m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.begin(), foundItemIt);
|
||||
}
|
||||
|
|
@ -147,6 +151,10 @@ d3d12_video_encoder_references_manager_h264::get_current_frame_picture_control_d
|
|||
});
|
||||
|
||||
assert(foundItemIt != m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end());
|
||||
if (foundItemIt == m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
m_curFrameState.pList1ReferenceFrames[l1Idx] =
|
||||
std::distance(m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.begin(), foundItemIt);
|
||||
}
|
||||
|
|
@ -166,6 +174,8 @@ d3d12_video_encoder_references_manager_h264::get_current_frame_picture_control_d
|
|||
|
||||
print_l0_l1_lists();
|
||||
print_dpb();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns the resource allocation for a reconstructed picture output for the current frame
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ class d3d12_video_encoder_references_manager_h264 : public d3d12_video_encoder_r
|
|||
void end_frame();
|
||||
void begin_frame(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA curFrameData, bool bUsedAsReference, struct pipe_picture_desc* picture);
|
||||
D3D12_VIDEO_ENCODER_RECONSTRUCTED_PICTURE get_current_frame_recon_pic_output_allocation();
|
||||
void get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation);
|
||||
bool get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation);
|
||||
bool is_current_frame_used_as_reference();
|
||||
D3D12_VIDEO_ENCODE_REFERENCE_FRAMES get_current_reference_frames();
|
||||
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ d3d12_video_encoder_references_manager_hevc::reset_gop_tracking_and_dpb()
|
|||
}
|
||||
|
||||
// Calculates the picture control structure for the current frame
|
||||
void
|
||||
bool
|
||||
d3d12_video_encoder_references_manager_hevc::get_current_frame_picture_control_data(
|
||||
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation)
|
||||
{
|
||||
|
|
@ -134,6 +134,10 @@ d3d12_video_encoder_references_manager_hevc::get_current_frame_picture_control_d
|
|||
});
|
||||
|
||||
assert(foundItemIt != m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end());
|
||||
if (foundItemIt == m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
m_curFrameState.pList0ReferenceFrames[l0Idx] =
|
||||
std::distance(m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.begin(), foundItemIt);
|
||||
m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors[m_curFrameState.pList0ReferenceFrames[l0Idx]].base.IsRefUsedByCurrentPic = true;
|
||||
|
|
@ -160,6 +164,10 @@ d3d12_video_encoder_references_manager_hevc::get_current_frame_picture_control_d
|
|||
});
|
||||
|
||||
assert(foundItemIt != m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end());
|
||||
if (foundItemIt == m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.end())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
m_curFrameState.pList1ReferenceFrames[l1Idx] =
|
||||
std::distance(m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors.begin(), foundItemIt);
|
||||
m_CurrentFrameReferencesData.pReferenceFramesReconPictureDescriptors[m_curFrameState.pList1ReferenceFrames[l1Idx]].base.IsRefUsedByCurrentPic = true;
|
||||
|
|
@ -187,6 +195,7 @@ d3d12_video_encoder_references_manager_hevc::get_current_frame_picture_control_d
|
|||
|
||||
print_l0_l1_lists();
|
||||
print_dpb();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns the resource allocation for a reconstructed picture output for the current frame
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ class d3d12_video_encoder_references_manager_hevc : public d3d12_video_encoder_r
|
|||
void end_frame();
|
||||
void begin_frame(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA curFrameData, bool bUsedAsReference, struct pipe_picture_desc* picture);
|
||||
D3D12_VIDEO_ENCODER_RECONSTRUCTED_PICTURE get_current_frame_recon_pic_output_allocation();
|
||||
void get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation);
|
||||
bool get_current_frame_picture_control_data(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA &codecAllocation);
|
||||
bool is_current_frame_used_as_reference();
|
||||
D3D12_VIDEO_ENCODE_REFERENCE_FRAMES get_current_reference_frames();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue