1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/gl/gl_context_osmesa.h"
9 #include "base/logging.h"
10 #include "ui/gfx/size.h"
11 #include "ui/gl/gl_bindings.h"
12 #include "ui/gl/gl_surface.h"
16 GLContextOSMesa::GLContextOSMesa(GLShareGroup* share_group)
17 : GLContextReal(share_group),
21 bool GLContextOSMesa::Initialize(GLSurface* compatible_surface,
22 GpuPreference gpu_preference) {
25 OSMesaContext share_handle = static_cast<OSMesaContext>(
26 share_group() ? share_group()->GetHandle() : NULL);
28 GLuint format = compatible_surface->GetFormat();
29 DCHECK_NE(format, (unsigned)0);
30 context_ = OSMesaCreateContextExt(format,
36 LOG(ERROR) << "OSMesaCreateContextExt failed.";
43 void GLContextOSMesa::Destroy() {
45 OSMesaDestroyContext(static_cast<OSMesaContext>(context_));
50 bool GLContextOSMesa::MakeCurrent(GLSurface* surface) {
53 gfx::Size size = surface->GetSize();
55 if (!OSMesaMakeCurrent(context_,
60 LOG(ERROR) << "OSMesaMakeCurrent failed.";
65 // Set this as soon as the context is current, since we might call into GL.
68 // Row 0 is at the top.
69 OSMesaPixelStore(OSMESA_Y_UP, 0);
72 if (!InitializeExtensionBindings()) {
73 ReleaseCurrent(surface);
77 if (!surface->OnMakeCurrent(this)) {
78 LOG(ERROR) << "Could not make current.";
85 void GLContextOSMesa::ReleaseCurrent(GLSurface* surface) {
86 if (!IsCurrent(surface))
90 OSMesaMakeCurrent(NULL, NULL, GL_UNSIGNED_BYTE, 0, 0);
93 bool GLContextOSMesa::IsCurrent(GLSurface* surface) {
96 bool native_context_is_current =
97 context_ == OSMesaGetCurrentContext();
99 // If our context is current then our notion of which GLContext is
100 // current must be correct. On the other hand, third-party code
101 // using OpenGL might change the current context.
102 DCHECK(!native_context_is_current || (GetRealCurrent() == this));
104 if (!native_context_is_current)
112 OSMesaGetColorBuffer(context_, &width, &height, &format, &buffer);
113 if (buffer != surface->GetHandle())
120 void* GLContextOSMesa::GetHandle() {
124 void GLContextOSMesa::SetSwapInterval(int interval) {
125 DCHECK(IsCurrent(NULL));
128 GLContextOSMesa::~GLContextOSMesa() {