image_transport_factory_android.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/image_transport_factory_android.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/singleton.h"
8a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_process_launch_causes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gl_helper.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportFactoryAndroid* ImageTransportFactoryAndroid::GetInstance() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<ImageTransportFactoryAndroid>::get();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageTransportFactoryAndroid::ImageTransportFactoryAndroid() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGraphicsContext3D::Attributes attrs;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrs.shareResources = true;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("chrome://gpu/ImageTransportFactoryAndroid");
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<WebGraphicsContext3DSwapBuffersClient> swap_client;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_.reset(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebGraphicsContext3DCommandBufferImpl(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0, // offscreen
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          factory,
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          swap_client));
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context_->Initialize(
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      attrs,
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      false,
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochImageTransportFactoryAndroid::~ImageTransportFactoryAndroid() {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)gfx::GLSurfaceHandle ImageTransportFactoryAndroid::CreateSharedSurfaceHandle() {
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    NOTREACHED() << "Failed to make shared graphics context current";
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return gfx::GLSurfaceHandle();
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle(
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gfx::kNullPluginWindow, true);
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  handle.parent_gpu_process_id = context_->GetGPUProcessID();
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  handle.parent_client_id = context_->GetChannelID();
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  handle.parent_context_id = context_->GetContextID();
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  handle.parent_texture_id[0] = context_->createTexture();
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  handle.parent_texture_id[1] = context_->createTexture();
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  handle.sync_point = context_->insertSyncPoint();
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context_->flush();
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return handle;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ImageTransportFactoryAndroid::DestroySharedSurfaceHandle(
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::GLSurfaceHandle& handle) {
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!context_->makeContextCurrent()) {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED() << "Failed to make shared graphics context current";
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  context_->deleteTexture(handle.parent_texture_id[0]);
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  context_->deleteTexture(handle.parent_texture_id[1]);
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  context_->finish();
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint32_t ImageTransportFactoryAndroid::InsertSyncPoint() {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return context_->insertSyncPoint();
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWebKit::WebGraphicsContext3D* ImageTransportFactoryAndroid::GetContext3D() {
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return context_.get();
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLHelper* ImageTransportFactoryAndroid::GetGLHelper() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!gl_helper_.get())
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_helper_.reset(new GLHelper(GetContext3D(), NULL));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return gl_helper_.get();
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace content
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)