OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/ipc/common/gpu_surface_tracker.h" | 5 #include "gpu/ipc/common/gpu_surface_tracker.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 | 9 |
10 #if defined(OS_ANDROID) | 10 #if defined(OS_ANDROID) |
11 #include <android/native_window_jni.h> | 11 #include <android/native_window_jni.h> |
12 #include "ui/gl/android/scoped_java_surface.h" | 12 #include "ui/gl/android/scoped_java_surface.h" |
13 #endif // defined(OS_ANDROID) | 13 #endif // defined(OS_ANDROID) |
14 | 14 |
15 namespace gpu { | 15 namespace gpu { |
16 | 16 |
| 17 GpuSurfaceTracker::Record::Record(gfx::AcceleratedWidget widget |
| 18 #if defined(OS_ANDROID) |
| 19 , |
| 20 jobject j_surface |
| 21 #endif |
| 22 ) |
| 23 : widget(widget) { |
| 24 #if defined(OS_ANDROID) |
| 25 // TODO(liberato): It would be nice to assert |surface != nullptr|, but we |
| 26 // can't. in_process_context_factory.cc (for tests) actually calls us without |
| 27 // a Surface from java. Presumably, nobody uses it. |
| 28 if (j_surface != nullptr) |
| 29 surface = gl::ScopedJavaSurface::AcquireExternalSurface(j_surface); |
| 30 #endif |
| 31 } |
| 32 |
| 33 GpuSurfaceTracker::Record::Record(Record&&) = default; |
| 34 |
17 GpuSurfaceTracker::GpuSurfaceTracker() | 35 GpuSurfaceTracker::GpuSurfaceTracker() |
18 : next_surface_handle_(1) { | 36 : next_surface_handle_(1) { |
19 gpu::GpuSurfaceLookup::InitInstance(this); | 37 gpu::GpuSurfaceLookup::InitInstance(this); |
20 } | 38 } |
21 | 39 |
22 GpuSurfaceTracker::~GpuSurfaceTracker() { | 40 GpuSurfaceTracker::~GpuSurfaceTracker() { |
23 gpu::GpuSurfaceLookup::InitInstance(NULL); | 41 gpu::GpuSurfaceLookup::InitInstance(NULL); |
24 } | 42 } |
25 | 43 |
26 GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { | 44 GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { |
27 return base::Singleton<GpuSurfaceTracker>::get(); | 45 return base::Singleton<GpuSurfaceTracker>::get(); |
28 } | 46 } |
29 | 47 |
30 int GpuSurfaceTracker::AddSurfaceForNativeWidget( | 48 int GpuSurfaceTracker::AddSurfaceForNativeWidget(Record record) { |
31 gfx::AcceleratedWidget widget) { | |
32 base::AutoLock lock(surface_map_lock_); | 49 base::AutoLock lock(surface_map_lock_); |
33 gpu::SurfaceHandle surface_handle = next_surface_handle_++; | 50 gpu::SurfaceHandle surface_handle = next_surface_handle_++; |
34 surface_map_[surface_handle] = widget; | 51 surface_map_.insert( |
| 52 SurfaceMap::value_type(surface_handle, std::move(record))); |
35 return surface_handle; | 53 return surface_handle; |
36 } | 54 } |
37 | 55 |
38 bool GpuSurfaceTracker::IsValidSurfaceHandle( | 56 bool GpuSurfaceTracker::IsValidSurfaceHandle( |
39 gpu::SurfaceHandle surface_handle) const { | 57 gpu::SurfaceHandle surface_handle) const { |
40 base::AutoLock lock(surface_map_lock_); | 58 base::AutoLock lock(surface_map_lock_); |
41 return surface_map_.find(surface_handle) != surface_map_.end(); | 59 return surface_map_.find(surface_handle) != surface_map_.end(); |
42 } | 60 } |
43 | 61 |
44 void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { | 62 void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { |
45 base::AutoLock lock(surface_map_lock_); | 63 base::AutoLock lock(surface_map_lock_); |
46 DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); | 64 DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); |
47 surface_map_.erase(surface_handle); | 65 surface_map_.erase(surface_handle); |
48 } | 66 } |
49 | 67 |
50 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( | 68 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( |
51 gpu::SurfaceHandle surface_handle) { | 69 gpu::SurfaceHandle surface_handle) { |
52 base::AutoLock lock(surface_map_lock_); | 70 base::AutoLock lock(surface_map_lock_); |
53 SurfaceMap::iterator it = surface_map_.find(surface_handle); | 71 SurfaceMap::iterator it = surface_map_.find(surface_handle); |
54 if (it == surface_map_.end()) | 72 if (it == surface_map_.end()) |
55 return gfx::kNullAcceleratedWidget; | 73 return gfx::kNullAcceleratedWidget; |
56 | 74 |
57 #if defined(OS_ANDROID) | 75 #if defined(OS_ANDROID) |
58 if (it->second != gfx::kNullAcceleratedWidget) | 76 if (it->second.widget != gfx::kNullAcceleratedWidget) |
59 ANativeWindow_acquire(it->second); | 77 ANativeWindow_acquire(it->second.widget); |
60 #endif // defined(OS_ANDROID) | 78 #endif // defined(OS_ANDROID) |
61 | 79 |
62 return it->second; | 80 return it->second.widget; |
63 } | 81 } |
64 | 82 |
65 #if defined(OS_ANDROID) | 83 #if defined(OS_ANDROID) |
66 void GpuSurfaceTracker::RegisterViewSurface( | 84 gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface( |
67 int surface_id, jobject j_surface) { | 85 gpu::SurfaceHandle surface_handle) { |
68 base::AutoLock lock(surface_view_map_lock_); | 86 base::AutoLock lock(surface_map_lock_); |
69 DCHECK(surface_view_map_.find(surface_id) == surface_view_map_.end()); | 87 SurfaceMap::const_iterator it = surface_map_.find(surface_handle); |
70 | 88 if (it == surface_map_.end()) |
71 surface_view_map_[surface_id] = | |
72 gl::ScopedJavaSurface::AcquireExternalSurface(j_surface); | |
73 CHECK(surface_view_map_[surface_id].IsValid()); | |
74 } | |
75 | |
76 void GpuSurfaceTracker::UnregisterViewSurface(int surface_id) | |
77 { | |
78 base::AutoLock lock(surface_view_map_lock_); | |
79 DCHECK(surface_view_map_.find(surface_id) != surface_view_map_.end()); | |
80 surface_view_map_.erase(surface_id); | |
81 } | |
82 | |
83 gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface(int surface_id) { | |
84 base::AutoLock lock(surface_view_map_lock_); | |
85 SurfaceViewMap::const_iterator iter = surface_view_map_.find(surface_id); | |
86 if (iter == surface_view_map_.end()) | |
87 return gl::ScopedJavaSurface(); | 89 return gl::ScopedJavaSurface(); |
88 | 90 |
89 const gl::ScopedJavaSurface& j_surface = iter->second; | 91 const gl::ScopedJavaSurface& j_surface = it->second.surface; |
90 DCHECK(j_surface.IsValid()); | 92 DCHECK(j_surface.IsValid()); |
91 return gl::ScopedJavaSurface::AcquireExternalSurface( | 93 return gl::ScopedJavaSurface::AcquireExternalSurface( |
92 j_surface.j_surface().obj()); | 94 j_surface.j_surface().obj()); |
93 } | 95 } |
94 #endif | 96 #endif |
95 | 97 |
96 std::size_t GpuSurfaceTracker::GetSurfaceCount() { | 98 std::size_t GpuSurfaceTracker::GetSurfaceCount() { |
97 base::AutoLock lock(surface_map_lock_); | 99 base::AutoLock lock(surface_map_lock_); |
98 return surface_map_.size(); | 100 return surface_map_.size(); |
99 } | 101 } |
100 | 102 |
101 } // namespace gpu | 103 } // namespace gpu |
OLD | NEW |