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