Chromium Code Reviews| Index: ui/ozone/platform/dri/buffer_data.cc |
| diff --git a/ui/ozone/platform/dri/buffer_data.cc b/ui/ozone/platform/dri/buffer_data.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f633d5711783d03a37a01f16215186cc58f1b4ba |
| --- /dev/null |
| +++ b/ui/ozone/platform/dri/buffer_data.cc |
| @@ -0,0 +1,71 @@ |
| +// 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/buffer_data.h" |
| + |
| +#include <gbm.h> |
| + |
| +#include "base/logging.h" |
| +#include "ui/ozone/platform/dri/dri_wrapper.h" |
| + |
| +namespace ui { |
| + |
| +// Pixel configuration for the current buffer format. |
| +// TODO(dnicoara) These will need to change once we'll query the hardware for |
|
rjkroege
2014/06/11 14:43:04
grammar nit: "once we query"
alexst (slow to review)
2014/06/11 15:00:06
Done.
|
| +// supported configurations. |
| +const uint8_t kColorDepth = 24; |
| +const uint8_t kPixelDepth = 32; |
| + |
| +BufferData::BufferData(DriWrapper* dri, gbm_bo* buffer) |
| + : dri_(dri), |
| + handle_(gbm_bo_get_handle(buffer).u32), |
| + framebuffer_(0) { |
| + // Register the buffer with the controller. This will allow us to scan out the |
| + // buffer once we're done drawing into it. If we can't register the buffer |
| + // then there's no point in having BufferData associated with it. |
| + if (!dri_->AddFramebuffer(gbm_bo_get_width(buffer), |
| + gbm_bo_get_height(buffer), |
| + kColorDepth, |
| + kPixelDepth, |
| + gbm_bo_get_stride(buffer), |
| + handle_, |
| + &framebuffer_)) { |
| + LOG(ERROR) << "Failed to register buffer"; |
| + } |
| +} |
| + |
| +BufferData::~BufferData() { |
| + if (framebuffer_) |
| + dri_->RemoveFramebuffer(framebuffer_); |
| +} |
| + |
| +// static |
| +BufferData* BufferData::CreateData(DriWrapper* dri, |
| + gbm_bo* buffer) { |
| + BufferData* data = new BufferData(dri, buffer); |
| + if (!data->framebuffer()) { |
| + delete data; |
| + return NULL; |
| + } |
| + |
| + // GBM can destroy the buffers at any time as long as they aren't locked. This |
| + // sets a callback such that we can clean up all our state when GBM destroys |
| + // the buffer. |
| + gbm_bo_set_user_data(buffer, data, BufferData::Destroy); |
| + |
| + return data; |
| +} |
| + |
| +// static |
| +void BufferData::Destroy(gbm_bo* buffer, void* data) { |
|
rjkroege
2014/06/11 14:43:04
this is necessary because gbm is a C-style API and
alexst (slow to review)
2014/06/11 15:00:06
yes
|
| + BufferData* bd = static_cast<BufferData*>(data); |
| + delete bd; |
| +} |
| + |
| +// static |
| +BufferData* BufferData::GetData(gbm_bo* buffer) { |
| + return static_cast<BufferData*>(gbm_bo_get_user_data(buffer)); |
| +} |
| + |
| +} // namespace ui |