Resubmit 2289 with fix for glsl version



git-svn-id: http://skia.googlecode.com/svn/trunk@2291 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp
index a9a3953..28a6e07 100644
--- a/gpu/src/GrGpuGLShaders.cpp
+++ b/gpu/src/GrGpuGLShaders.cpp
@@ -51,15 +51,19 @@
     enum {
         kMaxEntries = 32
     };
-    Entry                 fEntries[kMaxEntries];
-    int                   fCount;
-    unsigned int          fCurrLRUStamp;
-    const GrGLInterface*  fGL;
+    Entry                       fEntries[kMaxEntries];
+    int                         fCount;
+    unsigned int                fCurrLRUStamp;
+    const GrGLInterface*        fGL;
+    GrGLProgram::GLSLVersion    fGLSLVersion;
+
 public:
-    ProgramCache(const GrGLInterface* gl) 
+    ProgramCache(const GrGLInterface* gl,
+                 GrGLProgram::GLSLVersion glslVersion) 
         : fCount(0)
         , fCurrLRUStamp(0)
-        , fGL(gl) {
+        , fGL(gl)
+        , fGLSLVersion(glslVersion) {
     }
 
     ~ProgramCache() {
@@ -85,7 +89,7 @@
         
         Entry* entry = fHashCache.find(newEntry.fKey);
         if (NULL == entry) {
-            if (!desc.genProgram(fGL, &newEntry.fProgramData)) {
+            if (!desc.genProgram(fGL, fGLSLVersion, &newEntry.fProgramData)) {
                 return NULL;
             }
             if (fCount < kMaxEntries) {
@@ -136,14 +140,33 @@
 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
 
 namespace {
-    template <typename T>
-    T random_val(GrRandom* r, T count) {
-        return (T)(int)(r->nextF() * count);
+
+GrGLProgram::GLSLVersion get_glsl_version(GrGLBinding binding, float glVersion) {
+    switch (binding) {
+        case kDesktop_GrGLBinding:
+            // TODO: proper check of the glsl version string
+            return (glVersion >= 3.0) ? GrGLProgram::k130_GLSLVersion :
+                                        GrGLProgram::k120_GLSLVersion;
+        case kES2_GrGLBinding:
+            return GrGLProgram::k120_GLSLVersion;
+        default:
+            GrCrash("Attempting to get GLSL version in unknown or fixed-"
+                     "function GL binding.");
+            return GrGLProgram::k120_GLSLVersion; // suppress warning
     }
-};
+}
+
+template <typename T>
+T random_val(GrRandom* r, T count) {
+    return (T)(int)(r->nextF() * count);
+}
+
+}
 
 bool GrGpuGLShaders::programUnitTest() {
 
+    GrGLProgram::GLSLVersion glslVersion = 
+            get_glsl_version(this->glBinding(), this->glVersion());
     static const int STAGE_OPTS[] = {
         0,
         StageDesc::kNoPerspective_OptFlagBit,
@@ -242,15 +265,12 @@
             stage.fKernelWidth = 4 * random.nextF() + 2;
         }
         CachedData cachedData;
-        if (!program.genProgram(this->glInterface(), &cachedData)) {
+        if (!program.genProgram(this->glInterface(),
+                                glslVersion,
+                                &cachedData)) {
             return false;
         }
         DeleteProgram(this->glInterface(), &cachedData);
-        bool again = false;
-        if (again) {
-            program.genProgram(this->glInterface(), &cachedData);
-            DeleteProgram(this->glInterface(), &cachedData);
-        }
     }
     return true;
 }
@@ -272,7 +292,8 @@
     fShaderSupport = true;
     if (kDesktop_GrGLBinding == this->glBinding()) {
         fDualSourceBlendingSupport =
-                            fGLVersion >= 3.3f ||
+                            this->glVersion() >= 3.25f || // TODO: when resolving Issue 387 change 
+                                                          // this back to 3.3
                             this->hasExtension("GL_ARB_blend_func_extended");
         fShaderDerivativeSupport = true;
     } else {
@@ -282,7 +303,9 @@
     }
 
     fProgramData = NULL;
-    fProgramCache = new ProgramCache(gl);
+    GrGLProgram::GLSLVersion glslVersion =
+        get_glsl_version(this->glBinding(), this->glVersion());
+    fProgramCache = new ProgramCache(gl, glslVersion);
 
 #if 0
     this->programUnitTest();