2024-03-08 13:44:56 +01:00
|
|
|
diff --git gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
|
2024-05-23 03:52:35 +02:00
|
|
|
index 58df3e9ad67b2..759f27c07efe9 100644
|
2024-03-08 13:44:56 +01:00
|
|
|
--- gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
|
|
|
|
+++ gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
|
2024-05-23 03:52:35 +02:00
|
|
|
@@ -180,7 +180,8 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer(
|
2024-03-08 13:44:56 +01:00
|
|
|
// 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 = {
|
2024-05-23 03:52:35 +02:00
|
|
|
@@ -194,7 +195,9 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer(
|
2024-03-08 13:44:56 +01:00
|
|
|
D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET,
|
|
|
|
0,
|
|
|
|
D3D11_RESOURCE_MISC_SHARED_NTHANDLE |
|
|
|
|
- D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX};
|
|
|
|
+ static_cast<UINT>(usage == gfx::BufferUsage::SCANOUT_VEA_CPU_READ
|
|
|
|
+ ? D3D11_RESOURCE_MISC_SHARED
|
|
|
|
+ : D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX)};
|
|
|
|
|
|
|
|
Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture;
|
|
|
|
|
|
|
|
diff --git media/video/renderable_gpu_memory_buffer_video_frame_pool.cc media/video/renderable_gpu_memory_buffer_video_frame_pool.cc
|
2024-05-23 03:52:35 +02:00
|
|
|
index 1d352951f9592..c346ebf506aa0 100644
|
2024-03-08 13:44:56 +01:00
|
|
|
--- media/video/renderable_gpu_memory_buffer_video_frame_pool.cc
|
|
|
|
+++ media/video/renderable_gpu_memory_buffer_video_frame_pool.cc
|
2024-04-23 22:06:00 +02:00
|
|
|
@@ -198,7 +198,7 @@ gfx::Size GetBufferSizeInPixelsForVideoPixelFormat(
|
2024-03-08 13:44:56 +01:00
|
|
|
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
|
2024-04-23 22:06:00 +02:00
|
|
|
@@ -212,13 +212,30 @@ bool FrameResources::Initialize() {
|
2024-03-08 13:44:56 +01:00
|
|
|
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.
|
2024-04-29 16:58:26 +02:00
|
|
|
+ if (format_ == PIXEL_FORMAT_ARGB || format_ == PIXEL_FORMAT_ABGR) {
|
2024-03-08 13:44:56 +01:00
|
|
|
+ // 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.
|
|
|
|
gpu_memory_buffer_ = context->CreateGpuMemoryBuffer(
|
|
|
|
- buffer_size_in_pixels, buffer_format, kBufferUsage);
|
|
|
|
+ buffer_size_in_pixels, buffer_format, buffer_usage);
|
|
|
|
if (!gpu_memory_buffer_) {
|
|
|
|
DLOG(ERROR) << "Failed to allocate GpuMemoryBuffer for frame: coded_size="
|
|
|
|
<< coded_size_.ToString()
|
|
|
|
- << ", usage=" << static_cast<int>(kBufferUsage);
|
|
|
|
+ << ", usage=" << static_cast<int>(buffer_usage);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|