When GL_RGBA readPixels are slow do swizzle using a draw then readPixels with GL_BGRA

Review URL: http://codereview.appspot.com/5339051/


git-svn-id: http://skia.googlecode.com/svn/trunk@2631 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrGLProgram.cpp b/src/gpu/GrGLProgram.cpp
index 89ced68..93303ca 100644
--- a/src/gpu/GrGLProgram.cpp
+++ b/src/gpu/GrGLProgram.cpp
@@ -1460,7 +1460,7 @@
               GrStringBuilder* sampleCoords,
               const char* samplerName,
               const char* texelSizeName,
-              const char* smear,
+              const char* swizzle,
               const char* fsOutColor,
               GrStringBuilder& texFunc,
               GrStringBuilder& modulate,
@@ -1479,10 +1479,10 @@
     GrAssert(2 == coordDims);
     GrStringBuilder accumVar("accum");
     accumVar.appendS32(stageNum);
-    segments->fFSCode.appendf("\tvec4 %s  = %s(%s, %s + vec2(-%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, smear);
-    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, smear);
-    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(-%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, smear);
-    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, smear);
+    segments->fFSCode.appendf("\tvec4 %s  = %s(%s, %s + vec2(-%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, swizzle);
+    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, swizzle);
+    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(-%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, swizzle);
+    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, swizzle);
     segments->fFSCode.appendf("\t%s = .25 * %s%s;\n", fsOutColor, accumVar.c_str(), modulate.c_str());
 
 }
@@ -1522,7 +1522,7 @@
                       ShaderCodeSegments* segments,
                       const char* samplerName,
                       const char* kernelName,
-                      const char* smear,
+                      const char* swizzle,
                       const char* imageIncrementName,
                       const char* fsOutColor,
                       GrStringBuilder& sampleCoords,
@@ -1542,7 +1542,7 @@
                               desc.fKernelWidth);
     segments->fFSCode.appendf("\t\t%s += %s(%s, %s)%s * %s[i];\n",
                               sumVar.c_str(), texFunc.c_str(),
-                              samplerName, coordVar.c_str(), smear,
+                              samplerName, coordVar.c_str(), swizzle,
                               kernelName);
     segments->fFSCode.appendf("\t\t%s += %s;\n",
                               coordVar.c_str(),
@@ -1708,12 +1708,19 @@
 
     };
 
-    const char* smear;
-    if (desc.fInputConfig == StageDesc::kAlphaOnly_InputConfig) {
-        smear = ".aaaa";
-    } else {
-        smear = "";
+    const char* swizzle;
+    switch (desc.fSwizzle) {
+        case StageDesc::kAlphaSmear_Swizzle:
+            swizzle = ".aaaa";
+            break;
+        case StageDesc::kSwapRAndB_Swizzle:
+            swizzle = ".bgra";
+            break;
+        case StageDesc::kNone_Swizzle:
+            swizzle = "";
+            break;
     }
+
     GrStringBuilder modulate;
     if (NULL != fsInColor) {
         modulate.printf(" * %s", fsInColor);
@@ -1738,19 +1745,19 @@
     switch (desc.fFetchMode) {
     case StageDesc::k2x2_FetchMode:
         gen2x2FS(stageNum, segments, locations, &sampleCoords,
-            samplerName, texelSizeName, smear, fsOutColor,
+            samplerName, texelSizeName, swizzle, fsOutColor,
             texFunc, modulate, complexCoord, coordDims);
         break;
     case StageDesc::kConvolution_FetchMode:
         genConvolutionFS(stageNum, desc, segments,
-            samplerName, kernelName, smear, imageIncrementName, fsOutColor,
+            samplerName, kernelName, swizzle, imageIncrementName, fsOutColor,
             sampleCoords, texFunc, modulate);
         break;
     default:
         segments->fFSCode.appendf("\t%s = %s(%s, %s)%s%s;\n",
                                   fsOutColor, texFunc.c_str(), 
                                   samplerName, sampleCoords.c_str(),
-                                  smear, modulate.c_str());
+                                  swizzle, modulate.c_str());
     }
 }