1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include <GL/osmesa.h> 10 11 #include "gl/mesa/SkMesaGLContext.h" 12 #include "gl/GrGLDefines.h" 13 14 static const GrGLint gBOGUS_SIZE = 16; 15 16 SkMesaGLContext::SkMesaGLContext() 17 : fContext(static_cast<Context>(0)) 18 , fImage(nullptr) { 19 GR_STATIC_ASSERT(sizeof(Context) == sizeof(OSMesaContext)); 20 21 /* Create an RGBA-mode context */ 22 #if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305 23 /* specify Z, stencil, accum sizes */ 24 fContext = (Context)OSMesaCreateContextExt(OSMESA_BGRA, 0, 0, 0, nullptr); 25 #else 26 fContext = (Context)OSMesaCreateContext(OSMESA_BGRA, nullptr); 27 #endif 28 if (!fContext) { 29 SkDebugf("OSMesaCreateContext failed!\n"); 30 this->destroyGLContext(); 31 return; 32 } 33 // Allocate the image buffer 34 fImage = (GrGLubyte *) sk_malloc_throw(gBOGUS_SIZE * gBOGUS_SIZE * 35 4 * sizeof(GrGLubyte)); 36 if (!fImage) { 37 SkDebugf("Alloc image buffer failed!\n"); 38 this->destroyGLContext(); 39 return; 40 } 41 42 // Bind the buffer to the context and make it current 43 if (!OSMesaMakeCurrent((OSMesaContext)fContext, 44 fImage, 45 GR_GL_UNSIGNED_BYTE, 46 gBOGUS_SIZE, 47 gBOGUS_SIZE)) { 48 SkDebugf("OSMesaMakeCurrent failed!\n"); 49 this->destroyGLContext(); 50 return; 51 } 52 53 SkAutoTUnref<const GrGLInterface> gl(GrGLCreateMesaInterface()); 54 if (nullptr == gl.get()) { 55 SkDebugf("Could not create GL interface!\n"); 56 this->destroyGLContext(); 57 return; 58 } 59 60 if (!gl->validate()) { 61 SkDebugf("Could not validate GL interface!\n"); 62 this->destroyGLContext(); 63 return; 64 } 65 66 this->init(gl.detach()); 67 } 68 69 SkMesaGLContext::~SkMesaGLContext() { 70 this->teardown(); 71 this->destroyGLContext(); 72 } 73 74 void SkMesaGLContext::destroyGLContext() { 75 if (fImage) { 76 sk_free(fImage); 77 fImage = nullptr; 78 } 79 80 if (fContext) { 81 OSMesaDestroyContext((OSMesaContext)fContext); 82 fContext = static_cast<Context>(0); 83 } 84 } 85 86 87 88 void SkMesaGLContext::onPlatformMakeCurrent() const { 89 if (fContext) { 90 if (!OSMesaMakeCurrent((OSMesaContext)fContext, fImage, 91 GR_GL_UNSIGNED_BYTE, gBOGUS_SIZE, gBOGUS_SIZE)) { 92 SkDebugf("Could not make MESA context current."); 93 } 94 } 95 } 96 97 void SkMesaGLContext::onPlatformSwapBuffers() const { } 98 99 GrGLFuncPtr SkMesaGLContext::onPlatformGetProcAddress(const char* procName) const { 100 return OSMesaGetProcAddress(procName); 101 } 102