Add glDrawBuffer(s) to GrGLInterface

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



git-svn-id: http://skia.googlecode.com/svn/trunk@2032 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/include/GrGLInterface.h b/gpu/include/GrGLInterface.h
index 05eb243..63ebca5 100644
--- a/gpu/include/GrGLInterface.h
+++ b/gpu/include/GrGLInterface.h
@@ -111,6 +111,8 @@
     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDisableClientStateProc)(GrGLenum array);
     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDisableVertexAttribArrayProc)(GrGLuint index);
     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawArraysProc)(GrGLenum mode, GrGLint first, GrGLsizei count);
+    typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawBufferProc)(GrGLenum mode);
+    typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawBuffersProc)(GrGLsizei n, const GrGLenum* bufs);
     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLDrawElementsProc)(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices);
     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLEnableProc)(GrGLenum cap);
     typedef GrGLvoid (GR_GL_FUNCTION_TYPE *GrGLEnableClientStateProc)(GrGLenum cap);
@@ -264,6 +266,8 @@
     GrGLDisableClientStateProc fDisableClientState;
     GrGLDisableVertexAttribArrayProc fDisableVertexAttribArray;
     GrGLDrawArraysProc fDrawArrays;
+    GrGLDrawBufferProc fDrawBuffer;
+    GrGLDrawBuffersProc fDrawBuffers;
     GrGLDrawElementsProc fDrawElements;
     GrGLEnableProc fEnable;
     GrGLEnableClientStateProc fEnableClientState;
diff --git a/gpu/src/GrGLInterface.cpp b/gpu/src/GrGLInterface.cpp
index 8a43f92..9822dcb 100644
--- a/gpu/src/GrGLInterface.cpp
+++ b/gpu/src/GrGLInterface.cpp
@@ -286,6 +286,12 @@
                 return false;
             }
         }
+        if (major >= 2 ||
+            has_gl_extension_from_string("GL_ARB_draw_buffers", ext)) {
+            if (NULL == fDrawBuffers) {
+                return false;
+            }
+        }
         if (1 < major || (1 == major && 4 <= minor) ||
             has_gl_extension_from_string("GL_EXT_blend_color", ext)) {
             if (NULL == fBlendColor) {
@@ -303,10 +309,11 @@
         }
     }
 
-    // part of desktop GL
+    // part of desktop GL, but not ES
     if (kDesktop_GrGLBinding == fBindingsExported &&
         (NULL == fLineWidth ||
-         NULL == fGetTexLevelParameteriv)) {
+         NULL == fGetTexLevelParameteriv ||
+         NULL == fDrawBuffer)) {
         return false;
     }
 
diff --git a/gpu/src/android/GrGLDefaultInterface_android.cpp b/gpu/src/android/GrGLDefaultInterface_android.cpp
index dfb9041..b402176 100644
--- a/gpu/src/android/GrGLDefaultInterface_android.cpp
+++ b/gpu/src/android/GrGLDefaultInterface_android.cpp
@@ -52,6 +52,8 @@
     NULL,  // glDisableClientState
     glDisableVertexAttribArray,
     glDrawArrays,
+    NULL, // glDrawBuffer
+    NULL, // glDrawBuffers
     glDrawElements,
     glEnable,
     NULL,  // glEnableClientState
diff --git a/gpu/src/mac/GrGLDefaultInterface_mac.cpp b/gpu/src/mac/GrGLDefaultInterface_mac.cpp
index 47d45be..16d2938 100644
--- a/gpu/src/mac/GrGLDefaultInterface_mac.cpp
+++ b/gpu/src/mac/GrGLDefaultInterface_mac.cpp
@@ -51,6 +51,8 @@
         gDefaultInterface.fDisableVertexAttribArray = 
                                             glDisableVertexAttribArray;
         gDefaultInterface.fDrawArrays = glDrawArrays;
+        gDefaultInterface.fDrawBuffer = glDrawBuffer;
+        gDefaultInterface.fDrawBuffers = glDrawBuffers;
         gDefaultInterface.fDrawElements = glDrawElements;
         gDefaultInterface.fEnable = glEnable;
         gDefaultInterface.fEnableClientState = glEnableClientState;
diff --git a/gpu/src/mesa/GrGLDefaultInterface_mesa.cpp b/gpu/src/mesa/GrGLDefaultInterface_mesa.cpp
index e03c44e..56f2cf7 100644
--- a/gpu/src/mesa/GrGLDefaultInterface_mesa.cpp
+++ b/gpu/src/mesa/GrGLDefaultInterface_mesa.cpp
@@ -65,6 +65,8 @@
         gDefaultInterface.fDisableClientState = glDisableClientState;
         GR_GL_GET_PROC(DisableVertexAttribArray);
         gDefaultInterface.fDrawArrays = glDrawArrays;
+        gDefaultInterface.fDrawBuffer = glDrawBuffer;
+        GR_GL_GET_PROC(DrawBuffers);
         gDefaultInterface.fDrawElements = glDrawElements;
         gDefaultInterface.fEnable = glEnable;
         gDefaultInterface.fEnableClientState = glEnableClientState;
diff --git a/gpu/src/unix/GrGLDefaultInterface_unix.cpp b/gpu/src/unix/GrGLDefaultInterface_unix.cpp
index 064fe3f..e38a76b 100644
--- a/gpu/src/unix/GrGLDefaultInterface_unix.cpp
+++ b/gpu/src/unix/GrGLDefaultInterface_unix.cpp
@@ -67,6 +67,8 @@
         gDefaultInterface.fDisableClientState = glDisableClientState;
         GR_GL_GET_PROC(DisableVertexAttribArray);
         gDefaultInterface.fDrawArrays = glDrawArrays;
+        gDefaultInterface.fDrawBuffer = glDrawBuffer;
+        GR_GL_GET_PROC(DrawBuffers);
         gDefaultInterface.fDrawElements = glDrawElements;
         gDefaultInterface.fEnable = glEnable;
         gDefaultInterface.fEnableClientState = glEnableClientState;
diff --git a/gpu/src/win/GrGLDefaultInterface_win.cpp b/gpu/src/win/GrGLDefaultInterface_win.cpp
index ac4552a..05f5414 100644
--- a/gpu/src/win/GrGLDefaultInterface_win.cpp
+++ b/gpu/src/win/GrGLDefaultInterface_win.cpp
@@ -57,6 +57,7 @@
             gDefaultInterface.fDisable = glDisable;
             gDefaultInterface.fDisableClientState = glDisableClientState;
             gDefaultInterface.fDrawArrays = glDrawArrays;
+            gDefaultInterface.fDrawBuffer = glDrawBuffer;
             gDefaultInterface.fDrawElements = glDrawElements;
             gDefaultInterface.fEnable = glEnable;
             gDefaultInterface.fEnableClientState = glEnableClientState;
@@ -102,6 +103,7 @@
             GR_GL_GET_PROC(DeleteProgram);
             GR_GL_GET_PROC(DeleteShader);
             GR_GL_GET_PROC(DisableVertexAttribArray);
+            GR_GL_GET_PROC(DrawBuffers);
             GR_GL_GET_PROC(EnableVertexAttribArray);
             GR_GL_GET_PROC(GenBuffers);
             GR_GL_GET_PROC(GetBufferParameteriv);