| // 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/drm/gpu/drm_console_buffer.h" | 
 |  | 
 | #include <sys/mman.h> | 
 | #include <xf86drmMode.h> | 
 |  | 
 | #include "third_party/skia/include/core/SkCanvas.h" | 
 | #include "ui/ozone/platform/drm/common/scoped_drm_types.h" | 
 | #include "ui/ozone/platform/drm/gpu/drm_device.h" | 
 |  | 
 | namespace ui { | 
 |  | 
 | DrmConsoleBuffer::DrmConsoleBuffer(const scoped_refptr<DrmDevice>& drm, | 
 |                                    uint32_t framebuffer) | 
 |     : drm_(drm), framebuffer_(framebuffer) { | 
 | } | 
 |  | 
 | DrmConsoleBuffer::~DrmConsoleBuffer() { | 
 |   if (mmap_base_) | 
 |     if (munmap(mmap_base_, mmap_size_)) | 
 |       PLOG(ERROR) << "munmap"; | 
 |  | 
 |   if (handle_ && !drm_->CloseBufferHandle(handle_)) | 
 |     PLOG(ERROR) << "DrmConsoleBuffer: CloseBufferHandle: handle " << handle_; | 
 | } | 
 |  | 
 | bool DrmConsoleBuffer::Initialize() { | 
 |   ScopedDrmFramebufferPtr fb(drm_->GetFramebuffer(framebuffer_)); | 
 |  | 
 |   if (!fb) | 
 |     return false; | 
 |  | 
 |   handle_ = fb->handle; | 
 |   stride_ = fb->pitch; | 
 |   SkImageInfo info = SkImageInfo::MakeN32Premul(fb->width, fb->height); | 
 |  | 
 |   mmap_size_ = info.getSafeSize(stride_); | 
 |  | 
 |   if (!drm_->MapDumbBuffer(fb->handle, mmap_size_, &mmap_base_)) { | 
 |     mmap_base_ = NULL; | 
 |     return false; | 
 |   } | 
 |  | 
 |   surface_ = | 
 |       skia::AdoptRef(SkSurface::NewRasterDirect(info, mmap_base_, stride_)); | 
 |   if (!surface_) | 
 |     return false; | 
 |  | 
 |   return true; | 
 | } | 
 |  | 
 | }  // namespace ui |