| 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.
|
| -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);
|
| }
|
|
|