Commit 3909827a authored by Andres Calderon Jaramillo's avatar Andres Calderon Jaramillo Committed by Commit Bot

Accept framebuffer size in CreateGpuMemoryBuffer()

This CL extends the GpuMemoryBufferFactory interface to allow
CreateGpuMemoryBuffer() to take a framebuffer size. This is so that we
can take advantage of the framebuffer_size parameter in the
SurfaceFactoryOzone::CreateNativePixmap() argument. This is useful in
Chrome OS to be able to allocate a buffer of a specific size while
adding a DRM framebuffer of a different size. For example, suppose a
hardware video decoder needs buffers of size 640x368 to decode a video
whose visible rectangle is 640x360. In this case, the size of the DRM
framebuffer should be 640x360 so that the display controller doesn't
sample non-visible data if the video gets promoted to a hardware
overlay.

The extended API is needed because the new direct VD uses a
GpuMemoryBufferFactory to allocate native buffers. It is only needed
within the GPU process (it doesn't need to be exposed to clients). The
extended API is used in CL:2340115.

Bug: b:162880731
Test: None.
Change-Id: Idf0c13e598fe730098424458af7515a320e6d511
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2340069Reviewed-by: default avatarRobert Kroeger <rjkroege@chromium.org>
Reviewed-by: default avatarPeng Huang <penghuang@chromium.org>
Reviewed-by: default avatarDaniele Castagna <dcastagna@chromium.org>
Commit-Queue: Andres Calderon Jaramillo <andrescj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798995}
parent c222df82
...@@ -60,7 +60,8 @@ InProcessGpuMemoryBufferManager::CreateGpuMemoryBuffer( ...@@ -60,7 +60,8 @@ InProcessGpuMemoryBufferManager::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id(next_gpu_memory_id_++); gfx::GpuMemoryBufferId id(next_gpu_memory_id_++);
gfx::GpuMemoryBufferHandle buffer_handle = gfx::GpuMemoryBufferHandle buffer_handle =
gpu_memory_buffer_factory_->CreateGpuMemoryBuffer( gpu_memory_buffer_factory_->CreateGpuMemoryBuffer(
id, size, format, usage, client_id_, surface_handle); id, size, /*framebuffer_size=*/size, format, usage, client_id_,
surface_handle);
AllocatedBufferInfo buffer_info(buffer_handle, size, format); AllocatedBufferInfo buffer_info(buffer_handle, size, format);
......
...@@ -54,8 +54,9 @@ void GpuMemoryBufferFactory::CreateGpuMemoryBufferAsync( ...@@ -54,8 +54,9 @@ void GpuMemoryBufferFactory::CreateGpuMemoryBufferAsync(
CreateGpuMemoryBufferAsyncCallback callback) { CreateGpuMemoryBufferAsyncCallback callback) {
// By default, we assume it's ok to allocate GMBs synchronously on the IO // By default, we assume it's ok to allocate GMBs synchronously on the IO
// thread. However, subclasses can override this assumption. // thread. However, subclasses can override this assumption.
std::move(callback).Run(CreateGpuMemoryBuffer(id, size, format, usage, std::move(callback).Run(
client_id, surface_handle)); CreateGpuMemoryBuffer(id, size, /*framebuffer_size=*/size, format, usage,
client_id, surface_handle));
} }
} // namespace gpu } // namespace gpu
...@@ -35,10 +35,14 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactory { ...@@ -35,10 +35,14 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactory {
// Creates a new GPU memory buffer instance. A valid handle is returned on // Creates a new GPU memory buffer instance. A valid handle is returned on
// success. This method is thread-safe but it should not be called on the IO // success. This method is thread-safe but it should not be called on the IO
// thread as it can lead to deadlocks (see https://crbug.com/981721). Instead // thread as it can lead to deadlocks (see https://crbug.com/981721). Instead
// use the asynchronous version on the IO thread. // use the asynchronous version on the IO thread. |framebuffer_size| specifies
// the size used to create a framebuffer when the |usage| requires it and the
// particular GpuMemoryBufferFactory implementation supports it (for example,
// when creating a buffer for scanout using the Ozone/DRM backend).
virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
......
...@@ -54,10 +54,12 @@ gfx::GpuMemoryBufferHandle ...@@ -54,10 +54,12 @@ gfx::GpuMemoryBufferHandle
GpuMemoryBufferFactoryAndroidHardwareBuffer::CreateGpuMemoryBuffer( GpuMemoryBufferFactoryAndroidHardwareBuffer::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
SurfaceHandle surface_handle) { SurfaceHandle surface_handle) {
DCHECK_EQ(framebuffer_size, size);
auto buffer = GpuMemoryBufferImplAndroidHardwareBuffer::Create( auto buffer = GpuMemoryBufferImplAndroidHardwareBuffer::Create(
id, size, format, usage, GpuMemoryBufferImpl::DestructionCallback()); id, size, format, usage, GpuMemoryBufferImpl::DestructionCallback());
if (!buffer) { if (!buffer) {
......
...@@ -32,6 +32,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryAndroidHardwareBuffer ...@@ -32,6 +32,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryAndroidHardwareBuffer
gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
......
...@@ -20,11 +20,13 @@ GpuMemoryBufferFactoryDXGI::~GpuMemoryBufferFactoryDXGI() {} ...@@ -20,11 +20,13 @@ GpuMemoryBufferFactoryDXGI::~GpuMemoryBufferFactoryDXGI() {}
gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer( gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
SurfaceHandle surface_handle) { SurfaceHandle surface_handle) {
TRACE_EVENT0("gpu", "GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer"); TRACE_EVENT0("gpu", "GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer");
DCHECK_EQ(framebuffer_size, size);
gfx::GpuMemoryBufferHandle handle; gfx::GpuMemoryBufferHandle handle;
......
...@@ -36,6 +36,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryDXGI ...@@ -36,6 +36,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryDXGI
gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
......
...@@ -37,11 +37,13 @@ gfx::GpuMemoryBufferHandle ...@@ -37,11 +37,13 @@ gfx::GpuMemoryBufferHandle
GpuMemoryBufferFactoryIOSurface::CreateGpuMemoryBuffer( GpuMemoryBufferFactoryIOSurface::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
SurfaceHandle surface_handle) { SurfaceHandle surface_handle) {
DCHECK_NE(client_id, kAnonymousClientId); DCHECK_NE(client_id, kAnonymousClientId);
DCHECK_EQ(framebuffer_size, size);
bool should_clear = true; bool should_clear = true;
base::ScopedCFTypeRef<IOSurfaceRef> io_surface( base::ScopedCFTypeRef<IOSurfaceRef> io_surface(
......
...@@ -38,6 +38,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryIOSurface ...@@ -38,6 +38,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryIOSurface
gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
......
...@@ -68,6 +68,7 @@ gfx::GpuMemoryBufferHandle ...@@ -68,6 +68,7 @@ gfx::GpuMemoryBufferHandle
GpuMemoryBufferFactoryNativePixmap::CreateGpuMemoryBuffer( GpuMemoryBufferFactoryNativePixmap::CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
...@@ -78,11 +79,12 @@ GpuMemoryBufferFactoryNativePixmap::CreateGpuMemoryBuffer( ...@@ -78,11 +79,12 @@ GpuMemoryBufferFactoryNativePixmap::CreateGpuMemoryBuffer(
ui::OzonePlatform::GetInstance() ui::OzonePlatform::GetInstance()
->GetSurfaceFactoryOzone() ->GetSurfaceFactoryOzone()
->CreateNativePixmap(surface_handle, GetVulkanDevice(), size, ->CreateNativePixmap(surface_handle, GetVulkanDevice(), size,
format, usage); format, usage, framebuffer_size);
return CreateGpuMemoryBufferFromNativePixmap(id, size, format, usage, return CreateGpuMemoryBufferFromNativePixmap(id, size, format, usage,
client_id, std::move(pixmap)); client_id, std::move(pixmap));
} }
#endif #endif
DCHECK_EQ(framebuffer_size, size);
#if defined(USE_X11) #if defined(USE_X11)
DCHECK(!features::IsUsingOzonePlatform()); DCHECK(!features::IsUsingOzonePlatform());
...@@ -126,8 +128,9 @@ void GpuMemoryBufferFactoryNativePixmap::CreateGpuMemoryBufferAsync( ...@@ -126,8 +128,9 @@ void GpuMemoryBufferFactoryNativePixmap::CreateGpuMemoryBufferAsync(
#endif #endif
#if defined(USE_X11) #if defined(USE_X11)
std::move(callback).Run(CreateGpuMemoryBuffer(id, size, format, usage, std::move(callback).Run(
client_id, surface_handle)); CreateGpuMemoryBuffer(id, size, /*framebuffer_size=*/size, format, usage,
client_id, surface_handle));
#else #else
NOTIMPLEMENTED(); NOTIMPLEMENTED();
std::move(callback).Run(gfx::GpuMemoryBufferHandle()); std::move(callback).Run(gfx::GpuMemoryBufferHandle());
......
...@@ -37,6 +37,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryNativePixmap ...@@ -37,6 +37,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryNativePixmap
gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
......
...@@ -81,9 +81,9 @@ TYPED_TEST_P(GpuMemoryBufferFactoryTest, CreateGpuMemoryBuffer) { ...@@ -81,9 +81,9 @@ TYPED_TEST_P(GpuMemoryBufferFactoryTest, CreateGpuMemoryBuffer) {
continue; continue;
gfx::GpuMemoryBufferHandle handle = gfx::GpuMemoryBufferHandle handle =
TestFixture::factory_.CreateGpuMemoryBuffer(kBufferId, buffer_size, TestFixture::factory_.CreateGpuMemoryBuffer(
format, usage, kClientId, kBufferId, buffer_size, /*framebuffer_size=*/buffer_size, format,
gpu::kNullSurfaceHandle); usage, kClientId, gpu::kNullSurfaceHandle);
EXPECT_NE(handle.type, gfx::EMPTY_BUFFER); EXPECT_NE(handle.type, gfx::EMPTY_BUFFER);
TestFixture::factory_.DestroyGpuMemoryBuffer(kBufferId, kClientId); TestFixture::factory_.DestroyGpuMemoryBuffer(kBufferId, kClientId);
} }
......
...@@ -166,7 +166,8 @@ TEST_F(VulkanImageTest, CreateFromGpuMemoryBufferHandle) { ...@@ -166,7 +166,8 @@ TEST_F(VulkanImageTest, CreateFromGpuMemoryBufferHandle) {
gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT; gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT;
int client_id = 1; int client_id = 1;
auto gmb_handle = factory->CreateGpuMemoryBuffer( auto gmb_handle = factory->CreateGpuMemoryBuffer(
id, size, format.buffer, buffer_usage, client_id, kNullSurfaceHandle); id, size, /*framebuffer_size=*/size, format.buffer, buffer_usage,
client_id, kNullSurfaceHandle);
EXPECT_TRUE(!gmb_handle.is_null()); EXPECT_TRUE(!gmb_handle.is_null());
EXPECT_EQ(gmb_handle.type, EXPECT_EQ(gmb_handle.type,
gfx::GpuMemoryBufferType::ANDROID_HARDWARE_BUFFER); gfx::GpuMemoryBufferType::ANDROID_HARDWARE_BUFFER);
......
...@@ -51,9 +51,9 @@ gfx::GpuMemoryBufferHandle AllocateGpuMemoryBufferHandle( ...@@ -51,9 +51,9 @@ gfx::GpuMemoryBufferHandle AllocateGpuMemoryBufferHandle(
// TODO(hiroh): Rename the client id to more generic one. // TODO(hiroh): Rename the client id to more generic one.
gmb_handle = factory->CreateGpuMemoryBuffer( gmb_handle = factory->CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId(gpu_memory_buffer_id), coded_size, *buffer_format, gfx::GpuMemoryBufferId(gpu_memory_buffer_id), coded_size,
buffer_usage, gpu::kPlatformVideoFramePoolClientId, /*framebuffer_size=*/coded_size, *buffer_format, buffer_usage,
gfx::kNullAcceleratedWidget); gpu::kPlatformVideoFramePoolClientId, gfx::kNullAcceleratedWidget);
DCHECK(gmb_handle.is_null() || gmb_handle.type != gfx::NATIVE_PIXMAP || DCHECK(gmb_handle.is_null() || gmb_handle.type != gfx::NATIVE_PIXMAP ||
VideoFrame::NumPlanes(pixel_format) == VideoFrame::NumPlanes(pixel_format) ==
gmb_handle.native_pixmap_handle.planes.size()); gmb_handle.native_pixmap_handle.planes.size());
......
...@@ -85,6 +85,7 @@ class FakeGpuMemoryBufferFactory : public gpu::GpuMemoryBufferFactory { ...@@ -85,6 +85,7 @@ class FakeGpuMemoryBufferFactory : public gpu::GpuMemoryBufferFactory {
gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
gfx::GpuMemoryBufferId id, gfx::GpuMemoryBufferId id,
const gfx::Size& size, const gfx::Size& size,
const gfx::Size& framebuffer_size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
int client_id, int client_id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment