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