| Index: content/browser/renderer_host/compositor_impl_android.cc
|
| diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
|
| index 5f80889ca63ed2cccf7c68792bd6536b172fff3e..b6209214eb3e7d56f5cba9d993b2c203331f71d9 100644
|
| --- a/content/browser/renderer_host/compositor_impl_android.cc
|
| +++ b/content/browser/renderer_host/compositor_impl_android.cc
|
| @@ -12,11 +12,13 @@
|
| #include "base/android/scoped_java_ref.h"
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| +#include "base/containers/scoped_ptr_hash_map.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/synchronization/lock.h"
|
| #include "base/threading/thread.h"
|
| +#include "base/threading/thread_checker.h"
|
| #include "cc/base/switches.h"
|
| #include "cc/input/input_handler.h"
|
| #include "cc/layers/layer.h"
|
| @@ -43,6 +45,9 @@
|
| #include "ui/gfx/android/device_display_info.h"
|
| #include "ui/gfx/android/java_bitmap.h"
|
| #include "ui/gfx/frame_time.h"
|
| +#include "ui/gl/android/scoped_java_surface.h"
|
| +#include "ui/gl/android/surface_texture.h"
|
| +#include "ui/gl/android/surface_texture_tracker.h"
|
| #include "webkit/common/gpu/context_provider_in_process.h"
|
| #include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
|
|
|
| @@ -131,6 +136,78 @@ class TransientUIResource : public cc::ScopedUIResource {
|
| bool retrieved_;
|
| };
|
|
|
| +class SurfaceTextureTrackerImpl : public gfx::SurfaceTextureTracker {
|
| + public:
|
| + SurfaceTextureTrackerImpl() : next_primary_id_(1) {
|
| + thread_checker_.DetachFromThread();
|
| + }
|
| +
|
| + // Overridden from gfx::SurfaceTextureTracker:
|
| + virtual scoped_refptr<gfx::SurfaceTexture> AcquireSurfaceTexture(
|
| + int primary_id,
|
| + int secondary_id) OVERRIDE {
|
| + base::AutoLock lock(surface_textures_lock_);
|
| + scoped_ptr<SurfaceTextureInfo> info = surface_textures_.take_and_erase(
|
| + SurfaceTextureMapKey(primary_id, secondary_id));
|
| + return info ? info->surface_texture : NULL;
|
| + }
|
| +
|
| + int AddSurfaceTexture(gfx::SurfaceTexture* surface_texture,
|
| + int secondary_id) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + int primary_id = next_primary_id_++;
|
| + if (next_primary_id_ == INT_MAX)
|
| + next_primary_id_ = 1;
|
| +
|
| + base::AutoLock lock(surface_textures_lock_);
|
| + SurfaceTextureMapKey key(primary_id, secondary_id);
|
| + DCHECK(surface_textures_.find(key) == surface_textures_.end());
|
| + surface_textures_.set(
|
| + key, make_scoped_ptr(new SurfaceTextureInfo(surface_texture)));
|
| + return primary_id;
|
| + }
|
| +
|
| + void RemoveAllSurfaceTextures(int secondary_id) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + base::AutoLock lock(surface_textures_lock_);
|
| + SurfaceTextureMap::iterator it = surface_textures_.begin();
|
| + while (it != surface_textures_.end()) {
|
| + if (it->first.second == secondary_id)
|
| + surface_textures_.erase(it++);
|
| + else
|
| + ++it;
|
| + }
|
| + }
|
| +
|
| + jobject GetSurface(int primary_id, int secondary_id) const {
|
| + base::AutoLock lock(surface_textures_lock_);
|
| + SurfaceTextureMap::const_iterator it =
|
| + surface_textures_.find(SurfaceTextureMapKey(primary_id, secondary_id));
|
| + return it == surface_textures_.end()
|
| + ? NULL
|
| + : it->second->surface.j_surface().obj();
|
| + }
|
| +
|
| + private:
|
| + struct SurfaceTextureInfo {
|
| + explicit SurfaceTextureInfo(gfx::SurfaceTexture* surface_texture)
|
| + : surface_texture(surface_texture), surface(surface_texture) {}
|
| +
|
| + scoped_refptr<gfx::SurfaceTexture> surface_texture;
|
| + gfx::ScopedJavaSurface surface;
|
| + };
|
| +
|
| + typedef std::pair<int, int> SurfaceTextureMapKey;
|
| + typedef base::ScopedPtrHashMap<SurfaceTextureMapKey, SurfaceTextureInfo>
|
| + SurfaceTextureMap;
|
| + SurfaceTextureMap surface_textures_;
|
| + mutable base::Lock surface_textures_lock_;
|
| + int next_primary_id_;
|
| + base::ThreadChecker thread_checker_;
|
| +};
|
| +base::LazyInstance<SurfaceTextureTrackerImpl> g_surface_texture_tracker =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| +
|
| static bool g_initialized = false;
|
|
|
| } // anonymous namespace
|
| @@ -152,6 +229,9 @@ Compositor* Compositor::Create(CompositorClient* client,
|
| // static
|
| void Compositor::Initialize() {
|
| DCHECK(!CompositorImpl::IsInitialized());
|
| + // SurfaceTextureTracker instance must be set before we create a GPU thread
|
| + // that could be using it to initialize GLImage instances.
|
| + gfx::SurfaceTextureTracker::InitInstance(g_surface_texture_tracker.Pointer());
|
| g_initialized = true;
|
| }
|
|
|
| @@ -171,6 +251,31 @@ jobject CompositorImpl::GetSurface(int surface_id) {
|
| return jsurface;
|
| }
|
|
|
| +// static
|
| +jobject CompositorImpl::GetSurfaceTextureSurface(int primary_id,
|
| + int secondary_id) {
|
| + jobject jsurface =
|
| + g_surface_texture_tracker.Pointer()->GetSurface(primary_id, secondary_id);
|
| +
|
| + LOG_IF(WARNING, !jsurface) << "No surface for surface texture id "
|
| + << primary_id << ", " << secondary_id;
|
| + return jsurface;
|
| +}
|
| +
|
| +// static
|
| +int CompositorImpl::AllocateSurfaceTexture(int secondary_id) {
|
| + const int kDummyTextureId = 0;
|
| + scoped_refptr<gfx::SurfaceTexture> surface_texture =
|
| + gfx::SurfaceTexture::Create(kDummyTextureId);
|
| + return g_surface_texture_tracker.Pointer()->AddSurfaceTexture(
|
| + surface_texture.get(), secondary_id);
|
| +}
|
| +
|
| +// static
|
| +void CompositorImpl::DestroyAllSurfaceTextures(int secondary_id) {
|
| + g_surface_texture_tracker.Pointer()->RemoveAllSurfaceTextures(secondary_id);
|
| +}
|
| +
|
| CompositorImpl::CompositorImpl(CompositorClient* client,
|
| gfx::NativeWindow root_window)
|
| : root_layer_(cc::Layer::Create()),
|
|
|