180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "GrGLContext.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger//////////////////////////////////////////////////////////////////////////////// 11096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrGLContextInfo& GrGLContextInfo::operator= (const GrGLContextInfo& ctxInfo) { 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fBindingInUse = ctxInfo.fBindingInUse; 13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fGLVersion = ctxInfo.fGLVersion; 14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fGLSLGeneration = ctxInfo.fGLSLGeneration; 15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fVendor = ctxInfo.fVendor; 160a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fRenderer = ctxInfo.fRenderer; 17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fExtensions = ctxInfo.fExtensions; 1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fIsMesa = ctxInfo.fIsMesa; 190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fIsChromium = ctxInfo.fIsChromium; 207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *fGLCaps = *ctxInfo.fGLCaps.get(); 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return *this; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool GrGLContextInfo::initialize(const GrGLInterface* interface) { 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->reset(); 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // We haven't validated the GrGLInterface yet, so check for GetString 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // function pointer 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (interface->fGetString) { 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrGLubyte* verUByte; 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GR_GL_CALL_RET(interface, verUByte, GetString(GR_GL_VERSION)); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* ver = reinterpret_cast<const char*>(verUByte); 320a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 330a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const GrGLubyte* rendererUByte; 340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GR_GL_CALL_RET(interface, rendererUByte, GetString(GR_GL_RENDERER)); 350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const char* renderer = reinterpret_cast<const char*>(rendererUByte); 360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLBinding binding = GrGLGetBindingInUseFromString(ver); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (0 != binding && interface->validate(binding) && fExtensions.init(binding, interface)) { 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fBindingInUse = binding; 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fGLVersion = GrGLGetVersionFromString(ver); 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 44096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fGLSLGeneration = GrGetGLSLGeneration(fBindingInUse, interface); 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fVendor = GrGLGetVendor(interface); 4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 480a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fRenderer = GrGLGetRendererFromString(renderer); 490a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fIsMesa = GrGLIsMesaFromVersionString(ver); 5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fIsChromium = GrGLIsChromiumFromRendererString(renderer); 530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fGLCaps->init(*this, interface); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool GrGLContextInfo::isInitialized() const { 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return kNone_GrGLBinding != fBindingInUse; 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 65096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergervoid GrGLContextInfo::reset() { 66096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fBindingInUse = kNone_GrGLBinding; 67096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fGLVersion = GR_GL_VER(0, 0); 68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fGLSLGeneration = static_cast<GrGLSLGeneration>(0); 69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fVendor = kOther_GrGLVendor; 700a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fRenderer = kOther_GrGLRenderer; 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fIsMesa = false; 720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fIsChromium = false; 73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fExtensions.reset(); 747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fGLCaps->reset(); 75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger//////////////////////////////////////////////////////////////////////////////// 78096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrGLContext::GrGLContext(const GrGLInterface* interface) { 79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fInterface = NULL; 80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger this->initialize(interface); 81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 83096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrGLContext::GrGLContext(const GrGLContext& ctx) { 84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fInterface = NULL; 85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *this = ctx; 86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 87096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 88096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrGLContext& GrGLContext::operator = (const GrGLContext& ctx) { 890a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkRefCnt_SafeAssign(fInterface, ctx.fInterface); 90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fInfo = ctx.fInfo; 91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return *this; 92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergervoid GrGLContext::reset() { 950a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkSafeSetNull(fInterface); 96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fInfo.reset(); 97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool GrGLContext::initialize(const GrGLInterface* interface) { 100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger if (fInfo.initialize(interface)) { 101096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fInterface = interface; 102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->ref(); 103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return true; 104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return false; 106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger} 107