diff --git a/media/gpu/windows/d3d12_video_encode_accelerator.cc b/media/gpu/windows/d3d12_video_encode_accelerator.cc --- a/media/gpu/windows/d3d12_video_encode_accelerator.cc +++ b/media/gpu/windows/d3d12_video_encode_accelerator.cc @@ -412,6 +412,15 @@ D3D12VideoEncodeAccelerator::~D3D12VideoEncodeAccelerator() { VLOGF(2); DCHECK_CALLED_ON_VALID_SEQUENCE(encoder_sequence_checker_); + + // Wait for any in-flight COPY-engine work to complete before member + // destruction releases |input_texture_| / |upload_buffer_|. Those members + // are declared after |copy_command_queue_| and are therefore destroyed + // first; without this explicit wait the COPY engine may still be DMA-ing + // into a freed committed resource when their last ComPtr ref is Released. + if (copy_command_queue_) { + copy_command_queue_->WaitSync(); + } if (!error_occurred_ && encoded_at_least_one_frame_) { base::UmaHistogramEnumeration(