1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
627847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com */
727847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
99c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#include "GrGLUtil.h"
10215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org#include "SkMatrix.h"
11fab44db294846ff05d837b9cf0bf97a073891da7bungeman@google.com#include <stdio.h>
12f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com
130b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.comvoid GrGLClearErr(const GrGLInterface* gl) {
14c72425ae368bfcb47de7d2532eb90d305ec0d1cfcommit-bot@chromium.org    while (GR_GL_NO_ERROR != gl->fFunctions.fGetError()) {}
15f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com}
1627847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com
17845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.comnamespace {
18845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.comconst char *get_error_string(uint32_t err) {
19845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    switch (err) {
20845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    case GR_GL_NO_ERROR:
21845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        return "";
22845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    case GR_GL_INVALID_ENUM:
23845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        return "Invalid Enum";
24845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    case GR_GL_INVALID_VALUE:
25845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        return "Invalid Value";
26845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    case GR_GL_INVALID_OPERATION:
27845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        return "Invalid Operation";
28845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    case GR_GL_OUT_OF_MEMORY:
29845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        return "Out of Memory";
30845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    case GR_GL_CONTEXT_LOST:
31845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        return "Context Lost";
32845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    }
33845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com    return "Unknown";
34845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com}
35845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com}
36845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com
370b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.comvoid GrGLCheckErr(const GrGLInterface* gl,
380b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com                  const char* location,
390b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com                  const char* call) {
400b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com    uint32_t err = GR_GL_GET_ERROR(gl);
410f31ca79bde088e6caac219734c35c1ae3e9e8b9twiz@google.com    if (GR_GL_NO_ERROR != err) {
42845eafddb09e9a28b45b502abb544df1e286a324bsalomon@google.com        GrPrintf("---- glGetError 0x%x(%s)", err, get_error_string(err));
4327847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        if (NULL != location) {
4427847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com            GrPrintf(" at\n\t%s", location);
4527847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        }
4627847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        if (NULL != call) {
4727847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com            GrPrintf("\n\t\t%s", call);
4827847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        }
4927847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com        GrPrintf("\n");
5027847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com    }
5127847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com}
5227847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com
53960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.comnamespace {
54960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com// Mesa uses a non-standard version string of format: 1.4 Mesa <mesa_major>.<mesa_minor>.
55960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com// The mapping of from mesa version to GL version came from here: http://www.mesa3d.org/intro.html
56960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.combool get_gl_version_for_mesa(int mesaMajorVersion, int* major, int* minor) {
57960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    switch (mesaMajorVersion) {
58960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 2:
59960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 3:
60960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 4:
61960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 5:
62960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 6:
63960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *major = 1;
64960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *minor = mesaMajorVersion - 1;
65960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            return true;
66960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 7:
67960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *major = 2;
68960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *minor = 1;
69960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            return true;
70960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 8:
71960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *major = 3;
72960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *minor = 0;
73960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            return true;
74960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        case 9:
75960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *major = 3;
76960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            *minor = 1;
77960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            return true;
78566a3f1a1f5a47844664b510592ad60ada7d0635commit-bot@chromium.org        case 10:
79566a3f1a1f5a47844664b510592ad60ada7d0635commit-bot@chromium.org            *major = 3;
80566a3f1a1f5a47844664b510592ad60ada7d0635commit-bot@chromium.org            *minor = 3;
81566a3f1a1f5a47844664b510592ad60ada7d0635commit-bot@chromium.org            return true;
82960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        default:
83960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            return false;
84960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    }
85960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com}
86960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com}
87960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com
8827847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com///////////////////////////////////////////////////////////////////////////////
8927847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com
90d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com#if GR_GL_LOG_CALLS
91d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com    bool gLogCallsGL = !!(GR_GL_LOG_CALLS_START);
92d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com#endif
93d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com
94d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com#if GR_GL_CHECK_ERROR
95d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com    bool gCheckErrorGL = !!(GR_GL_CHECK_ERROR_START);
96d5d10494e34ee739eac45b2297b7bd61caae5109bsalomon@google.com#endif
9727847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com
989c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com///////////////////////////////////////////////////////////////////////////////
999c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1009e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.orgGrGLStandard GrGLGetStandardInUseFromString(const char* versionString) {
1019c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (NULL == versionString) {
102e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org        SkDebugf("NULL GL version string.");
1039e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org        return kNone_GrGLStandard;
1049c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1059c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1069c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    int major, minor;
1079c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1089c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    // check for desktop
1099c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    int n = sscanf(versionString, "%d.%d", &major, &minor);
1109c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
1119e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org        return kGL_GrGLStandard;
1129c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1139c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1149c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    // check for ES 1
1159c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    char profile[2];
116960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1, &major, &minor);
1179c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (4 == n) {
1189c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        // we no longer support ES1.
1199e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org        return kNone_GrGLStandard;
1209c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1219c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1229c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    // check for ES2
1239c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
1249c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
1259e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org        return kGLES_GrGLStandard;
1269c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1279e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org    return kNone_GrGLStandard;
1289c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com}
1299c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
130459104ceea00a08855099238563a06099340c2facommit-bot@chromium.orgbool GrGLIsMesaFromVersionString(const char* versionString) {
131459104ceea00a08855099238563a06099340c2facommit-bot@chromium.org    int major, minor, mesaMajor, mesaMinor;
132459104ceea00a08855099238563a06099340c2facommit-bot@chromium.org    int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
133459104ceea00a08855099238563a06099340c2facommit-bot@chromium.org    return 4 == n;
134459104ceea00a08855099238563a06099340c2facommit-bot@chromium.org}
135459104ceea00a08855099238563a06099340c2facommit-bot@chromium.org
136c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.orgbool GrGLIsChromiumFromRendererString(const char* rendererString) {
137c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org    return 0 == strcmp(rendererString, "Chromium");
138c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org}
139c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org
1409c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLVersion GrGLGetVersionFromString(const char* versionString) {
1419c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (NULL == versionString) {
142e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org        SkDebugf("NULL GL version string.");
143f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org        return GR_GL_INVALID_VER;
1449c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1459c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1469c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    int major, minor;
1479c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
148960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    // check for mesa
149960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    int mesaMajor, mesaMinor;
150960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
151960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    if (4 == n) {
152960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        if (get_gl_version_for_mesa(mesaMajor, &major, &minor)) {
153960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com            return GR_GL_VER(major, minor);
154960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        } else {
155f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org            return GR_GL_INVALID_VER;
156960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com        }
157960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    }
158960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com
159960d114777ae75da1eeb289aabd9e4638cdc7caabsalomon@google.com    n = sscanf(versionString, "%d.%d", &major, &minor);
1609c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
1619c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        return GR_GL_VER(major, minor);
1629c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1639c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1649c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    char profile[2];
1659c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
1669c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com               &major, &minor);
1679c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (4 == n) {
1689c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        return GR_GL_VER(major, minor);
1699c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
170fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1719c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
1729c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
1739c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        return GR_GL_VER(major, minor);
1749c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1759c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
176f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org    return GR_GL_INVALID_VER;
1779c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com}
1789c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1799c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
1809c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (NULL == versionString) {
181e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org        SkDebugf("NULL GLSL version string.");
182f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org        return GR_GLSL_INVALID_VER;
1839c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1849c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1859c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    int major, minor;
1869c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1879c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    int n = sscanf(versionString, "%d.%d", &major, &minor);
1889c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
1899c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        return GR_GLSL_VER(major, minor);
1909c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
191fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1929c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
1939c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
1949c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        return GR_GLSL_VER(major, minor);
1959c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
1969c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
1979c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#ifdef SK_BUILD_FOR_ANDROID
1989c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    // android hack until the gpu vender updates their drivers
1999c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
2009c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    if (2 == n) {
2019c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com        return GR_GLSL_VER(major, minor);
2029c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    }
2039c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#endif
2049c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
205f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org    return GR_GLSL_INVALID_VER;
2069c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com}
2079c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
2080b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.comGrGLVendor GrGLGetVendorFromString(const char* vendorString) {
2090b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com    if (NULL != vendorString) {
21096966a5a1ffc2f03eef1b5523308299aa4195f50bsalomon@google.com        if (0 == strcmp(vendorString, "ARM")) {
21196966a5a1ffc2f03eef1b5523308299aa4195f50bsalomon@google.com            return kARM_GrGLVendor;
21296966a5a1ffc2f03eef1b5523308299aa4195f50bsalomon@google.com        }
2133012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com        if (0 == strcmp(vendorString, "Imagination Technologies")) {
2143012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com            return kImagination_GrGLVendor;
2153012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com        }
21654318d3430a436771b922f551fe69290f6d5d977commit-bot@chromium.org        if (0 == strncmp(vendorString, "Intel ", 6) || 0 == strcmp(vendorString, "Intel")) {
2173012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com            return kIntel_GrGLVendor;
2183012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com        }
2197a434a28685fd045cf848b99b563dfcf978363bccommit-bot@chromium.org        if (0 == strcmp(vendorString, "Qualcomm")) {
2207a434a28685fd045cf848b99b563dfcf978363bccommit-bot@chromium.org            return kQualcomm_GrGLVendor;
2217a434a28685fd045cf848b99b563dfcf978363bccommit-bot@chromium.org        }
2220b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com    }
2230b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com    return kOther_GrGLVendor;
2240b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com}
2250b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com
2260694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.orgGrGLRenderer GrGLGetRendererFromString(const char* rendererString) {
2270694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org    if (NULL != rendererString) {
2280694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org        if (0 == strcmp(rendererString, "NVIDIA Tegra 3")) {
2290694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org            return kTegra3_GrGLRenderer;
2306dee8759ab8c90dcffd76f114eec333405fd176ecommit-bot@chromium.org        } else if (0 == strcmp(rendererString, "NVIDIA Tegra")) {
2316dee8759ab8c90dcffd76f114eec333405fd176ecommit-bot@chromium.org            return kTegra2_GrGLRenderer;
2320694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org        }
2330694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org    }
2340694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org    return kOther_GrGLRenderer;
2350694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org}
2360694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org
2379c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
2389c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    const GrGLubyte* v;
2399c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
2409c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    return GrGLGetVersionFromString((const char*) v);
2419c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com}
2429c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com
2439c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
2449c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    const GrGLubyte* v;
2459c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
2469c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com    return GrGLGetGLSLVersionFromString((const char*) v);
2479c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com}
2480b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com
2490b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.comGrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
2500b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com    const GrGLubyte* v;
2510b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com    GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
2520b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com    return GrGLGetVendorFromString((const char*) v);
2530b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com}
254215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
2550694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.orgGrGLRenderer GrGLGetRenderer(const GrGLInterface* gl) {
2560694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org    const GrGLubyte* v;
2570694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org    GR_GL_CALL_RET(gl, v, GetString(GR_GL_RENDERER));
2580694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org    return GrGLGetRendererFromString((const char*) v);
2590694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org}
2600694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org
261215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.orgtemplate<> void GrGLGetMatrix<3>(GrGLfloat* dest, const SkMatrix& src) {
262215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 0
263215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[0] = SkScalarToFloat(src[SkMatrix::kMScaleX]);
264215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[1] = SkScalarToFloat(src[SkMatrix::kMSkewY]);
265215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[2] = SkScalarToFloat(src[SkMatrix::kMPersp0]);
266215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
267215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 1
268215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[3] = SkScalarToFloat(src[SkMatrix::kMSkewX]);
269215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[4] = SkScalarToFloat(src[SkMatrix::kMScaleY]);
270215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[5] = SkScalarToFloat(src[SkMatrix::kMPersp1]);
271215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
272215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 2
273215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[6] = SkScalarToFloat(src[SkMatrix::kMTransX]);
274215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[7] = SkScalarToFloat(src[SkMatrix::kMTransY]);
275215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[8] = SkScalarToFloat(src[SkMatrix::kMPersp2]);
276215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org}
277215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
278215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.orgtemplate<> void GrGLGetMatrix<4>(GrGLfloat* dest, const SkMatrix& src) {
279215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 0
280215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[0]  = SkScalarToFloat(src[SkMatrix::kMScaleX]);
281215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[1]  = SkScalarToFloat(src[SkMatrix::kMSkewY]);
282215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[2]  = 0;
283215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[3]  = SkScalarToFloat(src[SkMatrix::kMPersp0]);
284215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
285215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 1
286215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[4]  = SkScalarToFloat(src[SkMatrix::kMSkewX]);
287215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[5]  = SkScalarToFloat(src[SkMatrix::kMScaleY]);
288215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[6]  = 0;
289215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[7]  = SkScalarToFloat(src[SkMatrix::kMPersp1]);
290215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
291215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 2
292215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[8]  = 0;
293215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[9]  = 0;
294215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[10] = 1;
295215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[11] = 0;
296215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org
297215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    // Col 3
298215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[12] = SkScalarToFloat(src[SkMatrix::kMTransX]);
299215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[13] = SkScalarToFloat(src[SkMatrix::kMTransY]);
300215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[14] = 0;
301215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org    dest[15] = SkScalarToFloat(src[SkMatrix::kMPersp2]);
302215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org}
303