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 : GLContext(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 // Row 0 is at the top.
66 OSMesaPixelStore(OSMESA_Y_UP
, 0);
68 SetCurrent(this, surface
);
69 if (!InitializeExtensionBindings()) {
70 ReleaseCurrent(surface
);
74 if (!surface
->OnMakeCurrent(this)) {
75 LOG(ERROR
) << "Could not make current.";
83 void GLContextOSMesa::ReleaseCurrent(GLSurface
* surface
) {
84 if (!IsCurrent(surface
))
87 SetCurrent(NULL
, NULL
);
88 OSMesaMakeCurrent(NULL
, NULL
, GL_UNSIGNED_BYTE
, 0, 0);
91 bool GLContextOSMesa::IsCurrent(GLSurface
* surface
) {
94 bool native_context_is_current
=
95 context_
== OSMesaGetCurrentContext();
97 // If our context is current then our notion of which GLContext is
98 // current must be correct. On the other hand, third-party code
99 // using OpenGL might change the current context.
100 DCHECK(!native_context_is_current
|| (GetCurrent() == this));
102 if (!native_context_is_current
)
110 OSMesaGetColorBuffer(context_
, &width
, &height
, &format
, &buffer
);
111 if (buffer
!= surface
->GetHandle())
118 void* GLContextOSMesa::GetHandle() {
122 void GLContextOSMesa::SetSwapInterval(int interval
) {
123 DCHECK(IsCurrent(NULL
));
124 DLOG(INFO
) << "GLContextOSMesa::SetSwapInterval is ignored.";
127 GLContextOSMesa::~GLContextOSMesa() {