| Index: app/gfx/gl/gl_context_egl.cc
 | 
| ===================================================================
 | 
| --- app/gfx/gl/gl_context_egl.cc	(revision 0)
 | 
| +++ app/gfx/gl/gl_context_egl.cc	(revision 0)
 | 
| @@ -0,0 +1,241 @@
 | 
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include <EGL/egl.h>
 | 
| +
 | 
| +#include "base/scoped_ptr.h"
 | 
| +#include "app/gfx/gl/gl_bindings.h"
 | 
| +#include "app/gfx/gl/gl_context_egl.h"
 | 
| +
 | 
| +namespace gfx {
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +// The EGL configuration to use.
 | 
| +EGLDisplay g_display;
 | 
| +EGLConfig g_config;
 | 
| +
 | 
| +bool InitializeOneOff() {
 | 
| +  static bool initialized = false;
 | 
| +  if (initialized)
 | 
| +    return true;
 | 
| +
 | 
| +  g_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
 | 
| +  if (!g_display)
 | 
| +    return false;
 | 
| +
 | 
| +  if (!eglInitialize(g_display, NULL, NULL) == EGL_TRUE)
 | 
| +    return false;
 | 
| +
 | 
| +  // Choose an EGL configuration.
 | 
| +  static const EGLint kConfigAttribs[] = {
 | 
| +    EGL_BUFFER_SIZE, 32,
 | 
| +    EGL_ALPHA_SIZE, 8,
 | 
| +    EGL_BLUE_SIZE, 8,
 | 
| +    EGL_RED_SIZE, 8,
 | 
| +    EGL_DEPTH_SIZE, 24,
 | 
| +    EGL_STENCIL_SIZE, 8,
 | 
| +    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
 | 
| +    EGL_NONE
 | 
| +  };
 | 
| +
 | 
| +  EGLint num_configs;
 | 
| +  if (!eglChooseConfig(g_display,
 | 
| +                       kConfigAttribs,
 | 
| +                       NULL,
 | 
| +                       0,
 | 
| +                       &num_configs)) {
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  if (num_configs == 0)
 | 
| +    return false;
 | 
| +
 | 
| +  scoped_array<EGLConfig> configs(new EGLConfig[num_configs]);
 | 
| +  if (!eglChooseConfig(g_display,
 | 
| +                       kConfigAttribs,
 | 
| +                       configs.get(),
 | 
| +                       num_configs,
 | 
| +                       &num_configs)) {
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  g_config = configs[0];
 | 
| +
 | 
| +  initialized = true;
 | 
| +  return true;
 | 
| +}
 | 
| +}  // namespace anonymous
 | 
| +
 | 
| +NativeViewEGLContext::NativeViewEGLContext(void* window)
 | 
| +    : window_(window),
 | 
| +      surface_(NULL),
 | 
| +      context_(NULL)
 | 
| +{
 | 
| +}
 | 
| +
 | 
| +NativeViewEGLContext::~NativeViewEGLContext() {
 | 
| +}
 | 
| +
 | 
| +bool NativeViewEGLContext::Initialize() {
 | 
| +  DCHECK(!context_);
 | 
| +
 | 
| +  if (!InitializeOneOff())
 | 
| +    return NULL;
 | 
| +
 | 
| +  // Create a surface for the native window.
 | 
| +  surface_ = eglCreateWindowSurface(g_display,
 | 
| +                                    g_config,
 | 
| +                                    static_cast<EGLNativeWindowType>(window_),
 | 
| +                                    NULL);
 | 
| +  if (!surface_) {
 | 
| +    Destroy();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  // Create a context.
 | 
| +  context_ = eglCreateContext(g_display, g_config, NULL, NULL);
 | 
| +  if (!context_) {
 | 
| +    Destroy();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  if (!MakeCurrent()) {
 | 
| +    Destroy();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  if (!InitializeCommon()) {
 | 
| +    Destroy();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +void NativeViewEGLContext::Destroy() {
 | 
| +  if (context_) {
 | 
| +    eglDestroyContext(g_display, context_);
 | 
| +    context_ = NULL;
 | 
| +  }
 | 
| +
 | 
| +   if (surface_) {
 | 
| +     eglDestroySurface(g_display, surface_);
 | 
| +     surface_ = NULL;
 | 
| +   }
 | 
| +}
 | 
| +
 | 
| +bool NativeViewEGLContext::MakeCurrent() {
 | 
| +  DCHECK(context_);
 | 
| +  return eglMakeCurrent(g_display,
 | 
| +                        surface_, surface_,
 | 
| +                        context_) == GL_TRUE;
 | 
| +}
 | 
| +
 | 
| +bool NativeViewEGLContext::IsCurrent() {
 | 
| +  DCHECK(context_);
 | 
| +  return context_ == eglGetCurrentContext();
 | 
| +}
 | 
| +
 | 
| +bool NativeViewEGLContext::IsOffscreen() {
 | 
| +  return false;
 | 
| +}
 | 
| +
 | 
| +void NativeViewEGLContext::SwapBuffers() {
 | 
| +  eglSwapBuffers(g_display, surface_);
 | 
| +}
 | 
| +
 | 
| +gfx::Size NativeViewEGLContext::GetSize() {
 | 
| +#if defined(OS_WIN)
 | 
| +  RECT rect;
 | 
| +  CHECK(GetClientRect(static_cast<HWND>(window_), &rect));
 | 
| +  return gfx::Size(rect.right - rect.left, rect.bottom - rect.top);
 | 
| +#else
 | 
| +  NOTREACHED()
 | 
| +      << "NativeViewEGLContext::GetSize not implemented on this platform.";
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
| +void* NativeViewEGLContext::GetHandle() {
 | 
| +  return context_;
 | 
| +}
 | 
| +
 | 
| +EGLSurface NativeViewEGLContext::GetSurface() {
 | 
| +  return surface_;
 | 
| +}
 | 
| +
 | 
| +SecondaryEGLContext::SecondaryEGLContext()
 | 
| +    : surface_(NULL),
 | 
| +      context_(NULL)
 | 
| +{
 | 
| +}
 | 
| +
 | 
| +SecondaryEGLContext::~SecondaryEGLContext() {
 | 
| +}
 | 
| +
 | 
| +bool SecondaryEGLContext::Initialize(GLContext* shared_context) {
 | 
| +  DCHECK(shared_context);
 | 
| +  DCHECK(!context_);
 | 
| +
 | 
| +  if (!InitializeOneOff())
 | 
| +    return NULL;
 | 
| +
 | 
| +  surface_ = static_cast<BaseEGLContext*>(shared_context)->GetSurface();
 | 
| +
 | 
| +  // Create a context.
 | 
| +  context_ = eglCreateContext(g_display,
 | 
| +                              g_config,
 | 
| +                              shared_context->GetHandle(),
 | 
| +                              NULL);
 | 
| +  if (!context_) {
 | 
| +    Destroy();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +void SecondaryEGLContext::Destroy() {
 | 
| +  surface_ = NULL;
 | 
| +
 | 
| +  if (context_) {
 | 
| +    eglDestroyContext(g_display, context_);
 | 
| +    context_ = NULL;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +bool SecondaryEGLContext::MakeCurrent() {
 | 
| +  DCHECK(context_);
 | 
| +  return eglMakeCurrent(g_display,
 | 
| +                        surface_, surface_,
 | 
| +                        context_) == GL_TRUE;
 | 
| +}
 | 
| +
 | 
| +bool SecondaryEGLContext::IsCurrent() {
 | 
| +  DCHECK(context_);
 | 
| +  return context_ == eglGetCurrentContext();
 | 
| +}
 | 
| +
 | 
| +bool SecondaryEGLContext::IsOffscreen() {
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +void SecondaryEGLContext::SwapBuffers() {
 | 
| +  NOTREACHED() << "Attempted to call SwapBuffers on a SecondaryEGLContext.";
 | 
| +}
 | 
| +
 | 
| +gfx::Size SecondaryEGLContext::GetSize() {
 | 
| +  NOTREACHED() << "Should not be requesting size of this SecondaryEGLContext.";
 | 
| +  return gfx::Size(1, 1);
 | 
| +}
 | 
| +
 | 
| +void* SecondaryEGLContext::GetHandle() {
 | 
| +  return context_;
 | 
| +}
 | 
| +
 | 
| +EGLSurface SecondaryEGLContext::GetSurface() {
 | 
| +  return surface_;
 | 
| +}
 | 
| +
 | 
| +}  // namespace gfx
 | 
| 
 | 
| Property changes on: app\gfx\gl\gl_context_egl.cc
 | 
| ___________________________________________________________________
 | 
| Added: svn:eol-style
 | 
|    + LF
 | 
| 
 | 
| 
 |