1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/ozone/platform/dri/dri_surface.h" 6 7 #include <errno.h> 8 #include <sys/mman.h> 9 #include <sys/types.h> 10 #include <xf86drm.h> 11 12 #include "base/logging.h" 13 #include "third_party/skia/include/core/SkCanvas.h" 14 #include "ui/gfx/geometry/rect.h" 15 #include "ui/gfx/skia_util.h" 16 #include "ui/ozone/platform/dri/dri_buffer.h" 17 #include "ui/ozone/platform/dri/dri_wrapper.h" 18 19 namespace ui { 20 21 DriSurface::DriSurface( 22 DriWrapper* dri, const gfx::Size& size) 23 : dri_(dri), 24 bitmaps_(), 25 front_buffer_(0), 26 size_(size) { 27 } 28 29 DriSurface::~DriSurface() { 30 } 31 32 bool DriSurface::Initialize() { 33 for (size_t i = 0; i < arraysize(bitmaps_); ++i) { 34 bitmaps_[i].reset(CreateBuffer()); 35 // TODO(dnicoara) Should select the configuration based on what the 36 // underlying system supports. 37 SkImageInfo info = SkImageInfo::Make(size_.width(), 38 size_.height(), 39 kPMColor_SkColorType, 40 kPremul_SkAlphaType); 41 if (!bitmaps_[i]->Initialize(info)) { 42 return false; 43 } 44 } 45 46 return true; 47 } 48 49 uint32_t DriSurface::GetFramebufferId() const { 50 CHECK(backbuffer()); 51 return backbuffer()->framebuffer(); 52 } 53 54 uint32_t DriSurface::GetHandle() const { 55 CHECK(backbuffer()); 56 return backbuffer()->handle(); 57 } 58 59 // This call is made after the hardware just started displaying our back buffer. 60 // We need to update our pointer reference and synchronize the two buffers. 61 void DriSurface::SwapBuffers() { 62 CHECK(frontbuffer()); 63 CHECK(backbuffer()); 64 65 // Update our front buffer pointer. 66 front_buffer_ ^= 1; 67 } 68 69 gfx::Size DriSurface::Size() const { 70 return size_; 71 } 72 73 SkCanvas* DriSurface::GetDrawableForWidget() { 74 CHECK(backbuffer()); 75 return backbuffer()->canvas(); 76 } 77 78 DriBuffer* DriSurface::CreateBuffer() { return new DriBuffer(dri_); } 79 80 } // namespace ui 81