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