Chromium Code Reviews| Index: ui/ozone/platform/dri/gbm_buffer.cc |
| diff --git a/ui/ozone/platform/dri/gbm_buffer.cc b/ui/ozone/platform/dri/gbm_buffer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f50e53163f18a2a1230eb2320cdd3e6a38d49b29 |
| --- /dev/null |
| +++ b/ui/ozone/platform/dri/gbm_buffer.cc |
| @@ -0,0 +1,115 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "ui/ozone/platform/dri/gbm_buffer.h" |
| + |
| +#include <gbm.h> |
| + |
| +#include "base/logging.h" |
| +#include "ui/ozone/platform/dri/dri_wrapper.h" |
| +#include "ui/ozone/platform/dri/hardware_display_controller.h" |
| + |
| +namespace ui { |
| +namespace { |
| +// Pixel configuration for the current buffer format. |
| +// TODO(dnicoara) These will need to change once we query the hardware for |
| +// supported configurations. |
| +const uint8_t kColorDepth = 24; |
| +const uint8_t kPixelDepth = 32; |
| + |
| +int GetGbmFormatFromBufferFormat(SurfaceFactoryOzone::BufferFormat fmt) { |
| + switch (fmt) { |
| + case SurfaceFactoryOzone::UNKNOWN: |
| + return 0; |
| + // TODO(alexst): Setting this to XRGB for now to allow presentation |
| + // as a primary plane but disallowing overlay transparency. Address this |
| + // to allow both use cases. |
| + case SurfaceFactoryOzone::RGBA_8888: |
| + return GBM_FORMAT_XRGB8888; |
| + case SurfaceFactoryOzone::RGB_888: |
| + return GBM_FORMAT_RGB888; |
| + } |
| + return 0; |
| +} |
| +} |
| + |
| +GbmBuffer::GbmBuffer(gbm_device* device, DriWrapper* dri, |
|
alexst (slow to review)
2014/07/03 18:30:32
nit: these fit in 80chars
achaulk
2014/07/03 19:49:43
Done.
|
| + const gfx::Size& size) |
| + : gbm_device_(device), |
| + bo_(NULL), |
| + handle_(0), |
| + framebuffer_(0), |
| + dri_(dri), |
| + size_(size) {} |
| + |
| +GbmBuffer::~GbmBuffer() { |
| + if (framebuffer_) |
| + dri_->RemoveFramebuffer(framebuffer_); |
| + if (bo_) |
| + gbm_bo_destroy(bo_); |
| +} |
| + |
| +bool GbmBuffer::InitializeBuffer(SurfaceFactoryOzone::BufferFormat format, |
| + bool scanout) { |
| + unsigned flags = GBM_BO_USE_RENDERING; |
| + if (scanout) |
| + flags |= GBM_BO_USE_SCANOUT; |
| + bo_ = gbm_bo_create(gbm_device_, |
| + size_.width(), |
| + size_.height(), |
| + GetGbmFormatFromBufferFormat(format), |
| + flags); |
| + if (!bo_) |
| + return false; |
| + |
| + gbm_bo_set_user_data(bo_, this, NULL); |
| + handle_ = gbm_bo_get_handle(bo_).u32; |
| + |
| + if (!dri_->AddFramebuffer(size_.width(), |
|
dnicoara
2014/07/03 18:30:16
Should skip this is the buffer isn't a scanout buf
achaulk
2014/07/03 19:49:43
Done.
|
| + size_.height(), |
| + kColorDepth, |
| + kPixelDepth, |
| + gbm_bo_get_stride(bo_), |
| + handle_, |
| + &framebuffer_)) { |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +bool GbmBuffer::Initialize() { |
| + return bo_ != NULL; |
| +} |
| + |
| +uint32_t GbmBuffer::GetFramebufferId() const { |
| + return framebuffer_; |
| +} |
| + |
| +uint32_t GbmBuffer::GetHandle() const { |
| + return handle_; |
| +} |
| + |
| +gfx::Size GbmBuffer::Size() const { |
| + return size_; |
| +} |
| + |
| +void GbmBuffer::SwapBuffers() { |
| + NOTREACHED(); |
| +} |
| + |
| +void* GbmBuffer::native_handle() OVERRIDE { |
| + return bo_; |
| +} |
| + |
| +int GbmBuffer::dma_buf_fd() OVERRIDE { |
| + return -1; |
| +} |
| + |
| +//static |
|
alexst (slow to review)
2014/07/03 18:30:32
nit: space after //
achaulk
2014/07/03 19:49:43
Done.
|
| +GbmBuffer* GbmBuffer::GetFromNative(NativeBufferOzone buffer) { |
| + gbm_bo* bo = reinterpret_cast<gbm_bo*>(buffer); |
| + return static_cast<GbmBuffer*>(gbm_bo_get_user_data(bo)); |
| +} |
| + |
| +} // namespace ui |