image_transport_factory_android.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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)
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/lazy_instance.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/browser_gpu_channel_host_factory.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/compositor_impl_android.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gl_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/gpu/gpu_process_launch_causes.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/android/device_display_info.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::LazyInstance<ObserverList<ImageTransportFactoryAndroidObserver> >::Leaky
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    g_factory_observers = LAZY_INSTANCE_INITIALIZER;
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass GLContextLostListener
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // WebGraphicsContextLostCallback implementation.
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void onContextLost() OVERRIDE;
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void DidLoseContext();
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static ImageTransportFactoryAndroid* g_factory = NULL;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DirectGLImageTransportFactory : public ImageTransportFactoryAndroid {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DirectGLImageTransportFactory();
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DirectGLImageTransportFactory();
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t InsertSyncPoint() OVERRIDE { return 0; }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WaitSyncPoint(uint32_t sync_point) OVERRIDE {}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t CreateTexture() OVERRIDE {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_->createTexture();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeleteTexture(uint32_t id) OVERRIDE {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context_->deleteTexture(id);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcquireTexture(
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32 texture_id, const signed char* mailbox_name) OVERRIDE {}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGraphicsContext3D* GetContext3D() OVERRIDE {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_.get();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GLHelper* GetGLHelper() OVERRIDE { return NULL; }
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<WebKit::WebGraphicsContext3D> context_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DirectGLImageTransportFactory);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectGLImageTransportFactory::DirectGLImageTransportFactory() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebGraphicsContext3D::Attributes attrs;
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  attrs.shareResources = true;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  attrs.noAutomaticFlushes = true;
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context_ = webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl::
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateViewContext(attrs, NULL);
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  context_->setContextLostCallback(context_lost_listener_.get());
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (context_->makeContextCurrent())
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    context_->pushGroupMarkerEXT(
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::StringPrintf("DirectGLImageTransportFactory-%p",
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           context_.get()).c_str());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectGLImageTransportFactory::~DirectGLImageTransportFactory() {
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  context_->setContextLostCallback(NULL);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CmdBufferImageTransportFactory : public ImageTransportFactoryAndroid {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CmdBufferImageTransportFactory();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CmdBufferImageTransportFactory();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t InsertSyncPoint() OVERRIDE;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WaitSyncPoint(uint32_t sync_point) OVERRIDE;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual uint32_t CreateTexture() OVERRIDE;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeleteTexture(uint32_t id) OVERRIDE;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcquireTexture(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      uint32 texture_id, const signed char* mailbox_name) OVERRIDE;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebKit::WebGraphicsContext3D* GetContext3D() OVERRIDE {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return context_.get();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GLHelper* GetGLHelper() OVERRIDE;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<GLHelper> gl_helper_;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CmdBufferImageTransportFactory);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CmdBufferImageTransportFactory::CmdBufferImageTransportFactory() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebGraphicsContext3D::Attributes attrs;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrs.shareResources = true;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHostFactory* factory = BrowserGpuChannelHostFactory::instance();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("chrome://gpu/ImageTransportFactoryAndroid");
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<WebGraphicsContext3DSwapBuffersClient> swap_client;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_.reset(new WebGraphicsContext3DCommandBufferImpl(0, // offscreen
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           url,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           factory,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           swap_client));
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static const size_t kBytesPerPixel = 4;
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::DeviceDisplayInfo display_info;
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t full_screen_texture_size_in_bytes =
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_info.GetDisplayHeight() *
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      display_info.GetDisplayWidth() *
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kBytesPerPixel;
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  context_->setContextLostCallback(context_lost_listener_.get());
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context_->Initialize(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attrs,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      64 * 1024,  // command buffer size
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::min(full_screen_texture_size_in_bytes,
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               kDefaultStartTransferBufferSize),
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kDefaultMinTransferBufferSize,
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::min(3 * full_screen_texture_size_in_bytes,
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               kDefaultMaxTransferBufferSize));
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (context_->makeContextCurrent())
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    context_->pushGroupMarkerEXT(
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::StringPrintf("CmdBufferImageTransportFactory-%p",
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           context_.get()).c_str());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CmdBufferImageTransportFactory::~CmdBufferImageTransportFactory() {
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  context_->setContextLostCallback(NULL);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t CmdBufferImageTransportFactory::InsertSyncPoint() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context_->makeContextCurrent()) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_->insertSyncPoint();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::WaitSyncPoint(uint32_t sync_point) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context_->makeContextCurrent()) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->waitSyncPoint(sync_point);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32_t CmdBufferImageTransportFactory::CreateTexture() {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context_->createTexture();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::DeleteTexture(uint32_t id) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->deleteTexture(id);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CmdBufferImageTransportFactory::AcquireTexture(
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 texture_id, const signed char* mailbox_name) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context_->makeContextCurrent()) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Failed to make helper context current.";
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->bindTexture(GL_TEXTURE_2D, texture_id);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox_name);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context_->flush();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLHelper* CmdBufferImageTransportFactory::GetGLHelper() {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!gl_helper_)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gl_helper_.reset(new GLHelper(context_.get()));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gl_helper_.get();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // anonymous namespace
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ImageTransportFactoryAndroid* ImageTransportFactoryAndroid::GetInstance() {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!g_factory) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (CompositorImpl::UsesDirectGL())
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      g_factory = new DirectGLImageTransportFactory();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      g_factory = new CmdBufferImageTransportFactory();
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return g_factory;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochImageTransportFactoryAndroid::ImageTransportFactoryAndroid()
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : context_lost_listener_(new GLContextLostListener()) {}
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochImageTransportFactoryAndroid::~ImageTransportFactoryAndroid() {}
2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ImageTransportFactoryAndroid::AddObserver(
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ImageTransportFactoryAndroidObserver* observer) {
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  g_factory_observers.Get().AddObserver(observer);
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ImageTransportFactoryAndroid::RemoveObserver(
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ImageTransportFactoryAndroidObserver* observer) {
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  g_factory_observers.Get().RemoveObserver(observer);
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid GLContextLostListener::onContextLost() {
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Need to post a task because the command buffer client cannot be deleted
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // from within this callback.
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  LOG(ERROR) << "Context lost.";
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::MessageLoop::current()->PostTask(
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FROM_HERE,
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&GLContextLostListener::DidLoseContext));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid GLContextLostListener::DidLoseContext() {
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  delete g_factory;
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  g_factory = NULL;
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FOR_EACH_OBSERVER(ImageTransportFactoryAndroidObserver,
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      g_factory_observers.Get(),
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      OnLostResources());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content
241