Support GLSL es 3.00
authorjoshualitt <joshualitt@chromium.org>
Thu, 16 Oct 2014 19:25:11 +0000 (12:25 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 16 Oct 2014 19:25:11 +0000 (12:25 -0700)
BUG=skia:

Review URL: https://codereview.chromium.org/659443007

src/gpu/gl/GrGLCaps.cpp
src/gpu/gl/GrGLContext.cpp
src/gpu/gl/GrGLSL.cpp
src/gpu/gl/GrGLSL.h
src/gpu/gl/GrGLShaderVar.h
src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp

index 2fe3847..b4cfad3 100644 (file)
@@ -199,9 +199,10 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) {
     // can change based on which render target is bound
     fTwoFormatLimit = kGLES_GrGLStandard == standard;
 
+    // Frag Coords Convention support is not part of ES
     // Known issue on at least some Intel platforms:
     // http://code.google.com/p/skia/issues/detail?id=946
-    if (kIntel_GrGLVendor != ctxInfo.vendor()) {
+    if (kIntel_GrGLVendor != ctxInfo.vendor() && kGLES_GrGLStandard != standard) {
         fFragCoordsConventionSupport = ctxInfo.glslGeneration() >= k150_GrGLSLGeneration ||
                                        ctxInfo.hasExtension("GL_ARB_fragment_coord_conventions");
     }
@@ -368,7 +369,8 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) {
         fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3,2) &&
                                  ctxInfo.glslGeneration() >= k150_GrGLSLGeneration;
     } else {
-        fShaderDerivativeSupport = ctxInfo.hasExtension("GL_OES_standard_derivatives");
+        fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) ||
+                                   ctxInfo.hasExtension("GL_OES_standard_derivatives");
     }
 
     if (GrGLCaps::kES_IMG_MsToTexture_MSFBOType == fMSFBOType) {
index 5373634..fc8b195 100644 (file)
@@ -47,6 +47,16 @@ bool GrGLContextInfo::initialize(const GrGLInterface* interface) {
 
             fVendor = GrGLGetVendor(interface);
 
+            /*
+             * Qualcomm drivers have a horrendous bug with some drivers. Though they claim to
+             * support GLES 3.00, some perfectly valid GLSL300 shaders will only compile with
+             * #version 100, and will fail to compile with #version 300 es.  In the long term, we
+             * need to lock this down to a specific driver version.
+             */
+            if (kQualcomm_GrGLVendor == fVendor) {
+                fGLSLGeneration = k110_GrGLSLGeneration;
+            }
+
             fRenderer = GrGLGetRendererFromString(renderer);
 
             fIsMesa = GrGLIsMesaFromVersionString(ver);
index 866a0d1..34c805e 100644 (file)
@@ -18,7 +18,9 @@ bool GrGetGLSLGeneration(const GrGLInterface* gl, GrGLSLGeneration* generation)
     switch (gl->fStandard) {
         case kGL_GrGLStandard:
             SkASSERT(ver >= GR_GLSL_VER(1,10));
-            if (ver >= GR_GLSL_VER(1,50)) {
+            if (ver >= GR_GLSL_VER(3,30)) {
+                *generation = k330_GrGLSLGeneration;
+            } else if (ver >= GR_GLSL_VER(1,50)) {
                 *generation = k150_GrGLSLGeneration;
             } else if (ver >= GR_GLSL_VER(1,40)) {
                 *generation = k140_GrGLSLGeneration;
@@ -29,9 +31,15 @@ bool GrGetGLSLGeneration(const GrGLInterface* gl, GrGLSLGeneration* generation)
             }
             return true;
         case kGLES_GrGLStandard:
-            // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL
             SkASSERT(ver >= GR_GL_VER(1,00));
-            *generation = k110_GrGLSLGeneration;
+            if (ver >= GR_GLSL_VER(3,1)) {
+                *generation = k310es_GrGLSLGeneration;
+            }
+            else if (ver >= GR_GLSL_VER(3,0)) {
+                *generation = k330_GrGLSLGeneration;
+            } else {
+                *generation = k110_GrGLSLGeneration;
+            }
             return true;
         default:
             SkFAIL("Unknown GL Standard");
@@ -63,6 +71,16 @@ const char* GrGetGLSLVersionDecl(const GrGLContextInfo& info) {
             } else {
                 return "#version 150 compatibility\n";
             }
+        case k330_GrGLSLGeneration:
+            if (kGLES_GrGLStandard == info.standard()) {
+                return "#version 300 es\n";
+            } else {
+                SkASSERT(kGL_GrGLStandard == info.standard());
+                return "#version 330 compatibility\n";
+            }
+        case k310es_GrGLSLGeneration:
+            SkASSERT(kGLES_GrGLStandard == info.standard());
+            return "#version 310 es\n";
         default:
             SkFAIL("Unknown GL version.");
             return ""; // suppress warning
index 3cbce9c..b031a40 100644 (file)
@@ -35,6 +35,14 @@ enum GrGLSLGeneration {
      * Desktop GLSL 1.50
      */
     k150_GrGLSLGeneration,
+    /**
+     * Desktop GLSL 3.30, and ES GLSL 3.00
+     */
+    k330_GrGLSLGeneration,
+    /**
+     * ES GLSL 3.10 only TODO Make GLSLCap objects to make this more granular
+     */
+    k310es_GrGLSLGeneration,
 };
 
 /**
index 8e7e36e..c7514f5 100644 (file)
@@ -159,8 +159,7 @@ public:
             out->append("layout(origin_upper_left) ");
         }
         if (this->getTypeModifier() != kNone_TypeModifier) {
-           out->append(TypeModifierString(this->getTypeModifier(),
-                                          ctxInfo.glslGeneration()));
+           out->append(TypeModifierString(this->getTypeModifier(), ctxInfo.glslGeneration()));
            out->append(" ");
         }
         out->append(PrecisionString(fPrecision, ctxInfo.standard()));
index 488d07b..5d5741e 100644 (file)
@@ -42,8 +42,7 @@ static void append_default_precision_qualifier(GrGLShaderVar::Precision p,
 }
 
 GrGLFragmentShaderBuilder::DstReadKey
-GrGLFragmentShaderBuilder::KeyForDstRead(const GrTexture* dstCopy,
-                                                                 const GrGLCaps& caps) {
+GrGLFragmentShaderBuilder::KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps& caps) {
     uint32_t key = kYesDstRead_DstReadKeyBit;
     if (caps.fbFetchSupport()) {
         return key;
@@ -61,8 +60,7 @@ GrGLFragmentShaderBuilder::KeyForDstRead(const GrTexture* dstCopy,
 }
 
 GrGLFragmentShaderBuilder::FragPosKey
-GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst,
-                                                                          const GrGLCaps&) {
+GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst, const GrGLCaps&) {
     if (kTopLeft_GrSurfaceOrigin == dst->origin()) {
         return kTopLeftFragPosRead_FragPosKey;
     } else {
@@ -88,7 +86,8 @@ bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) {
             if (!gpu->glCaps().shaderDerivativeSupport()) {
                 return false;
             }
-            if (kGLES_GrGLStandard == gpu->glStandard()) {
+            if (kGLES_GrGLStandard == gpu->glStandard() &&
+                k110_GrGLSLGeneration == gpu->glslGeneration()) {
                 this->addFeature(1 << kStandardDerivatives_GLSLFeature,
                                  "GL_OES_standard_derivatives");
             }
@@ -326,7 +325,9 @@ bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId,
 }
 
 void GrGLFragmentShaderBuilder::bindFragmentShaderLocations(GrGLuint programID) {
-    if (fHasCustomColorOutput) {
+    // ES 3.00 requires custom color output but doesn't support bindFragDataLocation
+    if (fHasCustomColorOutput &&
+        kGLES_GrGLStandard != fProgramBuilder->gpu()->ctxInfo().standard()) {
         GL_CALL(BindFragDataLocation(programID, 0, declared_color_output_name()));
     }
     if (fHasSecondaryOutput) {