1 // Copyright (c) 2012 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 "content/browser/gpu/gpu_surface_tracker.h"
6
7 #if defined(OS_ANDROID)
8 #include <android/native_window_jni.h>
9 #endif // defined(OS_ANDROID)
10
11 #include "base/logging.h"
12
13 namespace content {
14
GpuSurfaceTracker()15 GpuSurfaceTracker::GpuSurfaceTracker()
16 : next_surface_id_(1) {
17 GpuSurfaceLookup::InitInstance(this);
18 }
19
~GpuSurfaceTracker()20 GpuSurfaceTracker::~GpuSurfaceTracker() {
21 GpuSurfaceLookup::InitInstance(NULL);
22 }
23
GetInstance()24 GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() {
25 return Singleton<GpuSurfaceTracker>::get();
26 }
27
AddSurfaceForRenderer(int renderer_id,int render_widget_id)28 int GpuSurfaceTracker::AddSurfaceForRenderer(int renderer_id,
29 int render_widget_id) {
30 base::AutoLock lock(lock_);
31 int surface_id = next_surface_id_++;
32 surface_map_[surface_id] =
33 SurfaceInfo(renderer_id, render_widget_id, gfx::kNullAcceleratedWidget,
34 gfx::GLSurfaceHandle(), NULL);
35 return surface_id;
36 }
37
LookupSurfaceForRenderer(int renderer_id,int render_widget_id)38 int GpuSurfaceTracker::LookupSurfaceForRenderer(int renderer_id,
39 int render_widget_id) {
40 base::AutoLock lock(lock_);
41 for (SurfaceMap::iterator it = surface_map_.begin(); it != surface_map_.end();
42 ++it) {
43 const SurfaceInfo& info = it->second;
44 if (info.renderer_id == renderer_id &&
45 info.render_widget_id == render_widget_id) {
46 return it->first;
47 }
48 }
49 return 0;
50 }
51
AddSurfaceForNativeWidget(gfx::AcceleratedWidget widget)52 int GpuSurfaceTracker::AddSurfaceForNativeWidget(
53 gfx::AcceleratedWidget widget) {
54 base::AutoLock lock(lock_);
55 int surface_id = next_surface_id_++;
56 surface_map_[surface_id] =
57 SurfaceInfo(0, 0, widget, gfx::GLSurfaceHandle(), NULL);
58 return surface_id;
59 }
60
RemoveSurface(int surface_id)61 void GpuSurfaceTracker::RemoveSurface(int surface_id) {
62 base::AutoLock lock(lock_);
63 DCHECK(surface_map_.find(surface_id) != surface_map_.end());
64 surface_map_.erase(surface_id);
65 }
66
GetRenderWidgetIDForSurface(int surface_id,int * renderer_id,int * render_widget_id)67 bool GpuSurfaceTracker::GetRenderWidgetIDForSurface(int surface_id,
68 int* renderer_id,
69 int* render_widget_id) {
70 base::AutoLock lock(lock_);
71 SurfaceMap::iterator it = surface_map_.find(surface_id);
72 if (it == surface_map_.end())
73 return false;
74 const SurfaceInfo& info = it->second;
75 if (!info.handle.is_transport())
76 return false;
77 *renderer_id = info.renderer_id;
78 *render_widget_id = info.render_widget_id;
79 return true;
80 }
81
SetSurfaceHandle(int surface_id,const gfx::GLSurfaceHandle & handle)82 void GpuSurfaceTracker::SetSurfaceHandle(int surface_id,
83 const gfx::GLSurfaceHandle& handle) {
84 base::AutoLock lock(lock_);
85 DCHECK(surface_map_.find(surface_id) != surface_map_.end());
86 SurfaceInfo& info = surface_map_[surface_id];
87 info.handle = handle;
88 }
89
GetSurfaceHandle(int surface_id)90 gfx::GLSurfaceHandle GpuSurfaceTracker::GetSurfaceHandle(int surface_id) {
91 base::AutoLock lock(lock_);
92 SurfaceMap::iterator it = surface_map_.find(surface_id);
93 if (it == surface_map_.end())
94 return gfx::GLSurfaceHandle();
95 return it->second.handle;
96 }
97
AcquireNativeWidget(int surface_id)98 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget(int surface_id) {
99 base::AutoLock lock(lock_);
100 SurfaceMap::iterator it = surface_map_.find(surface_id);
101 if (it == surface_map_.end())
102 return gfx::kNullAcceleratedWidget;
103
104 #if defined(OS_ANDROID)
105 if (it->second.native_widget != gfx::kNullAcceleratedWidget)
106 ANativeWindow_acquire(it->second.native_widget);
107 #endif // defined(OS_ANDROID)
108
109 return it->second.native_widget;
110 }
111
SetNativeWidget(int surface_id,gfx::AcceleratedWidget widget,SurfaceRef * surface_ref)112 void GpuSurfaceTracker::SetNativeWidget(
113 int surface_id, gfx::AcceleratedWidget widget,
114 SurfaceRef* surface_ref) {
115 base::AutoLock lock(lock_);
116 SurfaceMap::iterator it = surface_map_.find(surface_id);
117 DCHECK(it != surface_map_.end());
118 SurfaceInfo& info = it->second;
119 info.native_widget = widget;
120 info.surface_ref = surface_ref;
121 }
122
GetSurfaceCount()123 std::size_t GpuSurfaceTracker::GetSurfaceCount() {
124 base::AutoLock lock(lock_);
125 return surface_map_.size();
126 }
127
SurfaceInfo()128 GpuSurfaceTracker::SurfaceInfo::SurfaceInfo()
129 : renderer_id(0),
130 render_widget_id(0),
131 native_widget(gfx::kNullAcceleratedWidget) { }
132
SurfaceInfo(int renderer_id,int render_widget_id,const gfx::AcceleratedWidget & native_widget,const gfx::GLSurfaceHandle & handle,const scoped_refptr<SurfaceRef> & surface_ref)133 GpuSurfaceTracker::SurfaceInfo::SurfaceInfo(
134 int renderer_id,
135 int render_widget_id,
136 const gfx::AcceleratedWidget& native_widget,
137 const gfx::GLSurfaceHandle& handle,
138 const scoped_refptr<SurfaceRef>& surface_ref)
139 : renderer_id(renderer_id),
140 render_widget_id(render_widget_id),
141 native_widget(native_widget),
142 handle(handle),
143 surface_ref(surface_ref) { }
144
~SurfaceInfo()145 GpuSurfaceTracker::SurfaceInfo::~SurfaceInfo() { }
146
147
148 } // namespace content
149