gl_in_process_context.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/client/gl_in_process_context.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 728390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch#include <set> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <utility> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <GLES2/gl2.h> 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef GL_GLEXT_PROTOTYPES 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define GL_GLEXT_PROTOTYPES 1 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <GLES2/gl2ext.h> 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <GLES2/gl2extchromium.h> 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind_helpers.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/lazy_instance.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/weak_ptr.h" 249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/client/gles2_implementation.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/client/transfer_buffer.h" 2728390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch#include "gpu/command_buffer/common/command_buffer.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/common/constants.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/size.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gl/gl_image.h" 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ui/gl/android/surface_texture.h" 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace gpu { 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int32 kCommandBufferSize = 1024 * 1024; 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// TODO(kbr): make the transfer buffer size configurable via context 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// creation attributes. 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst size_t kStartTransferBufferSize = 4 * 1024 * 1024; 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst size_t kMinTransferBufferSize = 1 * 256 * 1024; 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst size_t kMaxTransferBufferSize = 16 * 1024 * 1024; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass GLInProcessContextImpl 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public GLInProcessContext, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public base::SupportsWeakPtr<GLInProcessContextImpl> { 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 5128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch explicit GLInProcessContextImpl(); 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~GLInProcessContextImpl(); 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool Initialize( 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<gfx::GLSurface> surface, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_offscreen, 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool use_global_share_group, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLInProcessContext* share_context, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::AcceleratedWidget window, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& size, 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GLInProcessContextAttribs& attribs, 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::GpuPreference gpu_preference, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<InProcessCommandBuffer::Service>& service); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GLInProcessContext implementation: 66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual gles2::GLES2Implementation* GetImplementation() OVERRIDE; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture( 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) uint32 stream_id) OVERRIDE; 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Destroy(); 76bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void OnContextLost(); 7728390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch void OnSignalSyncPoint(const base::Closure& callback); 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<gles2::GLES2CmdHelper> gles2_helper_; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<TransferBuffer> transfer_buffer_; 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<gles2::GLES2Implementation> gles2_implementation_; 8228390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_ptr<InProcessCommandBuffer> command_buffer_; 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8428390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch bool context_lost_; 85bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Closure context_lost_callback_; 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(GLInProcessContextImpl); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdochbase::LazyInstance<base::Lock> g_all_shared_contexts_lock = 9128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch LAZY_INSTANCE_INITIALIZER; 9228390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdochbase::LazyInstance<std::set<GLInProcessContextImpl*> > g_all_shared_contexts = 9328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch LAZY_INSTANCE_INITIALIZER; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben MurdochGLInProcessContextImpl::GLInProcessContextImpl() 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : context_lost_(false) {} 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGLInProcessContextImpl::~GLInProcessContextImpl() { 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch { 10028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch base::AutoLock lock(g_all_shared_contexts_lock.Get()); 10128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch g_all_shared_contexts.Get().erase(this); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 10328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch Destroy(); 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochgles2::GLES2Implementation* GLInProcessContextImpl::GetImplementation() { 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return gles2_implementation_.get(); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid GLInProcessContextImpl::SetContextLostCallback( 111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const base::Closure& callback) { 112bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch context_lost_callback_ = callback; 113bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 114bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 115bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid GLInProcessContextImpl::OnContextLost() { 11628390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch context_lost_ = true; 117bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!context_lost_callback_.is_null()) { 118bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch context_lost_callback_.Run(); 119bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 12028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch} 12128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool GLInProcessContextImpl::Initialize( 123bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<gfx::GLSurface> surface, 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_offscreen, 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool use_global_share_group, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLInProcessContext* share_context, 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::AcceleratedWidget window, 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Size& size, 129bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GLInProcessContextAttribs& attribs, 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::GpuPreference gpu_preference, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<InProcessCommandBuffer::Service>& service) { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!use_global_share_group || !share_context); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(size.width() >= 0 && size.height() >= 0); 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Changes to these values should also be copied to 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // gpu/command_buffer/client/gl_in_process_context.cc and to 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h 138bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 ALPHA_SIZE = 0x3021; 139bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 BLUE_SIZE = 0x3022; 140bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 GREEN_SIZE = 0x3023; 141bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 RED_SIZE = 0x3024; 142bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 DEPTH_SIZE = 0x3025; 143bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 STENCIL_SIZE = 0x3026; 144bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 SAMPLES = 0x3031; 145bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 SAMPLE_BUFFERS = 0x3032; 146bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int32 NONE = 0x3038; 147bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Chromium-specific attributes 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int32 FAIL_IF_MAJOR_PERF_CAVEAT = 0x10002; 150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const int32 LOSE_CONTEXT_WHEN_OUT_OF_MEMORY = 0x10003; 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::vector<int32> attrib_vector; 153bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.alpha_size >= 0) { 154bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(ALPHA_SIZE); 155bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.alpha_size); 156bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 157bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.blue_size >= 0) { 158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(BLUE_SIZE); 159bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.blue_size); 160bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 161bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.green_size >= 0) { 162bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(GREEN_SIZE); 163bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.green_size); 164bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 165bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.red_size >= 0) { 166bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(RED_SIZE); 167bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.red_size); 168bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 169bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.depth_size >= 0) { 170bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(DEPTH_SIZE); 171bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.depth_size); 172bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 173bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.stencil_size >= 0) { 174bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(STENCIL_SIZE); 175bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.stencil_size); 176bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 177bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.samples >= 0) { 178bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(SAMPLES); 179bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.samples); 180bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 181bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.sample_buffers >= 0) { 182bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(SAMPLE_BUFFERS); 183bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.sample_buffers); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (attribs.fail_if_major_perf_caveat > 0) { 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) attrib_vector.push_back(FAIL_IF_MAJOR_PERF_CAVEAT); 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) attrib_vector.push_back(attribs.fail_if_major_perf_caveat); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (attribs.lose_context_when_out_of_memory > 0) { 190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrib_vector.push_back(LOSE_CONTEXT_WHEN_OUT_OF_MEMORY); 191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrib_vector.push_back(attribs.lose_context_when_out_of_memory); 192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 193bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(NONE); 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch base::Closure wrapped_callback = 196bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) command_buffer_.reset(new InProcessCommandBuffer(service)); 19828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch 19928390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_ptr<base::AutoLock> scoped_shared_context_lock; 20028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_refptr<gles2::ShareGroup> share_group; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InProcessCommandBuffer* share_command_buffer = NULL; 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (use_global_share_group) { 20328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_shared_context_lock.reset( 20428390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch new base::AutoLock(g_all_shared_contexts_lock.Get())); 20528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch for (std::set<GLInProcessContextImpl*>::const_iterator it = 20628390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch g_all_shared_contexts.Get().begin(); 20728390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch it != g_all_shared_contexts.Get().end(); 20828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch it++) { 20928390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch const GLInProcessContextImpl* context = *it; 21028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch if (!context->context_lost_) { 21128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch share_group = context->gles2_implementation_->share_group(); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) share_command_buffer = context->command_buffer_.get(); 21328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch DCHECK(share_group); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(share_command_buffer); 21528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch break; 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (share_context) { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLInProcessContextImpl* impl = 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<GLInProcessContextImpl*>(share_context); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) share_group = impl->gles2_implementation_->share_group(); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) share_command_buffer = impl->command_buffer_.get(); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(share_group); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(share_command_buffer); 22528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch } 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 227bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!command_buffer_->Initialize(surface, 228bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch is_offscreen, 229bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch window, 230bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch size, 231bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector, 232bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gpu_preference, 233bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch wrapped_callback, 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) share_command_buffer)) { 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; 23628390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch return false; 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the GLES2 helper, which writes the command buffer protocol. 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_helper_.reset(new gles2::GLES2CmdHelper(command_buffer_.get())); 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!gles2_helper_->Initialize(kCommandBufferSize)) { 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(ERROR) << "Failed to initialize GLES2CmdHelper"; 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Destroy(); 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a transfer buffer. 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get())); 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool bind_generates_resources = false; 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the object exposing the OpenGL API. 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_implementation_.reset(new gles2::GLES2Implementation( 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_helper_.get(), 25528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch share_group, 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transfer_buffer_.get(), 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bind_generates_resources, 258e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attribs.lose_context_when_out_of_memory > 0, 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) command_buffer_.get())); 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (use_global_share_group) { 26228390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch g_all_shared_contexts.Get().insert(this); 26328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_shared_context_lock.reset(); 26428390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch } 26528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!gles2_implementation_->Initialize( 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kStartTransferBufferSize, 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kMinTransferBufferSize, 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kMaxTransferBufferSize, 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gles2::GLES2Implementation::kNoLimit)) { 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GLInProcessContextImpl::Destroy() { 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (gles2_implementation_) { 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // First flush the context to ensure that any pending frees of resources 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // are completed. Otherwise, if this context is part of a share group, 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // those resources might leak. Also, any remaining side effects of commands 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // issued on this context might not be visible to other contexts in the 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // share group. 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_implementation_->Flush(); 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_implementation_.reset(); 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transfer_buffer_.reset(); 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_helper_.reset(); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch command_buffer_.reset(); 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)scoped_refptr<gfx::SurfaceTexture> 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)GLInProcessContextImpl::GetSurfaceTexture(uint32 stream_id) { 2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return command_buffer_->GetSurfaceTexture(stream_id); 2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 3003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // anonymous namespace 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 303bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochGLInProcessContextAttribs::GLInProcessContextAttribs() 304bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : alpha_size(-1), 305bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch blue_size(-1), 306bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch green_size(-1), 307bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch red_size(-1), 308bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch depth_size(-1), 309bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch stencil_size(-1), 310bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch samples(-1), 311e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch sample_buffers(-1), 312e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch fail_if_major_perf_caveat(-1), 313e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch lose_context_when_out_of_memory(-1) {} 314bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGLInProcessContext* GLInProcessContext::CreateContext( 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_offscreen, 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::AcceleratedWidget window, 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Size& size, 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool share_resources, 321bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GLInProcessContextAttribs& attribs, 322bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gfx::GpuPreference gpu_preference) { 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<GLInProcessContextImpl> context( 32428390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch new GLInProcessContextImpl()); 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!context->Initialize( 326bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch NULL /* surface */, 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_offscreen, 32828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch share_resources, 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, 330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window, 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size, 332bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attribs, 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gpu_preference, 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<InProcessCommandBuffer::Service>())) 335bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return NULL; 336bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 337bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return context.release(); 338bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 339bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)GLInProcessContext* GLInProcessContext::Create( 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<gpu::InProcessCommandBuffer::Service> service, 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<gfx::GLSurface> surface, 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_offscreen, 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::AcceleratedWidget window, 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::Size& size, 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLInProcessContext* share_context, 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool use_global_share_group, 348bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GLInProcessContextAttribs& attribs, 349bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gfx::GpuPreference gpu_preference) { 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!use_global_share_group || !share_context); 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (surface.get()) { 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(surface->IsOffscreen(), is_offscreen); 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(surface->GetSize() == size); 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(gfx::kNullAcceleratedWidget, window); 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<GLInProcessContextImpl> context(new GLInProcessContextImpl()); 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!context->Initialize(surface, 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_offscreen, 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) use_global_share_group, 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) share_context, 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::kNullAcceleratedWidget, 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size, 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) attribs, 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gpu_preference, 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) service)) 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return context.release(); 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace gpu 373