| 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 |