15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/at_exit.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_lib.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/transfer_buffer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/command_buffer_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_context_virtual.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_control_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_scheduler.h" 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/service/image_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_context.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_share_group.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GLManager::use_count_; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<gfx::GLShareGroup>* GLManager::base_share_group_; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<gfx::GLSurface>* GLManager::base_surface_; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<gfx::GLContext>* GLManager::base_context_; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLManager::Options::Options() 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : size(4, 4), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) share_group_manager(NULL), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) share_mailbox_manager(NULL), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual_manager(NULL), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bind_generates_resource(false), 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) context_lost_allowed(false), 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) image_manager(NULL) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLManager::GLManager() 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : context_lost_allowed_(false) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupBaseContext(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLManager::~GLManager() { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --use_count_; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!use_count_) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base_share_group_) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete base_context_; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_context_ = NULL; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base_surface_) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete base_surface_; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_surface_ = NULL; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base_context_) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete base_context_; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_context_ = NULL; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GLManager::Initialize(const GLManager::Options& options) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int32 kCommandBufferSize = 1024 * 1024; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kStartTransferBufferSize = 4 * 1024 * 1024; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kMinTransferBufferSize = 1 * 256 * 1024; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kMaxTransferBufferSize = 16 * 1024 * 1024; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_lost_allowed_ = options.context_lost_allowed; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gles2::MailboxManager* mailbox_manager = NULL; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (options.share_mailbox_manager) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mailbox_manager = options.share_mailbox_manager->mailbox_manager(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (options.share_group_manager) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mailbox_manager = options.share_group_manager->mailbox_manager(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::GLShareGroup* share_group = NULL; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (options.share_group_manager) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) share_group = options.share_group_manager->share_group(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (options.share_mailbox_manager) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) share_group = options.share_mailbox_manager->share_group(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gles2::ContextGroup* context_group = NULL; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gles2::ShareGroup* client_share_group = NULL; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (options.share_group_manager) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_group = options.share_group_manager->decoder_->GetContextGroup(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_share_group = 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.share_group_manager->gles2_implementation()->share_group(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::GLContext* real_gl_context = NULL; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (options.virtual_manager) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) real_gl_context = options.virtual_manager->context(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mailbox_manager_ = 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mailbox_manager ? mailbox_manager : new gles2::MailboxManager; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_group_ = 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_group ? share_group : new gfx::GLShareGroup; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::GpuPreference gpu_preference(gfx::PreferDiscreteGpu); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int32> attribs; 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gles2::ContextCreationAttribHelper attrib_helper; 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_helper.red_size_ = 8; 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_helper.green_size_ = 8; 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_helper.blue_size_ = 8; 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_helper.alpha_size_ = 8; 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_helper.depth_size_ = 16; 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_helper.Serialize(&attribs); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!context_group) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_group = new gles2::ContextGroup(mailbox_manager_.get(), 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) options.image_manager, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NULL, 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NULL, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.bind_generates_resource); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_.reset(new CommandBufferService( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->GetContextGroup()->transfer_buffer_manager())); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(command_buffer_->Initialize()) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "could not create command buffer service"; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_scheduler_.reset(new GpuScheduler(command_buffer_.get(), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.get(), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.get())); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->set_engine(gpu_scheduler_.get()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) surface_ = gfx::GLSurface::CreateOffscreenGLSurface(options.size); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(surface_.get() != NULL) << "could not create offscreen surface"; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (real_gl_context) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_ = scoped_refptr<gfx::GLContext>(new gpu::GLContextVirtual( 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) share_group_.get(), real_gl_context, decoder_->AsWeakPtr())); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(context_->Initialize( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_.get(), gfx::PreferIntegratedGpu)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base_context_) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_ = scoped_refptr<gfx::GLContext>(new gpu::GLContextVirtual( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) share_group_.get(), base_context_->get(), decoder_->AsWeakPtr())); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(context_->Initialize( 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_.get(), gfx::PreferIntegratedGpu)); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context_ = gfx::GLContext::CreateGLContext(share_group_.get(), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) surface_.get(), 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_preference); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(context_.get() != NULL) << "could not create GL context"; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(context_->MakeCurrent(surface_.get())); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(decoder_->Initialize( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_.get(), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.get(), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gpu::gles2::DisallowedFeatures(), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attribs)) << "could not initialize decoder"; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gpu_control_.reset( 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new GpuControlService(decoder_->GetContextGroup()->image_manager(), 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) options.gpu_memory_buffer_factory, 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) decoder_->GetContextGroup()->mailbox_manager(), 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) decoder_->GetQueryManager(), 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) decoder_->GetCapabilities())); 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetPutOffsetChangeCallback( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GLManager::PumpCommands, base::Unretained(this))); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetGetBufferChangeCallback( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GLManager::GetBufferChanged, base::Unretained(this))); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the GLES2 helper, which writes the command buffer protocol. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_helper_.reset(new gles2::GLES2CmdHelper(command_buffer_.get())); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(gles2_helper_->Initialize(kCommandBufferSize)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a transfer buffer. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get())); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool free_everything_when_invisible = false; 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the object exposing the OpenGL API. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_implementation_.reset(new gles2::GLES2Implementation( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_helper_.get(), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_share_group, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer_.get(), 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) options.bind_generates_resource, 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) free_everything_when_invisible , 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gpu_control_.get())); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(gles2_implementation_->Initialize( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartTransferBufferSize, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinTransferBufferSize, 2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kMaxTransferBufferSize, 2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gpu::gles2::GLES2Implementation::kNoLimit)) 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) << "Could not init GLES2Implementation"; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeCurrent(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GLManager::SetupBaseContext() { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_count_) { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) #if defined(OS_ANDROID) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_share_group_ = new scoped_refptr<gfx::GLShareGroup>( 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new gfx::GLShareGroup); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size(4, 4); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_surface_ = new scoped_refptr<gfx::GLSurface>( 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::GLSurface::CreateOffscreenGLSurface(size)); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::GpuPreference gpu_preference(gfx::PreferDiscreteGpu); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_context_ = new scoped_refptr<gfx::GLContext>( 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::GLContext::CreateGLContext(base_share_group_->get(), 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_surface_->get(), 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_preference)); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) #endif 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++use_count_; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLManager::MakeCurrent() { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gles2::SetGLContext(gles2_implementation_.get()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GLManager::SetSurface(gfx::GLSurface* surface) { 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) decoder_->SetSurface(surface); 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLManager::Destroy() { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gles2_implementation_.get()) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeCurrent(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(glGetError() == GL_NONE); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_implementation_->Flush(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_implementation_.reset(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer_.reset(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gles2_helper_.reset(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_.reset(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoder_.get()) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->MakeCurrent(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->Destroy(true); 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) decoder_.reset(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst gpu::gles2::FeatureInfo::Workarounds& GLManager::workarounds() const { 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return decoder_->GetContextGroup()->feature_info()->workarounds(); 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLManager::PumpCommands() { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->MakeCurrent(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_scheduler_->PutChanged(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gpu::CommandBuffer::State state = command_buffer_->GetState(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!context_lost_allowed_) { 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(::gpu::error::kNoError, state.error); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLManager::GetBufferChanged(int32 transfer_buffer_id) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gpu_scheduler_->SetGetBuffer(transfer_buffer_id); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 274