Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2510)

Unified Diff: content/common/gpu/gpu_channel_manager.cc

Issue 213493002: content: Add multi-proc surface texture support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/gpu/gpu_channel_manager.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/gpu_channel_manager.cc
diff --git a/content/common/gpu/gpu_channel_manager.cc b/content/common/gpu/gpu_channel_manager.cc
index 86ea2bf7de6ef5e59797c192213f808698e3d957..8dd806a9b14f65b8a688cbcdd0f67c8618e570a1 100644
--- a/content/common/gpu/gpu_channel_manager.cc
+++ b/content/common/gpu/gpu_channel_manager.cc
@@ -18,8 +18,92 @@
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_share_group.h"
+#if defined(OS_ANDROID)
+#include "base/containers/scoped_ptr_hash_map.h"
+#include "base/lazy_instance.h"
+#include "ui/gl/android/scoped_java_surface.h"
+#include "ui/gl/android/surface_texture.h"
+#include "ui/gl/android/surface_texture_tracker.h"
+#endif
+
namespace content {
+#if defined(OS_ANDROID)
+namespace {
+
+class SurfaceTextureTrackerImpl : public gfx::SurfaceTextureTracker {
+ public:
+ SurfaceTextureTrackerImpl() {
+ 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, static_cast<base::ProcessHandle>(secondary_id)));
+ return info ? info->surface_texture : NULL;
+ }
+
+ void AddSurfaceTexture(gfx::SurfaceTexture* surface_texture,
+ int surface_texture_id,
+ base::ProcessHandle process_handle) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ base::AutoLock lock(surface_textures_lock_);
+ SurfaceTextureMapKey key(surface_texture_id, process_handle);
+ DCHECK(surface_textures_.find(key) == surface_textures_.end());
+ surface_textures_.set(
+ key, make_scoped_ptr(new SurfaceTextureInfo(surface_texture)));
+ }
+
+ void RemoveAllSurfaceTextures(base::ProcessHandle process_handle) {
+ 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 == process_handle)
+ surface_textures_.erase(it++);
+ else
+ ++it;
+ }
+ }
+
+ jobject GetSurface(int surface_texture_id,
+ base::ProcessHandle process_handle) const {
+ base::AutoLock lock(surface_textures_lock_);
+ SurfaceTextureMap::const_iterator it = surface_textures_.find(
+ SurfaceTextureMapKey(surface_texture_id, process_handle));
+ 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, base::ProcessHandle> SurfaceTextureMapKey;
+ typedef base::ScopedPtrHashMap<SurfaceTextureMapKey, SurfaceTextureInfo>
+ SurfaceTextureMap;
+ SurfaceTextureMap surface_textures_;
+ mutable base::Lock surface_textures_lock_;
+ base::ThreadChecker thread_checker_;
+};
+base::LazyInstance<SurfaceTextureTrackerImpl> g_surface_texture_tracker =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+#endif // OS_ANDROID
+
GpuChannelManager::ImageOperation::ImageOperation(
int32 sync_point, base::Closure callback)
: sync_point(sync_point),
@@ -45,6 +129,9 @@ GpuChannelManager::GpuChannelManager(MessageRouter* router,
DCHECK(router_);
DCHECK(io_message_loop);
DCHECK(shutdown_event);
+ // SurfaceTextureTracker instance must be set before we establish a channel
+ // that could be using it to initialize GLImage instances.
+ gfx::SurfaceTextureTracker::InitInstance(g_surface_texture_tracker.Pointer());
}
GpuChannelManager::~GpuChannelManager() {
@@ -104,6 +191,7 @@ bool GpuChannelManager::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(GpuMsg_CreateImage, OnCreateImage)
IPC_MESSAGE_HANDLER(GpuMsg_DeleteImage, OnDeleteImage)
IPC_MESSAGE_HANDLER(GpuMsg_LoadedShader, OnLoadedShader)
+ IPC_MESSAGE_HANDLER(GpuMsg_CreateSurfaceTexture, OnCreateSurfaceTexture)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP_EX()
return handled;
@@ -264,6 +352,20 @@ bool GpuChannelManager::HandleMessagesScheduled() {
return false;
}
+void GpuChannelManager::OnCreateSurfaceTexture(
+ int32 surface_texture_id, int32 process_handle) {
+ DCHECK(surface_texture_id);
+#if defined(OS_ANDROID)
+ const int kDummyTextureId = 0;
+ scoped_refptr<gfx::SurfaceTexture> surface_texture =
+ gfx::SurfaceTexture::Create(kDummyTextureId);
+ g_surface_texture_tracker.Pointer()->AddSurfaceTexture(
+ surface_texture.get(),
+ surface_texture_id,
+ static_cast<base::ProcessHandle>(process_handle));
+#endif // OS_ANDROID
+}
+
uint64 GpuChannelManager::MessagesProcessed() {
uint64 messages_processed = 0;
« no previous file with comments | « content/common/gpu/gpu_channel_manager.h ('k') | content/common/gpu/gpu_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698