1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/ozone/platform/dri/buffer_data.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <gbm.h> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/logging.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/ozone/platform/dri/dri_wrapper.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace ui { 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Pixel configuration for the current buffer format. 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(dnicoara) These will need to change once we query the hardware for 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// supported configurations. 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const uint8_t kColorDepth = 24; 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const uint8_t kPixelDepth = 32; 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BufferData::BufferData(DriWrapper* dri, gbm_bo* buffer) 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : dri_(dri), 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) handle_(gbm_bo_get_handle(buffer).u32), 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) framebuffer_(0) { 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Register the buffer with the controller. This will allow us to scan out the 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // buffer once we're done drawing into it. If we can't register the buffer 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // then there's no point in having BufferData associated with it. 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!dri_->AddFramebuffer(gbm_bo_get_width(buffer), 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gbm_bo_get_height(buffer), 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kColorDepth, 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) kPixelDepth, 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gbm_bo_get_stride(buffer), 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) handle_, 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &framebuffer_)) { 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(ERROR) << "Failed to register buffer"; 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BufferData::~BufferData() { 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (framebuffer_) 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dri_->RemoveFramebuffer(framebuffer_); 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BufferData* BufferData::CreateData(DriWrapper* dri, 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gbm_bo* buffer) { 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BufferData* data = new BufferData(dri, buffer); 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!data->framebuffer()) { 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delete data; 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return NULL; 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // GBM can destroy the buffers at any time as long as they aren't locked. This 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // sets a callback such that we can clean up all our state when GBM destroys 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the buffer. 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) gbm_bo_set_user_data(buffer, data, BufferData::Destroy); 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return data; 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void BufferData::Destroy(gbm_bo* buffer, void* data) { 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BufferData* bd = static_cast<BufferData*>(data); 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delete bd; 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BufferData* BufferData::GetData(gbm_bo* buffer) { 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return static_cast<BufferData*>(gbm_bo_get_user_data(buffer)); 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace ui 72