Chromium Code Reviews| Index: content/app/android/child_process_service_impl.cc |
| diff --git a/content/app/android/child_process_service_impl.cc b/content/app/android/child_process_service_impl.cc |
| index 465e41ceb64232db863208cf52cac84ca98e1bfe..66513172f0fd9a69a273362afbbf387e3767f3ff 100644 |
| --- a/content/app/android/child_process_service_impl.cc |
| +++ b/content/app/android/child_process_service_impl.cc |
| @@ -11,6 +11,7 @@ |
| #include "base/android/library_loader/library_loader_hooks.h" |
| #include "base/android/memory_pressure_listener_android.h" |
| #include "base/android/unguessable_token_android.h" |
| +#include "base/lazy_instance.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/posix/global_descriptors.h" |
| @@ -18,7 +19,6 @@ |
| #include "content/child/child_thread_impl.h" |
| #include "content/public/common/content_descriptors.h" |
| #include "gpu/ipc/common/android/scoped_surface_request_conduit.h" |
| -#include "gpu/ipc/common/android/surface_texture_manager.h" |
| #include "gpu/ipc/common/android/surface_texture_peer.h" |
| #include "gpu/ipc/common/gpu_surface_lookup.h" |
| #include "ipc/ipc_descriptors.h" |
| @@ -36,59 +36,17 @@ namespace { |
| // TODO(sievers): Use two different implementations of this depending on if |
| // we're in a renderer or gpu process. |
|
ncarter (slow)
2016/12/01 23:20:08
Is this TODO still relevant?
tguilbert
2016/12/02 00:01:52
I am not 100% sure. I will leave it as is for the
|
| -class SurfaceTextureManagerImpl : public gpu::SurfaceTextureManager, |
| - public gpu::SurfaceTexturePeer, |
| - public gpu::ScopedSurfaceRequestConduit, |
| - public gpu::GpuSurfaceLookup { |
| +class ChildProcessSurfaceManager : public gpu::SurfaceTexturePeer, |
| + public gpu::ScopedSurfaceRequestConduit, |
| + public gpu::GpuSurfaceLookup { |
| public: |
| + ChildProcessSurfaceManager() {} |
| + ~ChildProcessSurfaceManager() override {} |
| + |
| // |service impl| is the instance of |
| // org.chromium.content.app.ChildProcessServiceImpl. |
| - explicit SurfaceTextureManagerImpl( |
| - const base::android::JavaRef<jobject>& service_impl) |
| - : service_impl_(service_impl) { |
| - SurfaceTexturePeer::InitInstance(this); |
| - gpu::GpuSurfaceLookup::InitInstance(this); |
| - gpu::ScopedSurfaceRequestConduit::SetInstance(this); |
| - } |
| - ~SurfaceTextureManagerImpl() override { |
| - SurfaceTexturePeer::InitInstance(NULL); |
| - gpu::GpuSurfaceLookup::InitInstance(NULL); |
| - gpu::ScopedSurfaceRequestConduit::SetInstance(nullptr); |
| - } |
| - |
| - // Overridden from SurfaceTextureManager: |
| - void RegisterSurfaceTexture(int surface_texture_id, |
| - int client_id, |
| - gl::SurfaceTexture* surface_texture) override { |
| - JNIEnv* env = base::android::AttachCurrentThread(); |
| - Java_ChildProcessServiceImpl_createSurfaceTextureSurface( |
| - env, service_impl_, surface_texture_id, client_id, |
| - surface_texture->j_surface_texture()); |
| - } |
| - void UnregisterSurfaceTexture(int surface_texture_id, |
| - int client_id) override { |
| - JNIEnv* env = base::android::AttachCurrentThread(); |
| - Java_ChildProcessServiceImpl_destroySurfaceTextureSurface( |
| - env, service_impl_, surface_texture_id, client_id); |
| - } |
| - gfx::AcceleratedWidget AcquireNativeWidgetForSurfaceTexture( |
| - int surface_texture_id) override { |
| - JNIEnv* env = base::android::AttachCurrentThread(); |
| - gl::ScopedJavaSurface surface( |
| - Java_ChildProcessServiceImpl_getSurfaceTextureSurface( |
| - env, service_impl_, surface_texture_id)); |
| - |
| - if (surface.j_surface().is_null()) |
| - return NULL; |
| - |
| - // Note: This ensures that any local references used by |
| - // ANativeWindow_fromSurface are released immediately. This is needed as a |
| - // workaround for https://code.google.com/p/android/issues/detail?id=68174 |
| - base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); |
| - ANativeWindow* native_window = |
| - ANativeWindow_fromSurface(env, surface.j_surface().obj()); |
| - |
| - return native_window; |
| + void SetServiceImpl(const base::android::JavaRef<jobject>& service_impl) { |
| + service_impl_.Reset(service_impl); |
| } |
| // Overridden from SurfaceTexturePeer: |
| @@ -145,12 +103,16 @@ class SurfaceTextureManagerImpl : public gpu::SurfaceTextureManager, |
| } |
| private: |
| + friend struct base::DefaultLazyInstanceTraits<ChildProcessSurfaceManager>; |
| // The instance of org.chromium.content.app.ChildProcessServiceImpl. |
| base::android::ScopedJavaGlobalRef<jobject> service_impl_; |
| - DISALLOW_COPY_AND_ASSIGN(SurfaceTextureManagerImpl); |
| + DISALLOW_COPY_AND_ASSIGN(ChildProcessSurfaceManager); |
| }; |
| +static base::LazyInstance<ChildProcessSurfaceManager>::Leaky |
| + g_child_process_surface_manager = LAZY_INSTANCE_INITIALIZER; |
| + |
| // Chrome actually uses the renderer code path for all of its child |
| // processes such as renderers, plugins, etc. |
| void InternalInitChildProcessImpl(JNIEnv* env, |
| @@ -159,8 +121,15 @@ void InternalInitChildProcessImpl(JNIEnv* env, |
| jlong cpu_features) { |
| // Set the CPU properties. |
| android_setCpu(cpu_count, cpu_features); |
| - gpu::SurfaceTextureManager::SetInstance( |
| - new SurfaceTextureManagerImpl(service_impl)); |
| + |
| + g_child_process_surface_manager.Get().SetServiceImpl(service_impl); |
| + |
| + gpu::SurfaceTexturePeer::InitInstance( |
| + g_child_process_surface_manager.Pointer()); |
| + gpu::GpuSurfaceLookup::InitInstance( |
| + g_child_process_surface_manager.Pointer()); |
| + gpu::ScopedSurfaceRequestConduit::SetInstance( |
| + g_child_process_surface_manager.Pointer()); |
| base::android::MemoryPressureListenerAndroid::RegisterSystemCallback(env); |
| } |