Bug fix for es 3.00 fb fetch

patch for es 300 shader fb fetch

BUG=skia:

Review URL: https://codereview.chromium.org/665893008
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index b4cfad3..ee87a39 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -7,6 +7,7 @@
 
 
 #include "GrGLCaps.h"
+
 #include "GrGLContext.h"
 #include "SkTSearch.h"
 #include "SkTSort.h"
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index eb56798..f840193 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -168,7 +168,7 @@
     /**
      * Some helper functions for encapsulating various extensions to read FB Buffer on openglES
      *
-     * TODO On desktop opengl 4.2+ we can achieve something similar to this effect
+     * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect
      */
     bool fbFetchSupport() const { return fFBFetchSupport; }
 
@@ -367,6 +367,7 @@
     bool fIsCoreProfile : 1;
     bool fFullClearIsFree : 1;
     bool fDropsTileOnZeroDivide : 1;
+    // TODO(joshualitt) encapsulate the FB Fetch logic in a feature object
     bool fFBFetchSupport : 1;
 
     const char* fFBFetchColorName;
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
index 5d5741e..76558d8 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
@@ -75,6 +75,7 @@
     , fHasSecondaryOutput(false)
     , fSetupFragPosition(false)
     , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey)
+    , fCustomColorOutputIndex(-1)
     , fHasReadDstColor(false)
     , fHasReadFragmentPosition(false) {
 }
@@ -172,7 +173,15 @@
     if (gpu->glCaps().fbFetchSupport()) {
         this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeature + 1),
                          gpu->glCaps().fbFetchExtensionString());
-        return gpu->glCaps().fbFetchColorName();
+
+        // On ES 3.0 we have to declare this, and use the custom color output name
+        const char* fbFetchColorName = gpu->glCaps().fbFetchColorName();
+        if (gpu->glslGeneration() >= k330_GrGLSLGeneration) {
+            this->enableCustomOutput();
+            fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOut_TypeModifier);
+            fbFetchColorName = declared_color_output_name();
+        }
+        return fbFetchColorName;
     } else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) {
         return kDstCopyColorName;
     } else {
@@ -223,11 +232,13 @@
 }
 
 void GrGLFragmentShaderBuilder::enableCustomOutput() {
-    SkASSERT(!fHasCustomColorOutput);
-    fHasCustomColorOutput = true;
-    fOutputs.push_back().set(kVec4f_GrSLType,
-                             GrGLShaderVar::kOut_TypeModifier,
-                             declared_color_output_name());
+    if (!fHasCustomColorOutput) {
+        fHasCustomColorOutput = true;
+        fCustomColorOutputIndex = fOutputs.count();
+        fOutputs.push_back().set(kVec4f_GrSLType,
+                                 GrGLShaderVar::kOut_TypeModifier,
+                                 declared_color_output_name());
+    }
 }
 
 void GrGLFragmentShaderBuilder::enableSecondaryOutput() {
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
index fdf685c..1637d25 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
@@ -149,6 +149,7 @@
     bool fHasSecondaryOutput;
     bool fSetupFragPosition;
     bool fTopLeftFragPosRead;
+    int  fCustomColorOutputIndex;
 
     // some state to verify shaders and effects are consistent, this is reset between effects by
     // the program creator