13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "gpu/command_buffer/service/stream_texture_manager_in_process_android.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/bind.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/service/texture_manager.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gfx/size.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/gl/android/surface_texture.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gl/gl_bindings.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gl/gl_image.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace gpu {
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Simply wraps a SurfaceTexture reference as a GLImage.
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GLImageImpl : public gfx::GLImage {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLImageImpl(const scoped_refptr<gfx::SurfaceTexture>& surface_texture,
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              const base::Closure& release_callback);
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // implement gfx::GLImage
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void Destroy(bool have_context) OVERRIDE;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual gfx::Size GetSize() OVERRIDE;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool BindTexImage(unsigned target) OVERRIDE;
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void ReleaseTexImage(unsigned target) OVERRIDE;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool CopyTexImage(unsigned target) OVERRIDE;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void WillUseTexImage() OVERRIDE;
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidUseTexImage() OVERRIDE {}
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void WillModifyTexImage() OVERRIDE {}
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DidModifyTexImage() OVERRIDE {}
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    int z_order,
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    gfx::OverlayTransform transform,
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const gfx::Rect& bounds_rect,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const gfx::RectF& crop_rect) OVERRIDE;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~GLImageImpl();
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<gfx::SurfaceTexture> surface_texture_;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Closure release_callback_;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLImageImpl);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLImageImpl::GLImageImpl(
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<gfx::SurfaceTexture>& surface_texture,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Closure& release_callback)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : surface_texture_(surface_texture), release_callback_(release_callback) {}
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLImageImpl::~GLImageImpl() {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  release_callback_.Run();
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void GLImageImpl::Destroy(bool have_context) {
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NOTREACHED();
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::Size GLImageImpl::GetSize() {
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return gfx::Size();
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool GLImageImpl::BindTexImage(unsigned target) {
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED();
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLImageImpl::ReleaseTexImage(unsigned target) {
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED();
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool GLImageImpl::CopyTexImage(unsigned target) {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return false;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void GLImageImpl::WillUseTexImage() {
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  surface_texture_->UpdateTexImage();
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool GLImageImpl::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       int z_order,
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       gfx::OverlayTransform transform,
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       const gfx::Rect& bounds_rect,
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       const gfx::RectF& crop_rect) {
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // anonymous namespace
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)StreamTextureManagerInProcess::StreamTextureManagerInProcess()
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : next_id_(1), weak_factory_(this) {}
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)StreamTextureManagerInProcess::~StreamTextureManagerInProcess() {
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!textures_.empty()) {
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    LOG(WARNING) << "Undestroyed surface textures while tearing down "
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    "StreamTextureManager.";
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GLuint StreamTextureManagerInProcess::CreateStreamTexture(
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint32 client_texture_id,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gles2::TextureManager* texture_manager) {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CalledOnValidThread();
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gles2::TextureRef* texture = texture_manager->GetTexture(client_texture_id);
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!texture || (texture->texture()->target() &&
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   texture->texture()->target() != GL_TEXTURE_EXTERNAL_OES)) {
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return 0;
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<gfx::SurfaceTexture> surface_texture(
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gfx::SurfaceTexture::Create(texture->service_id()));
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  uint32 stream_id = next_id_++;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Closure release_callback =
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&StreamTextureManagerInProcess::OnReleaseStreamTexture,
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_factory_.GetWeakPtr(), stream_id);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<gfx::GLImage> gl_image(new GLImageImpl(surface_texture,
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       release_callback));
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size size = gl_image->GetSize();
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager->SetTarget(texture, GL_TEXTURE_EXTERNAL_OES);
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager->SetLevelInfo(texture,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GL_TEXTURE_EXTERNAL_OES,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                0,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GL_RGBA,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                size.width(),
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                size.height(),
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                1,
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                0,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GL_RGBA,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GL_UNSIGNED_BYTE,
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                true);
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager->SetLevelImage(texture, GL_TEXTURE_EXTERNAL_OES, 0, gl_image);
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::AutoLock lock(map_lock_);
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    textures_[stream_id] = surface_texture;
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (next_id_ == 0)
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    next_id_++;
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return stream_id;
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void StreamTextureManagerInProcess::OnReleaseStreamTexture(uint32 stream_id) {
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CalledOnValidThread();
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::AutoLock lock(map_lock_);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  textures_.erase(stream_id);
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This can get called from any thread.
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)scoped_refptr<gfx::SurfaceTexture>
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)StreamTextureManagerInProcess::GetSurfaceTexture(uint32 stream_id) {
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::AutoLock lock(map_lock_);
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TextureMap::const_iterator it = textures_.find(stream_id);
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (it != textures_.end())
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return it->second;
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return NULL;
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace gpu
171