1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "GrGLContext.h" 9 10 //////////////////////////////////////////////////////////////////////////////// 11 GrGLContextInfo& GrGLContextInfo::operator= (const GrGLContextInfo& ctxInfo) { 12 fBindingInUse = ctxInfo.fBindingInUse; 13 fGLVersion = ctxInfo.fGLVersion; 14 fGLSLGeneration = ctxInfo.fGLSLGeneration; 15 fVendor = ctxInfo.fVendor; 16 fExtensions = ctxInfo.fExtensions; 17 fIsMesa = ctxInfo.fIsMesa; 18 *fGLCaps = *ctxInfo.fGLCaps.get(); 19 return *this; 20 } 21 22 bool GrGLContextInfo::initialize(const GrGLInterface* interface) { 23 this->reset(); 24 // We haven't validated the GrGLInterface yet, so check for GetString 25 // function pointer 26 if (interface->fGetString) { 27 const GrGLubyte* verUByte; 28 GR_GL_CALL_RET(interface, verUByte, GetString(GR_GL_VERSION)); 29 const char* ver = reinterpret_cast<const char*>(verUByte); 30 GrGLBinding binding = GrGLGetBindingInUseFromString(ver); 31 32 if (0 != binding && interface->validate(binding) && fExtensions.init(binding, interface)) { 33 fBindingInUse = binding; 34 35 fGLVersion = GrGLGetVersionFromString(ver); 36 37 fGLSLGeneration = GrGetGLSLGeneration(fBindingInUse, interface); 38 39 fVendor = GrGLGetVendor(interface); 40 41 fIsMesa = GrGLIsMesaFromVersionString(ver); 42 43 fGLCaps->init(*this, interface); 44 return true; 45 } 46 } 47 return false; 48 } 49 50 bool GrGLContextInfo::isInitialized() const { 51 return kNone_GrGLBinding != fBindingInUse; 52 } 53 54 void GrGLContextInfo::reset() { 55 fBindingInUse = kNone_GrGLBinding; 56 fGLVersion = GR_GL_VER(0, 0); 57 fGLSLGeneration = static_cast<GrGLSLGeneration>(0); 58 fVendor = kOther_GrGLVendor; 59 fIsMesa = false; 60 fExtensions.reset(); 61 fGLCaps->reset(); 62 } 63 64 //////////////////////////////////////////////////////////////////////////////// 65 GrGLContext::GrGLContext(const GrGLInterface* interface) { 66 fInterface = NULL; 67 this->initialize(interface); 68 } 69 70 GrGLContext::GrGLContext(const GrGLContext& ctx) { 71 fInterface = NULL; 72 *this = ctx; 73 } 74 75 GrGLContext& GrGLContext::operator = (const GrGLContext& ctx) { 76 GrSafeAssign(fInterface, ctx.fInterface); 77 fInfo = ctx.fInfo; 78 return *this; 79 } 80 81 void GrGLContext::reset() { 82 GrSafeSetNull(fInterface); 83 fInfo.reset(); 84 } 85 86 bool GrGLContext::initialize(const GrGLInterface* interface) { 87 if (fInfo.initialize(interface)) { 88 fInterface = interface; 89 interface->ref(); 90 return true; 91 } 92 return false; 93 } 94