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