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 5429b9551cc916527928033a672e723526b237da3fsievers@chromium.org bool Initialize( 5529b9551cc916527928033a672e723526b237da3fsievers@chromium.org scoped_refptr<gfx::GLSurface> surface, 5629b9551cc916527928033a672e723526b237da3fsievers@chromium.org bool is_offscreen, 5729b9551cc916527928033a672e723526b237da3fsievers@chromium.org bool use_global_share_group, 5829b9551cc916527928033a672e723526b237da3fsievers@chromium.org GLInProcessContext* share_context, 5929b9551cc916527928033a672e723526b237da3fsievers@chromium.org gfx::AcceleratedWidget window, 6029b9551cc916527928033a672e723526b237da3fsievers@chromium.org const gfx::Size& size, 6129b9551cc916527928033a672e723526b237da3fsievers@chromium.org const GLInProcessContextAttribs& attribs, 6229b9551cc916527928033a672e723526b237da3fsievers@chromium.org gfx::GpuPreference gpu_preference, 6329b9551cc916527928033a672e723526b237da3fsievers@chromium.org 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() 96da769a35c9c196554ed122b3eb0030370c4503d7sievers@chromium.org : 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, 12529b9551cc916527928033a672e723526b237da3fsievers@chromium.org bool use_global_share_group, 12629b9551cc916527928033a672e723526b237da3fsievers@chromium.org GLInProcessContext* share_context, 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::AcceleratedWidget window, 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Size& size, 129bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GLInProcessContextAttribs& attribs, 13029b9551cc916527928033a672e723526b237da3fsievers@chromium.org gfx::GpuPreference gpu_preference, 13129b9551cc916527928033a672e723526b237da3fsievers@chromium.org const scoped_refptr<InProcessCommandBuffer::Service>& service) { 13229b9551cc916527928033a672e723526b237da3fsievers@chromium.org 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; 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 151bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch std::vector<int32> attrib_vector; 152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.alpha_size >= 0) { 153bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(ALPHA_SIZE); 154bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.alpha_size); 155bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 156bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.blue_size >= 0) { 157bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(BLUE_SIZE); 158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.blue_size); 159bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 160bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.green_size >= 0) { 161bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(GREEN_SIZE); 162bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.green_size); 163bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 164bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.red_size >= 0) { 165bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(RED_SIZE); 166bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.red_size); 167bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 168bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.depth_size >= 0) { 169bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(DEPTH_SIZE); 170bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.depth_size); 171bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 172bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.stencil_size >= 0) { 173bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(STENCIL_SIZE); 174bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.stencil_size); 175bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 176bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.samples >= 0) { 177bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(SAMPLES); 178bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.samples); 179bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 180bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (attribs.sample_buffers >= 0) { 181bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(SAMPLE_BUFFERS); 182bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(attribs.sample_buffers); 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (attribs.fail_if_major_perf_caveat > 0) { 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) attrib_vector.push_back(FAIL_IF_MAJOR_PERF_CAVEAT); 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) attrib_vector.push_back(attribs.fail_if_major_perf_caveat); 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 188bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector.push_back(NONE); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch base::Closure wrapped_callback = 191bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); 19229b9551cc916527928033a672e723526b237da3fsievers@chromium.org command_buffer_.reset(new InProcessCommandBuffer(service)); 19328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch 19428390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_ptr<base::AutoLock> scoped_shared_context_lock; 19528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_refptr<gles2::ShareGroup> share_group; 196da769a35c9c196554ed122b3eb0030370c4503d7sievers@chromium.org InProcessCommandBuffer* share_command_buffer = NULL; 19729b9551cc916527928033a672e723526b237da3fsievers@chromium.org if (use_global_share_group) { 19828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_shared_context_lock.reset( 19928390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch new base::AutoLock(g_all_shared_contexts_lock.Get())); 20028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch for (std::set<GLInProcessContextImpl*>::const_iterator it = 20128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch g_all_shared_contexts.Get().begin(); 20228390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch it != g_all_shared_contexts.Get().end(); 20328390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch it++) { 20428390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch const GLInProcessContextImpl* context = *it; 20528390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch if (!context->context_lost_) { 20628390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch share_group = context->gles2_implementation_->share_group(); 207da769a35c9c196554ed122b3eb0030370c4503d7sievers@chromium.org share_command_buffer = context->command_buffer_.get(); 20828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch DCHECK(share_group); 209da769a35c9c196554ed122b3eb0030370c4503d7sievers@chromium.org DCHECK(share_command_buffer); 21028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch break; 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 21329b9551cc916527928033a672e723526b237da3fsievers@chromium.org } else if (share_context) { 21429b9551cc916527928033a672e723526b237da3fsievers@chromium.org GLInProcessContextImpl* impl = 21529b9551cc916527928033a672e723526b237da3fsievers@chromium.org static_cast<GLInProcessContextImpl*>(share_context); 21629b9551cc916527928033a672e723526b237da3fsievers@chromium.org share_group = impl->gles2_implementation_->share_group(); 21729b9551cc916527928033a672e723526b237da3fsievers@chromium.org share_command_buffer = impl->command_buffer_.get(); 21829b9551cc916527928033a672e723526b237da3fsievers@chromium.org DCHECK(share_group); 21929b9551cc916527928033a672e723526b237da3fsievers@chromium.org DCHECK(share_command_buffer); 22028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch } 22129b9551cc916527928033a672e723526b237da3fsievers@chromium.org 222bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!command_buffer_->Initialize(surface, 223bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch is_offscreen, 224bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch window, 225bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch size, 226bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attrib_vector, 227bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gpu_preference, 228bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch wrapped_callback, 229da769a35c9c196554ed122b3eb0030370c4503d7sievers@chromium.org share_command_buffer)) { 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; 23128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch return false; 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the GLES2 helper, which writes the command buffer protocol. 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_helper_.reset(new gles2::GLES2CmdHelper(command_buffer_.get())); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!gles2_helper_->Initialize(kCommandBufferSize)) { 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(ERROR) << "Failed to initialize GLES2CmdHelper"; 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Destroy(); 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a transfer buffer. 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get())); 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool bind_generates_resources = false; 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool free_everything_when_invisible = false; 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the object exposing the OpenGL API. 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_implementation_.reset(new gles2::GLES2Implementation( 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_helper_.get(), 25128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch share_group, 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transfer_buffer_.get(), 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bind_generates_resources, 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) free_everything_when_invisible, 2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) command_buffer_.get())); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25729b9551cc916527928033a672e723526b237da3fsievers@chromium.org if (use_global_share_group) { 25828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch g_all_shared_contexts.Get().insert(this); 25928390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch scoped_shared_context_lock.reset(); 26028390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch } 26128390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!gles2_implementation_->Initialize( 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kStartTransferBufferSize, 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch kMinTransferBufferSize, 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kMaxTransferBufferSize, 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gles2::GLES2Implementation::kNoLimit)) { 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GLInProcessContextImpl::Destroy() { 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (gles2_implementation_) { 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // First flush the context to ensure that any pending frees of resources 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // are completed. Otherwise, if this context is part of a share group, 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // those resources might leak. Also, any remaining side effects of commands 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // issued on this context might not be visible to other contexts in the 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // share group. 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_implementation_->Flush(); 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_implementation_.reset(); 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch transfer_buffer_.reset(); 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gles2_helper_.reset(); 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch command_buffer_.reset(); 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_ANDROID) 291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)scoped_refptr<gfx::SurfaceTexture> 2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)GLInProcessContextImpl::GetSurfaceTexture(uint32 stream_id) { 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return command_buffer_->GetSurfaceTexture(stream_id); 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // anonymous namespace 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 299bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochGLInProcessContextAttribs::GLInProcessContextAttribs() 300bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : alpha_size(-1), 301bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch blue_size(-1), 302bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch green_size(-1), 303bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch red_size(-1), 304bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch depth_size(-1), 305bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch stencil_size(-1), 306bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch samples(-1), 307bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch sample_buffers(-1) {} 308bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochGLInProcessContext* GLInProcessContext::CreateContext( 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_offscreen, 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::AcceleratedWidget window, 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Size& size, 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool share_resources, 315bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GLInProcessContextAttribs& attribs, 316bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gfx::GpuPreference gpu_preference) { 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<GLInProcessContextImpl> context( 31828390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch new GLInProcessContextImpl()); 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!context->Initialize( 320bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch NULL /* surface */, 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_offscreen, 32228390f6bb8dc6eb59bac1e0576f95a7740a9bd61Ben Murdoch share_resources, 32329b9551cc916527928033a672e723526b237da3fsievers@chromium.org NULL, 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window, 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size, 326bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attribs, 32729b9551cc916527928033a672e723526b237da3fsievers@chromium.org gpu_preference, 32829b9551cc916527928033a672e723526b237da3fsievers@chromium.org scoped_refptr<InProcessCommandBuffer::Service>())) 329bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return NULL; 330bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 331bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return context.release(); 332bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 333bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 334bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// static 335bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochGLInProcessContext* GLInProcessContext::CreateWithSurface( 336bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<gfx::GLSurface> surface, 33729b9551cc916527928033a672e723526b237da3fsievers@chromium.org scoped_refptr<gpu::InProcessCommandBuffer::Service> service, 33829b9551cc916527928033a672e723526b237da3fsievers@chromium.org GLInProcessContext* share_context, 339bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GLInProcessContextAttribs& attribs, 340bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gfx::GpuPreference gpu_preference) { 341bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_ptr<GLInProcessContextImpl> context( 342bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch new GLInProcessContextImpl()); 343bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!context->Initialize( 344bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch surface, 345bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch surface->IsOffscreen(), 34629b9551cc916527928033a672e723526b237da3fsievers@chromium.org false, 34729b9551cc916527928033a672e723526b237da3fsievers@chromium.org share_context, 348bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch gfx::kNullAcceleratedWidget, 349bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch surface->GetSize(), 350bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch attribs, 35129b9551cc916527928033a672e723526b237da3fsievers@chromium.org gpu_preference, 35229b9551cc916527928033a672e723526b237da3fsievers@chromium.org service)) 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return context.release(); 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace gpu 359