Home | History | Annotate | Download | only in gl
      1 /*
      2  * Copyright 2011 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 
      9 #include "GrGLUtil.h"
     10 
     11 
     12 void GrGLClearErr(const GrGLInterface* gl) {
     13     while (GR_GL_NO_ERROR != gl->fGetError()) {}
     14 }
     15 
     16 namespace {
     17 const char *get_error_string(uint32_t err) {
     18     switch (err) {
     19     case GR_GL_NO_ERROR:
     20         return "";
     21     case GR_GL_INVALID_ENUM:
     22         return "Invalid Enum";
     23     case GR_GL_INVALID_VALUE:
     24         return "Invalid Value";
     25     case GR_GL_INVALID_OPERATION:
     26         return "Invalid Operation";
     27     case GR_GL_OUT_OF_MEMORY:
     28         return "Out of Memory";
     29     case GR_GL_CONTEXT_LOST:
     30         return "Context Lost";
     31     }
     32     return "Unknown";
     33 }
     34 }
     35 
     36 void GrGLCheckErr(const GrGLInterface* gl,
     37                   const char* location,
     38                   const char* call) {
     39     uint32_t err = GR_GL_GET_ERROR(gl);
     40     if (GR_GL_NO_ERROR != err) {
     41         GrPrintf("---- glGetError 0x%x(%s)", err, get_error_string(err));
     42         if (NULL != location) {
     43             GrPrintf(" at\n\t%s", location);
     44         }
     45         if (NULL != call) {
     46             GrPrintf("\n\t\t%s", call);
     47         }
     48         GrPrintf("\n");
     49     }
     50 }
     51 
     52 ///////////////////////////////////////////////////////////////////////////////
     53 
     54 #if GR_GL_LOG_CALLS
     55     bool gLogCallsGL = !!(GR_GL_LOG_CALLS_START);
     56 #endif
     57 
     58 #if GR_GL_CHECK_ERROR
     59     bool gCheckErrorGL = !!(GR_GL_CHECK_ERROR_START);
     60 #endif
     61 
     62 ///////////////////////////////////////////////////////////////////////////////
     63 
     64 GrGLBinding GrGLGetBindingInUseFromString(const char* versionString) {
     65     if (NULL == versionString) {
     66         GrAssert(!"NULL GL version string.");
     67         return kNone_GrGLBinding;
     68     }
     69 
     70     int major, minor;
     71 
     72     // check for desktop
     73     int n = sscanf(versionString, "%d.%d", &major, &minor);
     74     if (2 == n) {
     75         return kDesktop_GrGLBinding;
     76     }
     77 
     78     // check for ES 1
     79     char profile[2];
     80     n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
     81                &major, &minor);
     82     if (4 == n) {
     83         // we no longer support ES1.
     84         return kNone_GrGLBinding;
     85     }
     86 
     87     // check for ES2
     88     n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
     89     if (2 == n) {
     90         return kES2_GrGLBinding;
     91     }
     92     return kNone_GrGLBinding;
     93 }
     94 
     95 GrGLVersion GrGLGetVersionFromString(const char* versionString) {
     96     if (NULL == versionString) {
     97         GrAssert(!"NULL GL version string.");
     98         return 0;
     99     }
    100 
    101     int major, minor;
    102 
    103     int n = sscanf(versionString, "%d.%d", &major, &minor);
    104     if (2 == n) {
    105         return GR_GL_VER(major, minor);
    106     }
    107 
    108     char profile[2];
    109     n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
    110                &major, &minor);
    111     if (4 == n) {
    112         return GR_GL_VER(major, minor);
    113     }
    114 
    115     n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
    116     if (2 == n) {
    117         return GR_GL_VER(major, minor);
    118     }
    119 
    120     return 0;
    121 }
    122 
    123 GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
    124     if (NULL == versionString) {
    125         GrAssert(!"NULL GLSL version string.");
    126         return 0;
    127     }
    128 
    129     int major, minor;
    130 
    131     int n = sscanf(versionString, "%d.%d", &major, &minor);
    132     if (2 == n) {
    133         return GR_GLSL_VER(major, minor);
    134     }
    135 
    136     n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
    137     if (2 == n) {
    138         return GR_GLSL_VER(major, minor);
    139     }
    140 
    141 #ifdef SK_BUILD_FOR_ANDROID
    142     // android hack until the gpu vender updates their drivers
    143     n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
    144     if (2 == n) {
    145         return GR_GLSL_VER(major, minor);
    146     }
    147 #endif
    148 
    149     return 0;
    150 }
    151 
    152 bool GrGLHasExtensionFromString(const char* ext, const char* extensionString) {
    153     int extLength = strlen(ext);
    154 
    155     while (true) {
    156         int n = strcspn(extensionString, " ");
    157         if (n == extLength && 0 == strncmp(ext, extensionString, n)) {
    158             return true;
    159         }
    160         if (0 == extensionString[n]) {
    161             return false;
    162         }
    163         extensionString += n+1;
    164     }
    165 
    166     return false;
    167 }
    168 
    169 GrGLVendor GrGLGetVendorFromString(const char* vendorString) {
    170     if (NULL != vendorString) {
    171         if (0 == strcmp(vendorString, "Intel")) {
    172             return kIntel_GrGLVendor;
    173         }
    174     }
    175 
    176     return kOther_GrGLVendor;
    177 }
    178 
    179 bool GrGLHasExtension(const GrGLInterface* gl, const char* ext) {
    180     const GrGLubyte* glstr;
    181     GR_GL_CALL_RET(gl, glstr, GetString(GR_GL_EXTENSIONS));
    182     return GrGLHasExtensionFromString(ext, (const char*) glstr);
    183 }
    184 
    185 GrGLBinding GrGLGetBindingInUse(const GrGLInterface* gl) {
    186     const GrGLubyte* v;
    187     GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
    188     return GrGLGetBindingInUseFromString((const char*) v);
    189 }
    190 
    191 GrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
    192     const GrGLubyte* v;
    193     GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
    194     return GrGLGetVersionFromString((const char*) v);
    195 }
    196 
    197 GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
    198     const GrGLubyte* v;
    199     GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
    200     return GrGLGetGLSLVersionFromString((const char*) v);
    201 }
    202 
    203 GrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
    204     const GrGLubyte* v;
    205     GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
    206     return GrGLGetVendorFromString((const char*) v);
    207 }
    208