diff --git gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc index 2096591596a26..5a0c3fd16eecf 100644 --- gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc +++ gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc @@ -179,7 +179,8 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer( // so make sure that the usage is one that we support. DCHECK(usage == gfx::BufferUsage::GPU_READ || usage == gfx::BufferUsage::SCANOUT || - usage == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE) + usage == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE || + usage == gfx::BufferUsage::SCANOUT_VEA_CPU_READ) << "Incorrect usage, usage=" << gfx::BufferUsageToString(usage); D3D11_TEXTURE2D_DESC desc = { @@ -193,7 +194,9 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer( D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, 0, D3D11_RESOURCE_MISC_SHARED_NTHANDLE | - D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX}; + static_cast(usage == gfx::BufferUsage::SCANOUT_VEA_CPU_READ + ? D3D11_RESOURCE_MISC_SHARED + : D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX)}; Microsoft::WRL::ComPtr d3d11_texture; diff --git media/video/renderable_gpu_memory_buffer_video_frame_pool.cc media/video/renderable_gpu_memory_buffer_video_frame_pool.cc index 596affaba0993..3c28ea80fc631 100644 --- media/video/renderable_gpu_memory_buffer_video_frame_pool.cc +++ media/video/renderable_gpu_memory_buffer_video_frame_pool.cc @@ -205,7 +205,7 @@ gfx::Size GetBufferSizeInPixelsForVideoPixelFormat( bool FrameResources::Initialize() { auto* context = pool_->GetContext(); - constexpr gfx::BufferUsage kBufferUsage = + gfx::BufferUsage buffer_usage = #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) gfx::BufferUsage::SCANOUT_VEA_CPU_READ #else @@ -219,6 +219,23 @@ bool FrameResources::Initialize() { const gfx::Size buffer_size_in_pixels = GetBufferSizeInPixelsForVideoPixelFormat(format_, coded_size_); +#if BUILDFLAG(IS_WIN) + // For CEF OSR feature, currently there's no other place in chromium use RGBA. + // If the format is RGBA, currently CEF do not write to the texture anymore + // once the GMB is returned from CopyRequest. So there will be no race + // condition on that texture. We can request a GMB without a keyed mutex to + // accelerate and probably prevent some driver deadlock. + if (format_ == PIXEL_FORMAT_ARGB || format_ == PIXEL_FORMAT_ABGR) { + // This value is 'borrowed', SCANOUT_VEA_CPU_READ is probably invalid + // cause there's no real SCANOUT on Windows. We simply use this enum as a + // flag to disable mutex in the GMBFactoryDXGI because this enum is also + // used above in macOS and CrOS for similar usage (claim no other one will + // concurrently use the resource). + // https://chromium-review.googlesource.com/c/chromium/src/+/5302103 + buffer_usage = gfx::BufferUsage::SCANOUT_VEA_CPU_READ; + } +#endif + // Create the GpuMemoryBuffer if MappableSharedImages is not enabled. When its // enabled, clients only create a mappable shared image directly without // needing to create a GMB. @@ -226,16 +243,16 @@ bool FrameResources::Initialize() { kUseMappableSIForRenderableGpuMemoryBufferVideoFramePool); if (!is_mappable_si_enabled) { gpu_memory_buffer_ = context->CreateGpuMemoryBuffer( - buffer_size_in_pixels, buffer_format, kBufferUsage); + buffer_size_in_pixels, buffer_format, buffer_usage); if (!gpu_memory_buffer_) { LOG(ERROR) << "Failed to allocate GpuMemoryBuffer for frame: coded_size=" << coded_size_.ToString() - << ", usage=" << static_cast(kBufferUsage); + << ", usage=" << static_cast(buffer_usage); return false; } #if BUILDFLAG(IS_MAC) - gpu_memory_buffer_->SetColorSpace(color_space_); + gpu_memory_buffer_->SetColorSpace(color_space_); #endif } @@ -264,7 +281,7 @@ bool FrameResources::Initialize() { if (is_mappable_si_enabled) { shared_image_ = context->CreateSharedImage( - buffer_size_in_pixels, kBufferUsage, si_format, color_space_, + buffer_size_in_pixels, buffer_usage, si_format, color_space_, kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, kSharedImageUsage, sync_token_); } else {