Index: ui/ozone/platform/drm/gpu/gbm_buffer.cc |
diff --git a/ui/ozone/platform/drm/gpu/gbm_buffer.cc b/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
index 0db6f9ac186e4c8f45e5d44bbdcb439079a107c4..de628ac8007d89274d1472f5118bc4c130671000 100644 |
--- a/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
+++ b/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
@@ -28,14 +28,14 @@ namespace ui { |
GbmBuffer::GbmBuffer(const scoped_refptr<GbmDevice>& gbm, |
gbm_bo* bo, |
- gfx::BufferFormat format, |
- gfx::BufferUsage usage, |
+ uint32_t format, |
+ uint32_t flags, |
std::vector<base::ScopedFD>&& fds, |
const gfx::Size& size, |
const std::vector<gfx::NativePixmapPlane>&& planes) |
- : GbmBufferBase(gbm, bo, format, usage), |
+ : GbmBufferBase(gbm, bo, format, flags), |
format_(format), |
- usage_(usage), |
+ flags_(flags), |
fds_(std::move(fds)), |
size_(size), |
planes_(std::move(planes)) {} |
@@ -94,36 +94,21 @@ gfx::Size GbmBuffer::GetSize() const { |
// static |
scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
const scoped_refptr<GbmDevice>& gbm, |
- gfx::BufferFormat format, |
+ uint32_t format, |
const gfx::Size& size, |
- gfx::BufferUsage usage) { |
+ uint32_t flags) { |
TRACE_EVENT2("drm", "GbmBuffer::CreateBuffer", "device", |
gbm->device_path().value(), "size", size.ToString()); |
- unsigned flags = 0; |
- switch (usage) { |
- case gfx::BufferUsage::GPU_READ: |
- break; |
- case gfx::BufferUsage::SCANOUT: |
- flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING; |
- break; |
- case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: |
- case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: |
- flags = GBM_BO_USE_LINEAR; |
- break; |
- } |
- |
- gbm_bo* bo = gbm_bo_create(gbm->device(), size.width(), size.height(), |
- GetFourCCFormatFromBufferFormat(format), flags); |
+ gbm_bo* bo = |
+ gbm_bo_create(gbm->device(), size.width(), size.height(), format, flags); |
if (!bo) |
return nullptr; |
std::vector<base::ScopedFD> fds; |
std::vector<gfx::NativePixmapPlane> planes; |
- DCHECK_EQ(gbm_bo_get_num_planes(bo), |
- gfx::NumberOfPlanesForBufferFormat(format)); |
- for (size_t i = 0; i < gfx::NumberOfPlanesForBufferFormat(format); ++i) { |
+ for (size_t i = 0; i < gbm_bo_get_num_planes(bo); ++i) { |
// The fd returned by gbm_bo_get_fd is not ref-counted and need to be |
// kept open for the lifetime of the buffer. |
base::ScopedFD fd(gbm_bo_get_plane_fd(bo, i)); |
@@ -144,8 +129,8 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
gbm_bo_get_plane_size(bo, i), gbm_bo_get_plane_format_modifier(bo, i)); |
} |
scoped_refptr<GbmBuffer> buffer(new GbmBuffer( |
- gbm, bo, format, usage, std::move(fds), size, std::move(planes))); |
- if (usage == gfx::BufferUsage::SCANOUT && !buffer->GetFramebufferId()) |
+ gbm, bo, format, flags, std::move(fds), size, std::move(planes))); |
+ if (flags & GBM_BO_USE_SCANOUT && !buffer->GetFramebufferId()) |
return nullptr; |
return buffer; |
@@ -154,7 +139,7 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
// static |
scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds( |
const scoped_refptr<GbmDevice>& gbm, |
- gfx::BufferFormat format, |
+ uint32_t format, |
const gfx::Size& size, |
std::vector<base::ScopedFD>&& fds, |
const std::vector<gfx::NativePixmapPlane>& planes) { |
@@ -163,13 +148,11 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds( |
DCHECK_LE(fds.size(), planes.size()); |
DCHECK_EQ(planes[0].offset, 0); |
- uint32_t fourcc_format = GetFourCCFormatFromBufferFormat(format); |
- |
// Use scanout if supported. |
- bool use_scanout = gbm_device_is_format_supported( |
- gbm->device(), fourcc_format, |
- GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING) && |
- (planes.size() == 1); |
+ bool use_scanout = |
+ gbm_device_is_format_supported( |
+ gbm->device(), format, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING) && |
+ (planes.size() == 1); |
gbm_bo* bo = nullptr; |
if (use_scanout) { |
@@ -178,7 +161,7 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds( |
fd_data.width = size.width(); |
fd_data.height = size.height(); |
fd_data.stride = planes[0].stride; |
- fd_data.format = fourcc_format; |
+ fd_data.format = format; |
// The fd passed to gbm_bo_import is not ref-counted and need to be |
// kept open for the lifetime of the buffer. |
@@ -190,10 +173,11 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds( |
} |
} |
+ uint32_t flags = GBM_BO_USE_RENDERING; |
+ if (use_scanout) |
+ flags |= GBM_BO_USE_SCANOUT; |
scoped_refptr<GbmBuffer> buffer(new GbmBuffer( |
- gbm, bo, format, |
- use_scanout ? gfx::BufferUsage::SCANOUT : gfx::BufferUsage::GPU_READ, |
- std::move(fds), size, std::move(planes))); |
+ gbm, bo, format, flags, std::move(fds), size, std::move(planes))); |
// If scanout support for buffer is expected then make sure we managed to |
// create a framebuffer for it as otherwise using it for scanout will fail. |
if (use_scanout && !buffer->GetFramebufferId()) |
@@ -214,8 +198,11 @@ void GbmPixmap::SetProcessingCallback( |
gfx::NativePixmapHandle GbmPixmap::ExportHandle() { |
gfx::NativePixmapHandle handle; |
- for (size_t i = 0; |
- i < gfx::NumberOfPlanesForBufferFormat(buffer_->GetFormat()); ++i) { |
+ gfx::BufferFormat format = |
+ ui::GetBufferFormatFromFourCCFormat(buffer_->GetFormat()); |
+ // TODO(dcastagna): Use gbm_bo_get_num_planes once all the formats we use are |
+ // supported by gbm. |
+ for (size_t i = 0; i < gfx::NumberOfPlanesForBufferFormat(format); ++i) { |
// Some formats (e.g: YVU_420) might have less than one fd per plane. |
if (i < buffer_->GetFdCount()) { |
base::ScopedFD scoped_fd(HANDLE_EINTR(dup(buffer_->GetFd(i)))); |
@@ -265,7 +252,7 @@ uint64_t GbmPixmap::GetDmaBufModifier(size_t plane) const { |
} |
gfx::BufferFormat GbmPixmap::GetBufferFormat() const { |
- return buffer_->GetFormat(); |
+ return ui::GetBufferFormatFromFourCCFormat(buffer_->GetFormat()); |
} |
gfx::Size GbmPixmap::GetBufferSize() const { |
@@ -277,7 +264,7 @@ bool GbmPixmap::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
gfx::OverlayTransform plane_transform, |
const gfx::Rect& display_bounds, |
const gfx::RectF& crop_rect) { |
- DCHECK(buffer_->GetUsage() == gfx::BufferUsage::SCANOUT); |
+ DCHECK(buffer_->GetFlags() & GBM_BO_USE_SCANOUT); |
OverlayPlane::ProcessBufferCallback processing_callback; |
if (!processing_callback_.is_null()) |
processing_callback = base::Bind(&GbmPixmap::ProcessBuffer, this); |
@@ -298,10 +285,8 @@ scoped_refptr<ScanoutBuffer> GbmPixmap::ProcessBuffer(const gfx::Size& size, |
format != processed_pixmap_->buffer()->GetFramebufferPixelFormat()) { |
// Release any old processed pixmap. |
processed_pixmap_ = nullptr; |
- gfx::BufferFormat buffer_format = GetBufferFormatFromFourCCFormat(format); |
- |
scoped_refptr<GbmBuffer> buffer = GbmBuffer::CreateBuffer( |
- buffer_->drm().get(), buffer_format, size, buffer_->GetUsage()); |
+ buffer_->drm().get(), format, size, buffer_->GetFlags()); |
if (!buffer) |
return nullptr; |