Home | History | Annotate | Download | only in gl
      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 #include "GrGLGLSL.h"
     10 
     11 ////////////////////////////////////////////////////////////////////////////////
     12 
     13 GrGLContext* GrGLContext::Create(const GrGLInterface* interface, const GrContextOptions& options) {
     14     // We haven't validated the GrGLInterface yet, so check for GetString function pointer
     15     if (!interface->fFunctions.fGetString) {
     16         return nullptr;
     17     }
     18     ConstructorArgs args;
     19     args.fInterface = interface;
     20 
     21     const GrGLubyte* verUByte;
     22     GR_GL_CALL_RET(interface, verUByte, GetString(GR_GL_VERSION));
     23     const char* ver = reinterpret_cast<const char*>(verUByte);
     24 
     25     const GrGLubyte* rendererUByte;
     26     GR_GL_CALL_RET(interface, rendererUByte, GetString(GR_GL_RENDERER));
     27     const char* renderer = reinterpret_cast<const char*>(rendererUByte);
     28 
     29     if (!interface->validate()) {
     30         return nullptr;
     31     }
     32 
     33     args.fGLVersion = GrGLGetVersionFromString(ver);
     34     if (GR_GL_INVALID_VER == args.fGLVersion) {
     35         return nullptr;
     36     }
     37 
     38     if (!GrGLGetGLSLGeneration(interface, &args.fGLSLGeneration)) {
     39         return nullptr;
     40     }
     41 
     42     args.fVendor = GrGLGetVendor(interface);
     43 
     44     args.fRenderer = GrGLGetRendererFromString(renderer);
     45 
     46     /*
     47      * Qualcomm drivers for the 3xx series have a horrendous bug with some drivers. Though they
     48      * claim to support GLES 3.00, some perfectly valid GLSL300 shaders will only compile with
     49      * #version 100, and will fail to compile with #version 300 es.  In the long term, we
     50      * need to lock this down to a specific driver version.
     51      * ?????/2015 - This bug is still present in Lollipop pre-mr1
     52      * 06/18/2015 - This bug does not affect the nexus 6 (which has an Adreno 4xx).
     53      */
     54     if (kAdreno3xx_GrGLRenderer == args.fRenderer) {
     55         args.fGLSLGeneration = k110_GrGLSLGeneration;
     56     }
     57 
     58     GrGLGetDriverInfo(interface->fStandard, args.fVendor, renderer, ver,
     59                       &args.fDriver, &args.fDriverVersion);
     60 
     61     args.fContextOptions = &options;
     62 
     63     return new GrGLContext(args);
     64 }
     65 
     66 GrGLContextInfo::GrGLContextInfo(const ConstructorArgs& args) {
     67     fInterface.reset(SkRef(args.fInterface));
     68     fGLVersion = args.fGLVersion;
     69     fGLSLGeneration = args.fGLSLGeneration;
     70     fVendor = args.fVendor;
     71     fRenderer = args.fRenderer;
     72     fDriver = args.fDriver;
     73     fDriverVersion = args.fDriverVersion;
     74 
     75     fGLCaps.reset(new GrGLCaps(*args.fContextOptions, *this, fInterface));
     76 }
     77