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