92 lines
4.4 KiB
Diff
92 lines
4.4 KiB
Diff
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<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
|
|
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<int>(kBufferUsage);
|
|
+ << ", usage=" << static_cast<int>(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 {
|