1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file. 4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "android_webview/browser/gpu_memory_buffer_factory_impl.h" 6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "android_webview/public/browser/draw_gl.h" 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/logging.h" 95b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com#include "gpu/command_buffer/service/in_process_command_buffer.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/gpu_memory_buffer.h" 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/gfx/size.h" 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/gl/gl_bindings.h" 13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace android_webview { 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace { 17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Provides hardware rendering functions from the Android glue layer. 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochAwDrawGLFunctionTable* g_gl_draw_functions = NULL; 20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { 22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public: 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GpuMemoryBufferImpl(long buffer_id, gfx::Size size) 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : buffer_id_(buffer_id), 25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch size_(size), 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch mapped_(false) { 27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(buffer_id_); 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual ~GpuMemoryBufferImpl() { 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch g_gl_draw_functions->release_graphic_buffer(buffer_id_); 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Overridden from gfx::GpuMemoryBuffer: 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void* Map() OVERRIDE { 36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void* vaddr = NULL; 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int err = g_gl_draw_functions->map(buffer_id_, MAP_READ_WRITE, &vaddr); 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!err); 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch mapped_ = true; 40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return vaddr; 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void Unmap() OVERRIDE { 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int err = g_gl_draw_functions->unmap(buffer_id_); 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!err); 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch mapped_ = false; 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual bool IsMapped() const OVERRIDE { return mapped_; } 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual uint32 GetStride() const OVERRIDE { 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return g_gl_draw_functions->get_stride(buffer_id_); 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual gfx::GpuMemoryBufferHandle GetHandle() const OVERRIDE { 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::GpuMemoryBufferHandle handle; 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch handle.type = gfx::ANDROID_NATIVE_BUFFER; 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) handle.native_buffer = g_gl_draw_functions->get_native_buffer(buffer_id_); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return handle; 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private: 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch long buffer_id_; 60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::Size size_; 61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool mapped_; 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl); 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuMemoryBufferFactoryImpl::GpuMemoryBufferFactoryImpl() { 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuMemoryBufferFactoryImpl::~GpuMemoryBufferFactoryImpl() { 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)gfx::GpuMemoryBuffer* GpuMemoryBufferFactoryImpl::CreateGpuMemoryBuffer( 75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch size_t width, 76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch size_t height, 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned internalformat, 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned usage) { 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // For Android WebView we assume the |internalformat| will always be 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // GL_RGBA8_OES. 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CHECK_EQ(static_cast<GLenum>(GL_RGBA8_OES), internalformat); 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CHECK(g_gl_draw_functions); 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch long buffer_id = g_gl_draw_functions->create_graphic_buffer(width, height); 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!buffer_id) 85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return NULL; 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return new GpuMemoryBufferImpl(buffer_id, gfx::Size(width, height)); 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// static 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GpuMemoryBufferFactoryImpl::SetAwDrawGLFunctionTable( 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch AwDrawGLFunctionTable* table) { 93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch g_gl_draw_functions = table; 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 965b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.combool GpuMemoryBufferFactoryImpl::Initialize() { 975b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com if (!g_gl_draw_functions) 985b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com return false; 995b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com 1005b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com gpu::InProcessCommandBuffer::SetGpuMemoryBufferFactory(this); 1015b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com return true; 1025b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com} 1035b6dcb927f1c2e17a62ce91fe4a3e90353e9fa12sievers@google.com 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace android_webview 105