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/gles2_conform_support/egl/display.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_lib.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/transfer_buffer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/service/mailbox_manager.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/service/memory_tracking.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/transfer_buffer_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gles2_conform_support/egl/config.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gles2_conform_support/egl/surface.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kCommandBufferSize = 1024 * 1024;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kTransferBufferSize = 512 * 1024;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace egl {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Display::Display(EGLNativeDisplayType display_id)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : display_id_(display_id),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_initialized_(false),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      create_offscreen_(false),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      create_offscreen_width_(0),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      create_offscreen_height_(0) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Display::~Display() {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gles2::Terminate();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::Initialize() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gles2::Initialize();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_initialized_ = true;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::IsValidConfig(EGLConfig config) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (config != NULL) && (config == config_.get());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::ChooseConfigs(EGLConfig* configs,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            EGLint config_size,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            EGLint* num_config) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(alokp): Find out a way to find all configs. CommandBuffer currently
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does not support finding or choosing configs.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *num_config = 1;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (configs != NULL) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (config_ == NULL) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      config_.reset(new Config);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    configs[0] = config_.get();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::GetConfigs(EGLConfig* configs,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         EGLint config_size,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         EGLint* num_config) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(alokp): Find out a way to find all configs. CommandBuffer currently
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does not support finding or choosing configs.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *num_config = 1;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (configs != NULL) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (config_ == NULL) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      config_.reset(new Config);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    configs[0] = config_.get();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::GetConfigAttrib(EGLConfig config,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              EGLint attribute,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              EGLint* value) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const egl::Config* cfg = static_cast<egl::Config*>(config);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cfg->GetAttrib(attribute, value);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::IsValidNativeWindow(EGLNativeWindowType win) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined OS_WIN
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ::IsWindow(win) != FALSE;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(alokp): Validate window handle.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_WIN
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::IsValidSurface(EGLSurface surface) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (surface != NULL) && (surface == surface_.get());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EGLSurface Display::CreateWindowSurface(EGLConfig config,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        EGLNativeWindowType win,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const EGLint* attrib_list) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (surface_ != NULL) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We do not support more than one window surface.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_SURFACE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu::TransferBufferManager* manager = new gpu::TransferBufferManager();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    transfer_buffer_manager_.reset(manager);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager->Initialize();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::CommandBufferService> command_buffer(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new gpu::CommandBufferService(transfer_buffer_manager_.get()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!command_buffer->Initialize())
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<gpu::gles2::ContextGroup> group(new gpu::gles2::ContextGroup(
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NULL, NULL, new gpu::gles2::ShaderTranslatorCache, NULL, true));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset(gpu::gles2::GLES2Decoder::Create(group.get()));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!decoder_.get())
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_SURFACE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_scheduler_.reset(new gpu::GpuScheduler(command_buffer.get(),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             decoder_.get(),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             NULL));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->set_engine(gpu_scheduler_.get());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size(create_offscreen_width_, create_offscreen_height_);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (create_offscreen_) {
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(size);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    create_offscreen_ = false;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    create_offscreen_width_ = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    create_offscreen_height_ = 0;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    gl_surface_ = gfx::GLSurface::CreateViewGLSurface(win);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!gl_surface_.get())
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_SURFACE;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_context_ = gfx::GLContext::CreateGLContext(NULL,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                gl_surface_.get(),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                gfx::PreferDiscreteGpu);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!gl_context_.get())
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_SURFACE;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl_context_->MakeCurrent(gl_surface_.get());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EGLint depth_size = 0;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EGLint alpha_size = 0;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EGLint stencil_size = 0;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetConfigAttrib(config, EGL_DEPTH_SIZE, &depth_size);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetConfigAttrib(config, EGL_ALPHA_SIZE, &alpha_size);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetConfigAttrib(config, EGL_STENCIL_SIZE, &stencil_size);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> attribs;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(EGL_DEPTH_SIZE);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(depth_size);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(EGL_ALPHA_SIZE);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(alpha_size);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(EGL_STENCIL_SIZE);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(stencil_size);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Insert attrib_list. Although ES 1.1 says it must be null
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attribs.push_back(EGL_NONE);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!decoder_->Initialize(gl_surface_.get(),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            gl_context_.get(),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            gl_surface_->IsOffscreen(),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            gpu::gles2::DisallowedFeatures(),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            attribs)) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_SURFACE;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer->SetPutOffsetChangeCallback(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&gpu::GpuScheduler::PutChanged,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(gpu_scheduler_.get())));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer->SetGetBufferChangeCallback(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&gpu::GpuScheduler::SetGetBuffer,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(gpu_scheduler_.get())));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::GLES2CmdHelper> cmd_helper(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new gpu::gles2::GLES2CmdHelper(command_buffer.get()));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cmd_helper->Initialize(kCommandBufferSize))
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::TransferBuffer> transfer_buffer(new gpu::TransferBuffer(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cmd_helper.get()));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_buffer_.reset(command_buffer.release());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transfer_buffer_.reset(transfer_buffer.release());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gles2_cmd_helper_.reset(cmd_helper.release());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  surface_.reset(new Surface(win));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return surface_.get();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Display::DestroySurface(EGLSurface surface) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidSurface(surface));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_scheduler_.reset();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (decoder_.get()) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_->Destroy(true);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_surface_ = NULL;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_context_ = NULL;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  surface_.reset();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Display::SwapBuffers(EGLSurface surface) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidSurface(surface));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_->SwapBuffers();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::IsValidContext(EGLContext ctx) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (ctx != NULL) && (ctx == context_.get());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EGLContext Display::CreateContext(EGLConfig config,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  EGLContext share_ctx,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const EGLint* attrib_list) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidConfig(config));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(alokp): Add support for shared contexts.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (share_ctx != NULL)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_CONTEXT;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(command_buffer_ != NULL);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(transfer_buffer_.get());
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool bind_generates_resources = true;
230e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool lose_context_when_out_of_memory = false;
231e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  context_.reset(
233e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new gpu::gles2::GLES2Implementation(gles2_cmd_helper_.get(),
234e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          NULL,
235e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          transfer_buffer_.get(),
236e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          bind_generates_resources,
237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          lose_context_when_out_of_memory,
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          this));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context_->Initialize(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTransferBufferSize,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kTransferBufferSize / 2,
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kTransferBufferSize * 2,
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      gpu::gles2::GLES2Implementation::kNoLimit)) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EGL_NO_CONTEXT;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_->EnableFeatureCHROMIUM("pepper3d_allow_buffers_on_multiple_targets");
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_->EnableFeatureCHROMIUM("pepper3d_support_fixed_attribs");
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context_.get();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Display::DestroyContext(EGLContext ctx) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidContext(ctx));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_.reset();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transfer_buffer_.reset();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Display::MakeCurrent(EGLSurface draw, EGLSurface read, EGLContext ctx) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ctx == EGL_NO_CONTEXT) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2::SetGLContext(NULL);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(IsValidSurface(draw));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(IsValidSurface(read));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(IsValidContext(ctx));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gles2::SetGLContext(context_.get());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gpu::Capabilities Display::GetCapabilities() {
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return decoder_->GetCapabilities();
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)gfx::GpuMemoryBuffer* Display::CreateGpuMemoryBuffer(
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    size_t width,
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    size_t height,
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    unsigned internalformat,
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    unsigned usage,
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    int32* id) {
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return NULL;
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Display::DestroyGpuMemoryBuffer(int32 id) {
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)uint32 Display::InsertSyncPoint() {
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return 0u;
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdochuint32 Display::InsertFutureSyncPoint() {
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NOTIMPLEMENTED();
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return 0u;
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Display::RetireSyncPoint(uint32 sync_point) {
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NOTIMPLEMENTED();
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Display::SignalSyncPoint(uint32 sync_point,
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              const base::Closure& callback) {
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Display::SignalQuery(uint32 query, const base::Closure& callback) {
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Display::SetSurfaceVisible(bool visible) {
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void Display::Echo(const base::Closure& callback) {
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)uint32 Display::CreateStreamTexture(uint32 texture_id) {
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NOTIMPLEMENTED();
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return 0;
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace egl
327