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 #if defined(OS_ANDROID) |
| 18 GpuSurfaceTracker::SurfaceRecord::SurfaceRecord(gfx::AcceleratedWidget widget, |
| 19 jobject j_surface) |
| 20 : widget(widget) { |
| 21 // TODO(liberato): It would be nice to assert |surface != nullptr|, but we |
| 22 // can't. in_process_context_factory.cc (for tests) actually calls us without |
| 23 // a Surface from java. Presumably, nobody uses it. crbug.com/712717 . |
| 24 if (j_surface != nullptr) |
| 25 surface = gl::ScopedJavaSurface::AcquireExternalSurface(j_surface); |
| 26 } |
| 27 #else // defined(OS_ANDROID) |
| 28 GpuSurfaceTracker::SurfaceRecord::SurfaceRecord(gfx::AcceleratedWidget widget) |
| 29 : widget(widget) {} |
| 30 #endif // !defined(OS_ANDROID) |
| 31 |
| 32 GpuSurfaceTracker::SurfaceRecord::SurfaceRecord(SurfaceRecord&&) = default; |
| 33 |
17 GpuSurfaceTracker::GpuSurfaceTracker() | 34 GpuSurfaceTracker::GpuSurfaceTracker() |
18 : next_surface_handle_(1) { | 35 : next_surface_handle_(1) { |
19 gpu::GpuSurfaceLookup::InitInstance(this); | 36 gpu::GpuSurfaceLookup::InitInstance(this); |
20 } | 37 } |
21 | 38 |
22 GpuSurfaceTracker::~GpuSurfaceTracker() { | 39 GpuSurfaceTracker::~GpuSurfaceTracker() { |
23 gpu::GpuSurfaceLookup::InitInstance(NULL); | 40 gpu::GpuSurfaceLookup::InitInstance(NULL); |
24 } | 41 } |
25 | 42 |
26 GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { | 43 GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { |
27 return base::Singleton<GpuSurfaceTracker>::get(); | 44 return base::Singleton<GpuSurfaceTracker>::get(); |
28 } | 45 } |
29 | 46 |
30 int GpuSurfaceTracker::AddSurfaceForNativeWidget( | 47 int GpuSurfaceTracker::AddSurfaceForNativeWidget(SurfaceRecord record) { |
31 gfx::AcceleratedWidget widget) { | |
32 base::AutoLock lock(surface_map_lock_); | 48 base::AutoLock lock(surface_map_lock_); |
33 gpu::SurfaceHandle surface_handle = next_surface_handle_++; | 49 gpu::SurfaceHandle surface_handle = next_surface_handle_++; |
34 surface_map_[surface_handle] = widget; | 50 surface_map_.emplace(surface_handle, std::move(record)); |
35 return surface_handle; | 51 return surface_handle; |
36 } | 52 } |
37 | 53 |
38 bool GpuSurfaceTracker::IsValidSurfaceHandle( | 54 bool GpuSurfaceTracker::IsValidSurfaceHandle( |
39 gpu::SurfaceHandle surface_handle) const { | 55 gpu::SurfaceHandle surface_handle) const { |
40 base::AutoLock lock(surface_map_lock_); | 56 base::AutoLock lock(surface_map_lock_); |
41 return surface_map_.find(surface_handle) != surface_map_.end(); | 57 return surface_map_.find(surface_handle) != surface_map_.end(); |
42 } | 58 } |
43 | 59 |
44 void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { | 60 void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { |
45 base::AutoLock lock(surface_map_lock_); | 61 base::AutoLock lock(surface_map_lock_); |
46 DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); | 62 DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); |
47 surface_map_.erase(surface_handle); | 63 surface_map_.erase(surface_handle); |
48 } | 64 } |
49 | 65 |
50 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( | 66 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( |
51 gpu::SurfaceHandle surface_handle) { | 67 gpu::SurfaceHandle surface_handle) { |
52 base::AutoLock lock(surface_map_lock_); | 68 base::AutoLock lock(surface_map_lock_); |
53 SurfaceMap::iterator it = surface_map_.find(surface_handle); | 69 SurfaceMap::iterator it = surface_map_.find(surface_handle); |
54 if (it == surface_map_.end()) | 70 if (it == surface_map_.end()) |
55 return gfx::kNullAcceleratedWidget; | 71 return gfx::kNullAcceleratedWidget; |
56 | 72 |
57 #if defined(OS_ANDROID) | 73 #if defined(OS_ANDROID) |
58 if (it->second != gfx::kNullAcceleratedWidget) | 74 if (it->second.widget != gfx::kNullAcceleratedWidget) |
59 ANativeWindow_acquire(it->second); | 75 ANativeWindow_acquire(it->second.widget); |
60 #endif // defined(OS_ANDROID) | 76 #endif // defined(OS_ANDROID) |
61 | 77 |
62 return it->second; | 78 return it->second.widget; |
63 } | 79 } |
64 | 80 |
65 #if defined(OS_ANDROID) | 81 #if defined(OS_ANDROID) |
66 void GpuSurfaceTracker::RegisterViewSurface( | 82 gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface( |
67 int surface_id, jobject j_surface) { | 83 gpu::SurfaceHandle surface_handle) { |
68 base::AutoLock lock(surface_view_map_lock_); | 84 base::AutoLock lock(surface_map_lock_); |
69 DCHECK(surface_view_map_.find(surface_id) == surface_view_map_.end()); | 85 SurfaceMap::const_iterator it = surface_map_.find(surface_handle); |
70 | 86 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(); | 87 return gl::ScopedJavaSurface(); |
88 | 88 |
89 const gl::ScopedJavaSurface& j_surface = iter->second; | 89 const gl::ScopedJavaSurface& j_surface = it->second.surface; |
90 DCHECK(j_surface.IsValid()); | 90 DCHECK(j_surface.IsValid()); |
91 return gl::ScopedJavaSurface::AcquireExternalSurface( | 91 return gl::ScopedJavaSurface::AcquireExternalSurface( |
92 j_surface.j_surface().obj()); | 92 j_surface.j_surface().obj()); |
93 } | 93 } |
94 #endif | 94 #endif |
95 | 95 |
96 std::size_t GpuSurfaceTracker::GetSurfaceCount() { | 96 std::size_t GpuSurfaceTracker::GetSurfaceCount() { |
97 base::AutoLock lock(surface_map_lock_); | 97 base::AutoLock lock(surface_map_lock_); |
98 return surface_map_.size(); | 98 return surface_map_.size(); |
99 } | 99 } |
100 | 100 |
101 } // namespace gpu | 101 } // namespace gpu |
OLD | NEW |