Factory method for creating GrGLProgram

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



git-svn-id: http://skia.googlecode.com/svn/trunk@4646 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp
index 7f982e7..56a893d 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -20,13 +20,12 @@
     , fGL(gl) {
 }
 
-GrGpuGL::ProgramCache::~ProgramCache() {
-    for (int i = 0; i < fCount; ++i) {
-        GrGpuGL::DeleteProgram(fGL.interface(), fEntries[i].fProgram);
-    }
-}
-
 void GrGpuGL::ProgramCache::abandon() {
+    for (int i = 0; i < fCount; ++i) {
+        GrAssert(NULL != fEntries[i].fProgram.get());
+        fEntries[i].fProgram->abandon();
+        fEntries[i].fProgram.reset(NULL);
+    }
     fCount = 0;
 }
 
@@ -36,8 +35,8 @@
 
     Entry* entry = fHashCache.find(newEntry.fKey);
     if (NULL == entry) {
-        newEntry.fProgram.reset(SkNEW(GrGLProgram));
-        if (!newEntry.fProgram->genProgram(fGL, desc, stages)) {
+        newEntry.fProgram.reset(GrGLProgram::Create(fGL, desc, stages));
+        if (NULL == newEntry.fProgram.get()) {
             return NULL;
         }
         if (fCount < kMaxEntries) {
@@ -52,7 +51,6 @@
                 }
             }
             fHashCache.remove(entry->fKey, entry);
-            GrGpuGL::DeleteProgram(fGL.interface(), entry->fProgram);
         }
         *entry = newEntry;
         fHashCache.insert(entry->fKey, entry);
@@ -69,19 +67,6 @@
     return entry->fProgram;
 }
 
-void GrGpuGL::DeleteProgram(const GrGLInterface* gl, GrGLProgram* program) {
-    GR_GL_CALL(gl, DeleteShader(program->fVShaderID));
-    if (program->fGShaderID) {
-        GR_GL_CALL(gl, DeleteShader(program->fGShaderID));
-    }
-    GR_GL_CALL(gl, DeleteShader(program->fFShaderID));
-    GR_GL_CALL(gl, DeleteProgram(program->fProgramID));
-    GR_DEBUGCODE(program->fVShaderID = 0);
-    GR_DEBUGCODE(program->fGShaderID = 0);
-    GR_DEBUGCODE(program->fFShaderID = 0);
-    GR_DEBUGCODE(program->fProgramID = 0);
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 
 void GrGpuGL::abandonResources(){