diff --git a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc index d2bfea3f4728c..e4da107e78ff7 100644 --- a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc +++ b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc @@ -485,15 +485,8 @@ GpuVideoAcceleratorFactoriesImpl::VideoFrameOutputFormat( !capabilities.image_ycbcr_420v_disabled_for_video_frames) { return media::GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB; } - if (capabilities.texture_rg) { -#if BUILDFLAG(IS_WIN) - // Windows supports binding single shmem GMB as separate shared images. We - // prefer single GMB because it makes dcomp overlay code simpler. - return media::GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB; -#else + if (capabilities.texture_rg) return media::GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB; -#endif - } return media::GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED; } diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc index 2b757d78a82e1..6447323992d73 100644 --- a/gpu/ipc/common/gpu_memory_buffer_support.cc +++ b/gpu/ipc/common/gpu_memory_buffer_support.cc @@ -77,9 +77,6 @@ bool GpuMemoryBufferSupport::IsNativeGpuMemoryBufferConfigurationSupported( format == gfx::BufferFormat::BGRX_8888 || format == gfx::BufferFormat::RGBX_8888 || format == gfx::BufferFormat::R_8 || - format == gfx::BufferFormat::RG_88 || - format == gfx::BufferFormat::R_16 || - format == gfx::BufferFormat::RG_1616 || format == gfx::BufferFormat::RGBA_F16 || format == gfx::BufferFormat::BGRA_1010102 || format == gfx::BufferFormat::YUV_420_BIPLANAR || @@ -125,7 +122,8 @@ bool GpuMemoryBufferSupport::IsNativeGpuMemoryBufferConfigurationSupported( case gfx::BufferUsage::GPU_READ: case gfx::BufferUsage::SCANOUT: return format == gfx::BufferFormat::RGBA_8888 || - format == gfx::BufferFormat::RGBX_8888; + format == gfx::BufferFormat::RGBX_8888 || + format == gfx::BufferFormat::YUV_420_BIPLANAR; case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::SCANOUT_VDA_WRITE: diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 3ac3d2443c1fe..72886a1e25b54 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc @@ -458,21 +458,11 @@ BASE_FEATURE(kMemoryPressureBasedSourceBufferGC, "MemoryPressureBasedSourceBufferGC", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables binding software video NV12/P010 GMBs as separate shared images. -BASE_FEATURE(kMultiPlaneSoftwareVideoSharedImages, - "MultiPlaneSoftwareVideoSharedImages", -#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif -); - // Enable binding multiple shared images to a single GpuMemoryBuffer for video // frames created by video capture. BASE_FEATURE(kMultiPlaneVideoCaptureSharedImages, "MultiPlaneVideoCaptureSharedImages", -#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_MAC) base::FEATURE_ENABLED_BY_DEFAULT #else base::FEATURE_DISABLED_BY_DEFAULT diff --git a/media/base/media_switches.h b/media/base/media_switches.h index f59a686f02dca..8af79cb1c1526 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h @@ -221,7 +221,6 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaLearningSmoothnessExperiment); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaOptimizer); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaPowerExperiment); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMemoryPressureBasedSourceBufferGC); -MEDIA_EXPORT BASE_DECLARE_FEATURE(kMultiPlaneSoftwareVideoSharedImages); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMultiPlaneVideoCaptureSharedImages); MEDIA_EXPORT BASE_DECLARE_FEATURE(kOpenscreenCastStreamingSession); MEDIA_EXPORT BASE_DECLARE_FEATURE(kOverlayFullscreenVideo); diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc index 92b0aed1fe7a0..33f9c4d9e680e 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc @@ -55,6 +55,15 @@ namespace media { +BASE_FEATURE(kMultiPlaneSoftwareVideoSharedImages, + "MultiPlaneSoftwareVideoSharedImages", +#if BUILDFLAG(IS_MAC) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); + bool GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled() { return base::FeatureList::IsEnabled(kMultiPlaneSoftwareVideoSharedImages); } @@ -1228,12 +1237,9 @@ scoped_refptr GpuMemoryBufferVideoFramePool::PoolImpl:: bool allow_overlay = false; #if BUILDFLAG(IS_WIN) - // Windows direct composition path only supports NV12 video overlays. We use - // separate shared images for the planes for both single and dual NV12 GMBs. + // Windows direct composition path only supports dual GMB NV12 video overlays. allow_overlay = (output_format_ == - GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB) || - (output_format_ == - GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB); + GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB); #else switch (output_format_) { case GpuVideoAcceleratorFactories::OutputFormat::I420: @@ -1244,7 +1250,7 @@ scoped_refptr GpuMemoryBufferVideoFramePool::PoolImpl:: allow_overlay = true; break; case GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB: - // Only used on configurations where we can't support overlays. + // Only used on Windows where we can't use single NV12 textures. break; case GpuVideoAcceleratorFactories::OutputFormat::XR30: case GpuVideoAcceleratorFactories::OutputFormat::XB30: diff --git a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc index 396c1f152b420..eb32f8e8e1f01 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc @@ -774,13 +774,13 @@ TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareP010Frame) { EXPECT_NE(software_frame.get(), frame.get()); EXPECT_EQ(PIXEL_FORMAT_P016LE, frame->format()); - if (GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled()) { - EXPECT_EQ(2u, frame->NumTextures()); - EXPECT_EQ(2u, sii_->shared_image_count()); - } else { - EXPECT_EQ(1u, frame->NumTextures()); - EXPECT_EQ(1u, sii_->shared_image_count()); - } +#if BUILDFLAG(IS_MAC) + EXPECT_EQ(2u, frame->NumTextures()); + EXPECT_EQ(2u, sii_->shared_image_count()); +#else + EXPECT_EQ(1u, frame->NumTextures()); + EXPECT_EQ(1u, sii_->shared_image_count()); +#endif EXPECT_TRUE(frame->metadata().read_lock_fences_enabled); EXPECT_EQ(1u, mock_gpu_factories_->created_memory_buffers().size()); @@ -814,13 +814,13 @@ TEST_F(GpuMemoryBufferVideoFramePoolTest, gfx::IsOddHeightMultiPlanarBuffersAllowed()) { EXPECT_NE(software_frame.get(), frame.get()); EXPECT_EQ(PIXEL_FORMAT_P016LE, frame->format()); - if (GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled()) { - EXPECT_EQ(2u, frame->NumTextures()); - EXPECT_EQ(2u, sii_->shared_image_count()); - } else { - EXPECT_EQ(1u, frame->NumTextures()); - EXPECT_EQ(1u, sii_->shared_image_count()); - } +#if BUILDFLAG(IS_MAC) + EXPECT_EQ(2u, frame->NumTextures()); + EXPECT_EQ(2u, sii_->shared_image_count()); +#else + EXPECT_EQ(1u, frame->NumTextures()); + EXPECT_EQ(1u, sii_->shared_image_count()); +#endif EXPECT_TRUE(frame->metadata().read_lock_fences_enabled); EXPECT_EQ(1u, mock_gpu_factories_->created_memory_buffers().size()); diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc index ea3c4176cdb66..19a549ac532d7 100644 --- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc +++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc @@ -527,8 +527,21 @@ bool VideoCaptureImpl::VideoFrameBufferPreparer::BindVideoFrameOnMediaThread( usage |= gpu::SHARED_IMAGE_USAGE_MACOS_VIDEO_TOOLBOX; #endif - if (base::FeatureList::IsEnabled( - media::kMultiPlaneVideoCaptureSharedImages)) { + unsigned texture_target = + buffer_context_->gpu_factories()->ImageTextureTarget( + gpu_memory_buffer_->GetFormat()); + + // TODO(sunnyps): Get rid of NV12_DUAL_GMB format and instead rely on enabled + // by default multi plane shared images on Windows. + + const bool use_multiplane = +#if BUILDFLAG(IS_WIN) + output_format == + media::GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB || +#endif + base::FeatureList::IsEnabled(media::kMultiPlaneVideoCaptureSharedImages); + + if (use_multiplane) { planes.push_back(gfx::BufferPlane::Y); planes.push_back(gfx::BufferPlane::UV); } else { @@ -550,10 +563,6 @@ bool VideoCaptureImpl::VideoFrameBufferPreparer::BindVideoFrameOnMediaThread( } } - const unsigned texture_target = - buffer_context_->gpu_factories()->ImageTextureTarget( - gpu_memory_buffer_->GetFormat()); - const gpu::SyncToken sync_token = sii->GenVerifiedSyncToken(); gpu::MailboxHolder mailbox_holder_array[media::VideoFrame::kMaxPlanes];