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:
Sil Vilerino 2023-11-21 15:54:34 -05:00 committed by Marge Bot
parent 0233cdd00d
commit ba85ca3721
8 changed files with 46 additions and 8 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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();

View file

@ -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

View file

@ -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();

View file

@ -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

View file

@ -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();