Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(275)

Side by Side Diff: ui/gfx/gl/gl_context_osmesa.cc

Issue 7021014: GLContext no longer holds a pointer to a GLSurface. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <GL/osmesa.h> 5 #include <GL/osmesa.h>
6 6
7 #include <algorithm> 7 #include "ui/gfx/gl/gl_context_osmesa.h"
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "ui/gfx/gl/gl_bindings.h" 10 #include "ui/gfx/gl/gl_bindings.h"
11 #include "ui/gfx/gl/gl_context_osmesa.h" 11 #include "ui/gfx/gl/gl_surface_osmesa.h"
12 12
13 namespace gfx { 13 namespace gfx {
14 14
15 GLContextOSMesa::GLContextOSMesa(GLSurfaceOSMesa* surface) 15 GLContextOSMesa::GLContextOSMesa()
16 : surface_(surface), 16 : context_(NULL) {
17 context_(NULL)
18 {
19 } 17 }
20 18
21 GLContextOSMesa::~GLContextOSMesa() { 19 GLContextOSMesa::~GLContextOSMesa() {
22 Destroy(); 20 Destroy();
23 } 21 }
24 22
25 bool GLContextOSMesa::Initialize(GLuint format, GLContext* shared_context) { 23 bool GLContextOSMesa::Initialize(GLContext* shared_context,
24 GLSurface* compatible_surface) {
26 DCHECK(!context_); 25 DCHECK(!context_);
27 26
28 OSMesaContext shared_handle = NULL; 27 OSMesaContext shared_handle = NULL;
29 if (shared_context) 28 if (shared_context)
30 shared_handle = static_cast<OSMesaContext>(shared_context->GetHandle()); 29 shared_handle = static_cast<OSMesaContext>(shared_context->GetHandle());
31 30
31 GLuint format =
32 static_cast<GLSurfaceOSMesa*>(compatible_surface)->GetFormat();
32 context_ = OSMesaCreateContextExt(format, 33 context_ = OSMesaCreateContextExt(format,
33 24, // depth bits 34 24, // depth bits
34 8, // stencil bits 35 8, // stencil bits
35 0, // accum bits 36 0, // accum bits
36 shared_handle); 37 shared_handle);
37 if (!context_) { 38 if (!context_) {
38 LOG(ERROR) << "OSMesaCreateContextExt failed."; 39 LOG(ERROR) << "OSMesaCreateContextExt failed.";
39 return false; 40 return false;
40 } 41 }
41 42
42 return true; 43 return true;
43 } 44 }
44 45
45 void GLContextOSMesa::Destroy() { 46 void GLContextOSMesa::Destroy() {
46 if (context_) { 47 if (context_) {
47 OSMesaDestroyContext(static_cast<OSMesaContext>(context_)); 48 OSMesaDestroyContext(static_cast<OSMesaContext>(context_));
48 context_ = NULL; 49 context_ = NULL;
49 } 50 }
50
51 if (surface_.get()) {
52 surface_->Destroy();
53 surface_.reset();
54 }
55 } 51 }
56 52
57 bool GLContextOSMesa::MakeCurrent() { 53 bool GLContextOSMesa::MakeCurrent(GLSurface* surface) {
58 DCHECK(context_); 54 DCHECK(context_);
59 55
60 gfx::Size size = surface_->GetSize(); 56 gfx::Size size = surface->GetSize();
61 57
62 if (!OSMesaMakeCurrent(static_cast<OSMesaContext>(context_), 58 if (!OSMesaMakeCurrent(static_cast<OSMesaContext>(context_),
63 surface_->GetHandle(), 59 surface->GetHandle(),
64 GL_UNSIGNED_BYTE, 60 GL_UNSIGNED_BYTE,
65 size.width(), size.height())) { 61 size.width(),
62 size.height())) {
63 LOG(ERROR) << "OSMesaMakeCurrent failed.";
64 Destroy();
66 return false; 65 return false;
67 } 66 }
68 67
69 // Row 0 is at the top. 68 // Row 0 is at the top.
70 OSMesaPixelStore(OSMESA_Y_UP, 0); 69 OSMesaPixelStore(OSMESA_Y_UP, 0);
71 70
72 return true; 71 return true;
73 } 72 }
74 73
75 bool GLContextOSMesa::IsCurrent() { 74 void GLContextOSMesa::ReleaseCurrent(GLSurface* surface) {
76 DCHECK(context_); 75 if (!IsCurrent(surface))
77 return context_ == OSMesaGetCurrentContext(); 76 return;
77
78 OSMesaMakeCurrent(NULL, NULL, GL_UNSIGNED_BYTE, 0, 0);
78 } 79 }
79 80
80 bool GLContextOSMesa::IsOffscreen() { 81 bool GLContextOSMesa::IsCurrent(GLSurface* surface) {
81 // TODO(apatrick): remove this from GLContext interface. 82 DCHECK(context_);
82 return surface_->IsOffscreen(); 83 if (context_ != OSMesaGetCurrentContext())
83 } 84 return false;
84 85
85 bool GLContextOSMesa::SwapBuffers() { 86 if (surface) {
86 // TODO(apatrick): remove this from GLContext interface. 87 GLint width;
87 return surface_->SwapBuffers(); 88 GLint height;
88 } 89 GLint format;
90 void* buffer = NULL;
91 OSMesaGetColorBuffer(context_, &width, &height, &format, &buffer);
92 if (buffer != surface->GetHandle())
93 return false;
94 }
89 95
90 gfx::Size GLContextOSMesa::GetSize() { 96 return true;
91 // TODO(apatrick): remove this from GLContext interface.
92 return surface_->GetSize();
93 } 97 }
94 98
95 void* GLContextOSMesa::GetHandle() { 99 void* GLContextOSMesa::GetHandle() {
96 return context_; 100 return context_;
97 } 101 }
98 102
99 void GLContextOSMesa::SetSwapInterval(int interval) { 103 void GLContextOSMesa::SetSwapInterval(int interval) {
100 DCHECK(IsCurrent()); 104 DCHECK(IsCurrent(NULL));
101 NOTREACHED() << "Attempt to call SetSwapInterval on an GLContextOSMesa."; 105 NOTREACHED() << "Attempt to call SetSwapInterval on an GLContextOSMesa.";
102 } 106 }
103 107
104 } // namespace gfx 108 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698