• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "gpu/command_buffer/service/in_process_command_buffer.h"
10 #include "ui/gfx/gpu_memory_buffer.h"
11 #include "ui/gfx/size.h"
12 #include "ui/gl/gl_bindings.h"
13 #include "ui/gl/gl_image_android_native_buffer.h"
14 
15 namespace android_webview {
16 
17 namespace {
18 
19 // Provides hardware rendering functions from the Android glue layer.
20 AwDrawGLFunctionTable* g_gl_draw_functions = NULL;
21 
22 class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer {
23  public:
GpuMemoryBufferImpl(long buffer_id,const gfx::Size & size)24   GpuMemoryBufferImpl(long buffer_id, const gfx::Size& size)
25       : buffer_id_(buffer_id), size_(size), mapped_(false) {
26     DCHECK(buffer_id_);
27   }
28 
~GpuMemoryBufferImpl()29   virtual ~GpuMemoryBufferImpl() {
30     g_gl_draw_functions->release_graphic_buffer(buffer_id_);
31   }
32 
33   // Overridden from gfx::GpuMemoryBuffer:
Map()34   virtual void* Map() OVERRIDE {
35     void* vaddr = NULL;
36     int err = g_gl_draw_functions->map(buffer_id_, MAP_READ_WRITE, &vaddr);
37     DCHECK(!err);
38     mapped_ = true;
39     return vaddr;
40   }
Unmap()41   virtual void Unmap() OVERRIDE {
42     int err = g_gl_draw_functions->unmap(buffer_id_);
43     DCHECK(!err);
44     mapped_ = false;
45   }
IsMapped() const46   virtual bool IsMapped() const OVERRIDE { return mapped_; }
GetStride() const47   virtual uint32 GetStride() const OVERRIDE {
48     return g_gl_draw_functions->get_stride(buffer_id_);
49   }
GetHandle() const50   virtual gfx::GpuMemoryBufferHandle GetHandle() const OVERRIDE {
51     gfx::GpuMemoryBufferHandle handle;
52     handle.type = gfx::ANDROID_NATIVE_BUFFER;
53     handle.buffer_id = buffer_id_;
54     return handle;
55   }
56 
57  private:
58   long buffer_id_;
59   gfx::Size size_;
60   bool mapped_;
61 
62   DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl);
63 };
64 
65 }  // namespace
66 
GpuMemoryBufferFactoryImpl()67 GpuMemoryBufferFactoryImpl::GpuMemoryBufferFactoryImpl() {
68 }
69 
~GpuMemoryBufferFactoryImpl()70 GpuMemoryBufferFactoryImpl::~GpuMemoryBufferFactoryImpl() {
71 }
72 
73 scoped_ptr<gfx::GpuMemoryBuffer>
AllocateGpuMemoryBuffer(size_t width,size_t height,unsigned internalformat,unsigned usage)74 GpuMemoryBufferFactoryImpl::AllocateGpuMemoryBuffer(size_t width,
75                                                     size_t height,
76                                                     unsigned internalformat,
77                                                     unsigned usage) {
78   // For Android WebView we assume the |internalformat| will always be
79   // GL_RGBA8_OES.
80   CHECK_EQ(static_cast<GLenum>(GL_RGBA8_OES), internalformat);
81   CHECK(g_gl_draw_functions);
82   long buffer_id = g_gl_draw_functions->create_graphic_buffer(width, height);
83   if (!buffer_id)
84     return scoped_ptr<gfx::GpuMemoryBuffer>();
85 
86   return make_scoped_ptr(
87              new GpuMemoryBufferImpl(buffer_id, gfx::Size(width, height)))
88       .PassAs<gfx::GpuMemoryBuffer>();
89 }
90 
91 scoped_refptr<gfx::GLImage>
CreateImageForGpuMemoryBuffer(const gfx::GpuMemoryBufferHandle & handle,const gfx::Size & size,unsigned internalformat)92 GpuMemoryBufferFactoryImpl::CreateImageForGpuMemoryBuffer(
93     const gfx::GpuMemoryBufferHandle& handle,
94     const gfx::Size& size,
95     unsigned internalformat) {
96   DCHECK_EQ(gfx::ANDROID_NATIVE_BUFFER, handle.type);
97 
98   EGLClientBuffer native_buffer =
99       g_gl_draw_functions->get_native_buffer(handle.buffer_id);
100   DCHECK(native_buffer);
101 
102   scoped_refptr<gfx::GLImageAndroidNativeBuffer> image(
103       new gfx::GLImageAndroidNativeBuffer(size));
104   if (!image->Initialize(native_buffer))
105     return scoped_refptr<gfx::GLImage>();
106 
107   return image;
108 }
109 
110 // static
SetAwDrawGLFunctionTable(AwDrawGLFunctionTable * table)111 void GpuMemoryBufferFactoryImpl::SetAwDrawGLFunctionTable(
112     AwDrawGLFunctionTable* table) {
113   g_gl_draw_functions = table;
114 }
115 
Initialize()116 bool GpuMemoryBufferFactoryImpl::Initialize() {
117   if (!g_gl_draw_functions)
118     return false;
119 
120   gpu::InProcessCommandBuffer::SetGpuMemoryBufferFactory(this);
121   return true;
122 }
123 
124 }  // namespace android_webview
125