Chromium Code Reviews| 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::Record::Record(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. | |
|
dcheng
2017/04/14 00:55:24
Does this mean that it can be fixed in a followup?
liberato (no reviews please)
2017/04/18 20:47:38
crbug.com/712717 . added comment to reference it.
| |
| 24 if (j_surface != nullptr) | |
| 25 surface = gl::ScopedJavaSurface::AcquireExternalSurface(j_surface); | |
| 26 } | |
| 27 #else // !defined(OS_ANDROID) | |
| 28 GpuSurfaceTracker::Record::Record(gfx::AcceleratedWidget widget) | |
| 29 : widget(widget) {} | |
| 30 #endif // !defined(OS_ANDROID) | |
| 31 | |
| 32 GpuSurfaceTracker::Record::Record(Record&&) = 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(Record 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_.insert( |
| 51 SurfaceMap::value_type(surface_handle, std::move(record))); | |
|
dcheng
2017/04/14 00:55:24
surface_map.emplace(surface_handle, std::move(reco
liberato (no reviews please)
2017/04/18 20:47:38
Done.
| |
| 35 return surface_handle; | 52 return surface_handle; |
| 36 } | 53 } |
| 37 | 54 |
| 38 bool GpuSurfaceTracker::IsValidSurfaceHandle( | 55 bool GpuSurfaceTracker::IsValidSurfaceHandle( |
| 39 gpu::SurfaceHandle surface_handle) const { | 56 gpu::SurfaceHandle surface_handle) const { |
| 40 base::AutoLock lock(surface_map_lock_); | 57 base::AutoLock lock(surface_map_lock_); |
| 41 return surface_map_.find(surface_handle) != surface_map_.end(); | 58 return surface_map_.find(surface_handle) != surface_map_.end(); |
| 42 } | 59 } |
| 43 | 60 |
| 44 void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { | 61 void GpuSurfaceTracker::RemoveSurface(gpu::SurfaceHandle surface_handle) { |
| 45 base::AutoLock lock(surface_map_lock_); | 62 base::AutoLock lock(surface_map_lock_); |
| 46 DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); | 63 DCHECK(surface_map_.find(surface_handle) != surface_map_.end()); |
| 47 surface_map_.erase(surface_handle); | 64 surface_map_.erase(surface_handle); |
| 48 } | 65 } |
| 49 | 66 |
| 50 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( | 67 gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( |
| 51 gpu::SurfaceHandle surface_handle) { | 68 gpu::SurfaceHandle surface_handle) { |
| 52 base::AutoLock lock(surface_map_lock_); | 69 base::AutoLock lock(surface_map_lock_); |
| 53 SurfaceMap::iterator it = surface_map_.find(surface_handle); | 70 SurfaceMap::iterator it = surface_map_.find(surface_handle); |
| 54 if (it == surface_map_.end()) | 71 if (it == surface_map_.end()) |
| 55 return gfx::kNullAcceleratedWidget; | 72 return gfx::kNullAcceleratedWidget; |
| 56 | 73 |
| 57 #if defined(OS_ANDROID) | 74 #if defined(OS_ANDROID) |
| 58 if (it->second != gfx::kNullAcceleratedWidget) | 75 if (it->second.widget != gfx::kNullAcceleratedWidget) |
| 59 ANativeWindow_acquire(it->second); | 76 ANativeWindow_acquire(it->second.widget); |
| 60 #endif // defined(OS_ANDROID) | 77 #endif // defined(OS_ANDROID) |
| 61 | 78 |
| 62 return it->second; | 79 return it->second.widget; |
| 63 } | 80 } |
| 64 | 81 |
| 65 #if defined(OS_ANDROID) | 82 #if defined(OS_ANDROID) |
| 66 void GpuSurfaceTracker::RegisterViewSurface( | 83 gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface( |
| 67 int surface_id, jobject j_surface) { | 84 gpu::SurfaceHandle surface_handle) { |
| 68 base::AutoLock lock(surface_view_map_lock_); | 85 base::AutoLock lock(surface_map_lock_); |
| 69 DCHECK(surface_view_map_.find(surface_id) == surface_view_map_.end()); | 86 SurfaceMap::const_iterator it = surface_map_.find(surface_handle); |
| 70 | 87 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(); | 88 return gl::ScopedJavaSurface(); |
| 88 | 89 |
| 89 const gl::ScopedJavaSurface& j_surface = iter->second; | 90 const gl::ScopedJavaSurface& j_surface = it->second.surface; |
| 90 DCHECK(j_surface.IsValid()); | 91 DCHECK(j_surface.IsValid()); |
| 91 return gl::ScopedJavaSurface::AcquireExternalSurface( | 92 return gl::ScopedJavaSurface::AcquireExternalSurface( |
| 92 j_surface.j_surface().obj()); | 93 j_surface.j_surface().obj()); |
| 93 } | 94 } |
| 94 #endif | 95 #endif |
| 95 | 96 |
| 96 std::size_t GpuSurfaceTracker::GetSurfaceCount() { | 97 std::size_t GpuSurfaceTracker::GetSurfaceCount() { |
| 97 base::AutoLock lock(surface_map_lock_); | 98 base::AutoLock lock(surface_map_lock_); |
| 98 return surface_map_.size(); | 99 return surface_map_.size(); |
| 99 } | 100 } |
| 100 | 101 |
| 101 } // namespace gpu | 102 } // namespace gpu |
| OLD | NEW |