diff --git a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp index 316c414ac38..45af34b6fae 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_enc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_enc.cpp @@ -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); diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager.h b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager.h index 8c0398711aa..5a212224567 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager.h +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager.h @@ -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; diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp index 49892338984..54e64a15a9f 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.cpp @@ -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 diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.h b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.h index f00d5f80595..ec5cb8c7253 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.h +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_av1.h @@ -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(); diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.cpp b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.cpp index 5bef2e4d555..cb56bc54de6 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.cpp @@ -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 diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.h b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.h index 5579db395bc..fc257de4ad1 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.h +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_h264.h @@ -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(); diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp index 4860ac564dd..6858e2e87ec 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.cpp @@ -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 diff --git a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h index d8633804bfa..1d5315a985f 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h +++ b/src/gallium/drivers/d3d12/d3d12_video_encoder_references_manager_hevc.h @@ -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();