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 de628ac8007d89274d1472f5118bc4c130671000..ebd499fa7662f3b7ecdbb5e29cfac16d6b38cc3b 100644 |
--- a/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
+++ b/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
@@ -30,10 +30,13 @@ GbmBuffer::GbmBuffer(const scoped_refptr<GbmDevice>& gbm, |
gbm_bo* bo, |
uint32_t format, |
uint32_t flags, |
+ uint64_t modifier, |
+ uint32_t addfb_flags, |
std::vector<base::ScopedFD>&& fds, |
const gfx::Size& size, |
+ |
const std::vector<gfx::NativePixmapPlane>&& planes) |
- : GbmBufferBase(gbm, bo, format, flags), |
+ : GbmBufferBase(gbm, bo, format, flags, modifier, addfb_flags), |
format_(format), |
flags_(flags), |
fds_(std::move(fds)), |
@@ -91,17 +94,14 @@ gfx::Size GbmBuffer::GetSize() const { |
return size_; |
} |
-// static |
-scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
+scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferForBO( |
const scoped_refptr<GbmDevice>& gbm, |
+ gbm_bo* bo, |
uint32_t format, |
const gfx::Size& size, |
- uint32_t flags) { |
- TRACE_EVENT2("drm", "GbmBuffer::CreateBuffer", "device", |
- gbm->device_path().value(), "size", size.ToString()); |
- |
- gbm_bo* bo = |
- gbm_bo_create(gbm->device(), size.width(), size.height(), format, flags); |
+ uint32_t flags, |
+ uint64_t modifier, |
+ uint32_t addfb_flags) { |
if (!bo) |
return nullptr; |
@@ -128,8 +128,9 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
gbm_bo_get_plane_stride(bo, i), gbm_bo_get_plane_offset(bo, i), |
gbm_bo_get_plane_size(bo, i), gbm_bo_get_plane_format_modifier(bo, i)); |
} |
- scoped_refptr<GbmBuffer> buffer(new GbmBuffer( |
- gbm, bo, format, flags, std::move(fds), size, std::move(planes))); |
+ scoped_refptr<GbmBuffer> buffer( |
+ new GbmBuffer(gbm, bo, format, flags, modifier, addfb_flags, |
+ std::move(fds), size, std::move(planes))); |
if (flags & GBM_BO_USE_SCANOUT && !buffer->GetFramebufferId()) |
return nullptr; |
@@ -137,6 +138,40 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
} |
// static |
+scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferWithModifiers( |
+ const scoped_refptr<GbmDevice>& gbm, |
+ uint32_t format, |
+ const gfx::Size& size, |
+ uint32_t flags, |
+ const std::vector<uint64_t>& modifiers) { |
+ TRACE_EVENT2("drm", "GbmBuffer::CreateBufferWithModifiers", "device", |
+ gbm->device_path().value(), "size", size.ToString()); |
+ |
+ gbm_bo* bo = |
+ gbm_bo_create_with_modifiers(gbm->device(), size.width(), size.height(), |
+ format, modifiers.data(), modifiers.size()); |
+ |
+ return CreateBufferForBO(gbm, bo, format, size, flags, |
+ gbm_bo_get_format_modifier(bo), |
+ DRM_MODE_FB_MODIFIERS); |
+} |
+ |
+// static |
+scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
+ const scoped_refptr<GbmDevice>& gbm, |
+ uint32_t format, |
+ const gfx::Size& size, |
+ uint32_t flags) { |
+ TRACE_EVENT2("drm", "GbmBuffer::CreateBuffer", "device", |
+ gbm->device_path().value(), "size", size.ToString()); |
+ |
+ gbm_bo* bo = |
+ gbm_bo_create(gbm->device(), size.width(), size.height(), format, flags); |
+ |
+ return CreateBufferForBO(gbm, bo, format, size, flags, 0, 0); |
+} |
+ |
+// static |
scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds( |
const scoped_refptr<GbmDevice>& gbm, |
uint32_t format, |
@@ -177,7 +212,7 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBufferFromFds( |
if (use_scanout) |
flags |= GBM_BO_USE_SCANOUT; |
scoped_refptr<GbmBuffer> buffer(new GbmBuffer( |
- gbm, bo, format, flags, std::move(fds), size, std::move(planes))); |
+ gbm, bo, format, flags, 0, 0, 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()) |