gpu_memory_buffer_factory_impl.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
1// Copyright 2013 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 "android_webview/browser/gpu_memory_buffer_factory_impl.h" 6 7#include "android_webview/public/browser/draw_gl.h" 8#include "base/logging.h" 9#include "ui/gfx/gpu_memory_buffer.h" 10#include "ui/gfx/size.h" 11#include "ui/gl/gl_bindings.h" 12 13namespace android_webview { 14 15namespace { 16 17// Provides hardware rendering functions from the Android glue layer. 18AwDrawGLFunctionTable* g_gl_draw_functions = NULL; 19 20class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { 21 public: 22 GpuMemoryBufferImpl(int buffer_id, gfx::Size size) 23 : buffer_id_(buffer_id), 24 size_(size), 25 mapped_(false) { 26 DCHECK(buffer_id_); 27 } 28 29 virtual ~GpuMemoryBufferImpl() { 30 g_gl_draw_functions->release_graphic_buffer(buffer_id_); 31 } 32 33 // Overridden from gfx::GpuMemoryBuffer: 34 virtual void Map(gfx::GpuMemoryBuffer::AccessMode mode, 35 void** vaddr) OVERRIDE { 36 AwMapMode map_mode = MAP_READ_ONLY; 37 switch (mode) { 38 case GpuMemoryBuffer::READ_ONLY: 39 map_mode = MAP_READ_ONLY; 40 break; 41 case GpuMemoryBuffer::WRITE_ONLY: 42 map_mode = MAP_WRITE_ONLY; 43 break; 44 case GpuMemoryBuffer::READ_WRITE: 45 map_mode = MAP_READ_WRITE; 46 break; 47 default: 48 LOG(DFATAL) << "Unknown map mode: " << mode; 49 } 50 int err = g_gl_draw_functions->map(buffer_id_, map_mode, vaddr); 51 DCHECK(!err); 52 mapped_ = true; 53 } 54 virtual void Unmap() OVERRIDE { 55 int err = g_gl_draw_functions->unmap(buffer_id_); 56 DCHECK(!err); 57 mapped_ = false; 58 } 59 virtual bool IsMapped() const OVERRIDE { return mapped_; } 60 virtual uint32 GetStride() const OVERRIDE { 61 return g_gl_draw_functions->get_stride(buffer_id_); 62 } 63 virtual gfx::GpuMemoryBufferHandle GetHandle() const OVERRIDE { 64 gfx::GpuMemoryBufferHandle handle; 65 handle.type = gfx::EGL_CLIENT_BUFFER; 66 handle.native_buffer = g_gl_draw_functions->get_native_buffer(buffer_id_); 67 return handle; 68 } 69 70 private: 71 int buffer_id_; 72 gfx::Size size_; 73 bool mapped_; 74 75 DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl); 76}; 77 78} // namespace 79 80GpuMemoryBufferFactoryImpl::GpuMemoryBufferFactoryImpl() { 81} 82 83GpuMemoryBufferFactoryImpl::~GpuMemoryBufferFactoryImpl() { 84} 85 86gfx::GpuMemoryBuffer* GpuMemoryBufferFactoryImpl::CreateGpuMemoryBuffer( 87 size_t width, 88 size_t height, 89 unsigned internalformat) { 90 // For Android WebView we assume the |internalformat| will always be 91 // GL_RGBA8_OES. 92 CHECK_EQ(static_cast<GLenum>(GL_RGBA8_OES), internalformat); 93 CHECK(g_gl_draw_functions); 94 int buffer_id = g_gl_draw_functions->create_graphic_buffer(width, height); 95 if (!buffer_id) 96 return NULL; 97 98 return new GpuMemoryBufferImpl(buffer_id, gfx::Size(width, height)); 99} 100 101// static 102void GpuMemoryBufferFactoryImpl::SetAwDrawGLFunctionTable( 103 AwDrawGLFunctionTable* table) { 104 g_gl_draw_functions = table; 105} 106 107} // namespace android_webview 108