aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-01 15:36:02 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-03-01 15:36:02 +0000
commitecd84842b3f65918eb040c53391172b6413fd7ad (patch)
treeb6fb8cad101462c65157bad473b161ed40f0bb23 /src
parentb82c3993c2f753e5caaff2df9648ebdafc68595f (diff)
Add support to GrGLInterface for vertex array objects
Diffstat (limited to 'src')
-rw-r--r--src/gpu/gl/GrGLCreateNullInterface.cpp5
-rw-r--r--src/gpu/gl/GrGLInterface.cpp20
-rw-r--r--src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp3
-rw-r--r--src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp14
-rw-r--r--src/gpu/gl/debug/GrDebugGL.cpp14
-rw-r--r--src/gpu/gl/debug/GrDebugGL.h26
-rw-r--r--src/gpu/gl/debug/GrGLCreateDebugInterface.cpp56
-rw-r--r--src/gpu/gl/debug/GrVertexArrayObj.h21
-rw-r--r--src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp21
-rw-r--r--src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp181
-rw-r--r--src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp7
-rw-r--r--src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp7
-rw-r--r--src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp9
13 files changed, 256 insertions, 128 deletions
diff --git a/src/gpu/gl/GrGLCreateNullInterface.cpp b/src/gpu/gl/GrGLCreateNullInterface.cpp
index da6491a6d5..ebaacbc1af 100644
--- a/src/gpu/gl/GrGLCreateNullInterface.cpp
+++ b/src/gpu/gl/GrGLCreateNullInterface.cpp
@@ -20,6 +20,7 @@ GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shade
GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
+GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {}
GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {}
GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
@@ -46,7 +47,6 @@ GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
}
-
// In debug builds we do asserts that ensure we agree with GL about when a buffer
// is mapped.
static SkTDArray<GrGLuint> gMappedBuffers;
@@ -168,6 +168,7 @@ const GrGLInterface* GrGLCreateNullInterface() {
interface->fBindBuffer = nullGLBindBuffer;
interface->fBindFragDataLocation = noOpGLBindFragDataLocation;
interface->fBindTexture = nullGLBindTexture;
+ interface->fBindVertexArray = nullGLBindVertexArray;
interface->fBlendColor = noOpGLBlendColor;
interface->fBlendFunc = noOpGLBlendFunc;
interface->fBufferData = nullGLBufferData;
@@ -186,6 +187,7 @@ const GrGLInterface* GrGLCreateNullInterface() {
interface->fDeleteQueries = noOpGLDeleteIds;
interface->fDeleteShader = nullGLDelete;
interface->fDeleteTextures = noOpGLDeleteIds;
+ interface->fDeleteVertexArrays = noOpGLDeleteIds;
interface->fDepthMask = noOpGLDepthMask;
interface->fDisable = noOpGLDisable;
interface->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray;
@@ -202,6 +204,7 @@ const GrGLInterface* GrGLCreateNullInterface() {
interface->fGenBuffers = noOpGLGenIds;
interface->fGenQueries = noOpGLGenIds;
interface->fGenTextures = noOpGLGenIds;
+ interface->fGenVertexArrays = noOpGLGenIds;
interface->fGetBufferParameteriv = nullGLGetBufferParameteriv;
interface->fGetError = noOpGLGetError;
interface->fGetIntegerv = noOpGLGetIntegerv;
diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp
index 6fcd6ab578..ea9c29ee95 100644
--- a/src/gpu/gl/GrGLInterface.cpp
+++ b/src/gpu/gl/GrGLInterface.cpp
@@ -349,5 +349,25 @@ bool GrGLInterface::validate(GrGLBinding binding) const {
}
}
+ if (kDesktop_GrGLBinding == binding) {
+ if (glVer >= GR_GL_VER(3, 0) || extensions.has("GL_ARB_vertex_array_object")) {
+ if (NULL == fBindVertexArray ||
+ NULL == fDeleteVertexArrays ||
+ NULL == fGenVertexArrays) {
+ return false;
+ }
+ }
+ } else {
+#if 0 // Remove this #if once Chromium interfaces set these pointers
+ if (extensions.has("GL_OES_vertex_array_object")) {
+ if (NULL == fBindVertexArray ||
+ NULL == fDeleteVertexArrays ||
+ NULL == fGenVertexArrays) {
+ return false;
+ }
+ }
+#endif
+ }
+
return true;
}
diff --git a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
index 79a8229ced..6fa9053cb8 100644
--- a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
+++ b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
@@ -26,6 +26,7 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fBindAttribLocation = glBindAttribLocation;
interface->fBindBuffer = glBindBuffer;
interface->fBindTexture = glBindTexture;
+ interface->fBindVertexArray = glBindVertexArrayOES;
interface->fBlendColor = glBlendColor;
interface->fBlendFunc = glBlendFunc;
interface->fBufferData = glBufferData;
@@ -43,6 +44,7 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fDeleteProgram = glDeleteProgram;
interface->fDeleteShader = glDeleteShader;
interface->fDeleteTextures = glDeleteTextures;
+ interface->fDeleteVertexArrays = glDeleteVertexArraysOES;
interface->fDepthMask = glDepthMask;
interface->fDisable = glDisable;
interface->fDisableVertexAttribArray = glDisableVertexAttribArray;
@@ -55,6 +57,7 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fFrontFace = glFrontFace;
interface->fGenBuffers = glGenBuffers;
interface->fGenTextures = glGenTextures;
+ interface->fGenVertexArrays = glGenVertexArraysOES;
interface->fGetBufferParameteriv = glGetBufferParameteriv;
interface->fGetError = glGetError;
interface->fGetIntegerv = glGetIntegerv;
diff --git a/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp b/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
index bc1e0ee6c3..059713d8e4 100644
--- a/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
+++ b/src/gpu/gl/angle/GrGLCreateANGLEInterface.cpp
@@ -44,6 +44,8 @@ const GrGLInterface* GrGLCreateANGLEInterface() {
GR_GET_PROC(GrGLBindAttribLocationProc, BindAttribLocation);
GR_GET_PROC(GrGLBindBufferProc, BindBuffer);
GR_GET_PROC(GrGLBindTextureProc, BindTexture);
+ interface->fBindVertexArray =
+ (GrGLBindVertexArrayProc) eglGetProcAddress("glBindVertexArrayOES");
GR_GET_PROC(GrGLBlendColorProc, BlendColor);
GR_GET_PROC(GrGLBlendFuncProc, BlendFunc);
GR_GET_PROC(GrGLBufferDataProc, BufferData);
@@ -61,6 +63,8 @@ const GrGLInterface* GrGLCreateANGLEInterface() {
GR_GET_PROC(GrGLDeleteProgramProc, DeleteProgram);
GR_GET_PROC(GrGLDeleteShaderProc, DeleteShader);
GR_GET_PROC(GrGLDeleteTexturesProc, DeleteTextures);
+ interface->fDeleteVertexArrays =
+ (GrGLDeleteVertexArraysProc) eglGetProcAddress("glDeleteVertexArraysOES");
GR_GET_PROC(GrGLDepthMaskProc, DepthMask);
GR_GET_PROC(GrGLDisableProc, Disable);
GR_GET_PROC(GrGLDisableVertexAttribArrayProc, DisableVertexAttribArray);
@@ -73,6 +77,8 @@ const GrGLInterface* GrGLCreateANGLEInterface() {
GR_GET_PROC(GrGLFrontFaceProc, FrontFace);
GR_GET_PROC(GrGLGenBuffersProc, GenBuffers);
GR_GET_PROC(GrGLGenTexturesProc, GenTextures);
+ interface->fGenVertexArrays =
+ (GrGLGenVertexArraysProc) eglGetProcAddress("glGenVertexArraysOES");
GR_GET_PROC(GrGLGetBufferParameterivProc, GetBufferParameteriv);
GR_GET_PROC(GrGLGetErrorProc, GetError);
GR_GET_PROC(GrGLGetIntegervProc, GetIntegerv);
@@ -101,9 +107,7 @@ const GrGLInterface* GrGLCreateANGLEInterface() {
#if GL_ARB_texture_storage
GR_GET_PROC(GrGLTexStorage2DProc, TexStorage2D);
#elif GL_EXT_texture_storage
- interface->fTexStorage2D = (GrGLTexStorage2DProc)
- GetProcAddress(ghANGLELib,
- "glTexStorage2DEXT");
+ interface->fTexStorage2D = (GrGLTexStorage2DProc) eglGetProcAddress("glTexStorage2DEXT");
#endif
GR_GET_PROC(GrGLUniform1fProc, Uniform1f);
GR_GET_PROC(GrGLUniform1iProc, Uniform1i);
@@ -147,8 +151,8 @@ const GrGLInterface* GrGLCreateANGLEInterface() {
GetRenderbufferParameteriv);
GR_GET_PROC(GrGLRenderbufferStorageProc, RenderbufferStorage);
- interface->fMapBuffer = (PFNGLMAPBUFFEROESPROC) eglGetProcAddress("glMapBufferOES");
- interface->fUnmapBuffer = (PFNGLUNMAPBUFFEROESPROC) eglGetProcAddress("glUnmapBufferOES");
+ interface->fMapBuffer = (GrGLMapBufferProc) eglGetProcAddress("glMapBufferOES");
+ interface->fUnmapBuffer = (GrGLUnmapBufferProc) eglGetProcAddress("glUnmapBufferOES");
}
glInterface.get()->ref();
return glInterface.get();
diff --git a/src/gpu/gl/debug/GrDebugGL.cpp b/src/gpu/gl/debug/GrDebugGL.cpp
index 9e2e510b1b..fb390b6b82 100644
--- a/src/gpu/gl/debug/GrDebugGL.cpp
+++ b/src/gpu/gl/debug/GrDebugGL.cpp
@@ -14,7 +14,7 @@
#include "GrShaderObj.h"
#include "GrProgramObj.h"
#include "GrTextureUnitObj.h"
-
+#include "GrVertexArrayObj.h"
GrDebugGL* GrDebugGL::gObj = NULL;
int GrDebugGL::gStaticRefCount = 0;
@@ -26,6 +26,7 @@ GrDebugGL::Create GrDebugGL::gFactoryFunc[kObjTypeCount] = {
GrShaderObj::createGrShaderObj,
GrProgramObj::createGrProgramObj,
GrTextureUnitObj::createGrTextureUnitObj,
+ GrVertexArrayObj::createGrVertexArrayObj,
};
@@ -38,7 +39,8 @@ GrDebugGL::GrDebugGL()
, fFrameBuffer(NULL)
, fRenderBuffer(NULL)
, fProgram(NULL)
- , fTexture(NULL) {
+ , fTexture(NULL)
+ , fVertexArray(NULL) {
for (int i = 0; i < kDefaultMaxTextureUnits; ++i) {
@@ -70,6 +72,7 @@ GrDebugGL::~GrDebugGL() {
fRenderBuffer = NULL;
fProgram = NULL;
fTexture = NULL;
+ fVertexArray = NULL;
}
GrFakeRefObj *GrDebugGL::findObject(GrGLuint ID, GrObjTypes type) {
@@ -107,6 +110,13 @@ void GrDebugGL::setArrayBuffer(GrBufferObj *arrayBuffer) {
}
}
+void GrDebugGL::setVertexArray(GrVertexArrayObj* vertexArray) {
+ if (NULL != vertexArray) {
+ GrAssert(!vertexArray->getDeleted());
+ }
+ SkRefCnt_SafeAssign(fVertexArray, vertexArray);
+}
+
void GrDebugGL::setElementArrayBuffer(GrBufferObj *elementArrayBuffer) {
if (fElementArrayBuffer) {
// automatically break the binding of the old buffer
diff --git a/src/gpu/gl/debug/GrDebugGL.h b/src/gpu/gl/debug/GrDebugGL.h
index 409f13d106..e1a28bb834 100644
--- a/src/gpu/gl/debug/GrDebugGL.h
+++ b/src/gpu/gl/debug/GrDebugGL.h
@@ -12,13 +12,14 @@
#include "SkTArray.h"
#include "gl/GrGLInterface.h"
-class GrFakeRefObj;
-class GrTextureUnitObj;
class GrBufferObj;
-class GrTextureObj;
+class GrFakeRefObj;
class GrFrameBufferObj;
-class GrRenderBufferObj;
class GrProgramObj;
+class GrRenderBufferObj;
+class GrTextureObj;
+class GrTextureUnitObj;
+class GrVertexArrayObj;
////////////////////////////////////////////////////////////////////////////////
// This is the main debugging object. It is a singleton and keeps track of
@@ -33,6 +34,7 @@ public:
kShader_ObjTypes,
kProgram_ObjTypes,
kTextureUnit_ObjTypes,
+ kVertexArray_ObjTypes,
kObjTypeCount
};
@@ -63,6 +65,9 @@ public:
void setElementArrayBuffer(GrBufferObj *elementArrayBuffer);
GrBufferObj *getElementArrayBuffer() { return fElementArrayBuffer; }
+ void setVertexArray(GrVertexArrayObj* vertexArray);
+ GrVertexArrayObj* getVertexArray() { return fVertexArray; }
+
void setTexture(GrTextureObj *texture);
void setFrameBuffer(GrFrameBufferObj *frameBuffer);
@@ -119,13 +124,14 @@ private:
GrGLint fUnPackRowLength;
GrGLuint fMaxTextureUnits;
GrGLuint fCurTextureUnit;
- GrBufferObj * fArrayBuffer;
- GrBufferObj * fElementArrayBuffer;
- GrFrameBufferObj *fFrameBuffer;
- GrRenderBufferObj *fRenderBuffer;
- GrProgramObj * fProgram;
- GrTextureObj * fTexture;
+ GrBufferObj* fArrayBuffer;
+ GrBufferObj* fElementArrayBuffer;
+ GrFrameBufferObj* fFrameBuffer;
+ GrRenderBufferObj* fRenderBuffer;
+ GrProgramObj* fProgram;
+ GrTextureObj* fTexture;
GrTextureUnitObj *fTextureUnits[kDefaultMaxTextureUnits];
+ GrVertexArrayObj *fVertexArray;
typedef GrFakeRefObj *(*Create)();
diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
index 21a3d1bf71..f8c5b1fdcc 100644
--- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
+++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
@@ -16,6 +16,7 @@
#include "GrTextureObj.h"
#include "GrFrameBufferObj.h"
#include "GrRenderBufferObj.h"
+#include "GrVertexArrayObj.h"
#include "SkFloatingPoint.h"
#include "../GrGLNoOpInterface.h"
@@ -212,8 +213,7 @@ GrGLvoid GR_GL_FUNCTION_TYPE debugGLReadPixels(GrGLint x,
GrDebugGL::getInstance()->setFrameBuffer(frameBuffer);
}
- GrGLvoid GR_GL_FUNCTION_TYPE debugGLBindRenderbuffer(GrGLenum target,
- GrGLuint renderBufferID) {
+ GrGLvoid GR_GL_FUNCTION_TYPE debugGLBindRenderbuffer(GrGLenum target, GrGLuint renderBufferID) {
GrAlwaysAssert(GR_GL_RENDERBUFFER == target);
@@ -225,8 +225,7 @@ GrGLvoid GR_GL_FUNCTION_TYPE debugGLReadPixels(GrGLint x,
GrDebugGL::getInstance()->setRenderBuffer(renderBuffer);
}
- GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteTextures(GrGLsizei n,
- const GrGLuint* textures) {
+ GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteTextures(GrGLsizei n, const GrGLuint* textures) {
// first potentially unbind the texture
// TODO: move this into GrDebugGL as unBindTexture?
@@ -287,7 +286,6 @@ GrGLvoid GR_GL_FUNCTION_TYPE debugGLReadPixels(GrGLint x,
}
-
GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteFramebuffers(GrGLsizei n,
const GrGLuint *frameBuffers) {
@@ -518,32 +516,55 @@ GrGLvoid debugGenObjs(GrDebugGL::GrObjTypes type,
}
GrGLvoid GR_GL_FUNCTION_TYPE debugGLGenBuffers(GrGLsizei n, GrGLuint* ids) {
-
debugGenObjs(GrDebugGL::kBuffer_ObjTypes, n, ids);
}
GrGLvoid GR_GL_FUNCTION_TYPE debugGLGenFramebuffers(GrGLsizei n,
GrGLuint* ids) {
-
debugGenObjs(GrDebugGL::kFrameBuffer_ObjTypes, n, ids);
}
GrGLvoid GR_GL_FUNCTION_TYPE debugGLGenRenderbuffers(GrGLsizei n,
GrGLuint* ids) {
-
debugGenObjs(GrDebugGL::kRenderBuffer_ObjTypes, n, ids);
}
GrGLvoid GR_GL_FUNCTION_TYPE debugGLGenTextures(GrGLsizei n, GrGLuint* ids) {
-
debugGenObjs(GrDebugGL::kTexture_ObjTypes, n, ids);
}
-GrGLvoid GR_GL_FUNCTION_TYPE debugGLBindBuffer(GrGLenum target,
- GrGLuint bufferID) {
+GrGLvoid GR_GL_FUNCTION_TYPE debugGLGenVertexArrays(GrGLsizei n, GrGLuint* ids) {
+ debugGenObjs(GrDebugGL::kVertexArray_ObjTypes, n, ids);
+}
- GrAlwaysAssert(GR_GL_ARRAY_BUFFER == target ||
- GR_GL_ELEMENT_ARRAY_BUFFER == target);
+GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteVertexArrays(GrGLsizei n, const GrGLuint* ids) {
+ for (GrGLsizei i = 0; i < n; ++i) {
+ GrVertexArrayObj* array =
+ GR_FIND(ids[i], GrVertexArrayObj, GrDebugGL::kVertexArray_ObjTypes);
+ GrAlwaysAssert(array);
+
+ // Deleting the current vertex array binds object 0
+ if (GrDebugGL::getInstance()->getVertexArray() == array) {
+ GrDebugGL::getInstance()->setVertexArray(NULL);
+ }
+
+ if (array->getRefCount()) {
+ // someone is still using this vertex array so we can't delete it here
+ array->setMarkedForDeletion();
+ } else {
+ array->deleteAction();
+ }
+ }
+}
+
+GrGLvoid GR_GL_FUNCTION_TYPE debugGLBindVertexArray(GrGLuint id) {
+ GrVertexArrayObj* array = GR_FIND(id, GrVertexArrayObj, GrDebugGL::kVertexArray_ObjTypes);
+ GrAlwaysAssert(array);
+ GrDebugGL::getInstance()->setVertexArray(array);
+}
+
+GrGLvoid GR_GL_FUNCTION_TYPE debugGLBindBuffer(GrGLenum target, GrGLuint bufferID) {
+ GrAlwaysAssert(GR_GL_ARRAY_BUFFER == target || GR_GL_ELEMENT_ARRAY_BUFFER == target);
GrBufferObj *buffer = GR_FIND(bufferID,
GrBufferObj,
@@ -564,8 +585,7 @@ GrGLvoid GR_GL_FUNCTION_TYPE debugGLBindBuffer(GrGLenum target,
}
// deleting a bound buffer has the side effect of binding 0
-GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteBuffers(GrGLsizei n,
- const GrGLuint* ids) {
+GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
// first potentially unbind the buffers
for (int i = 0; i < n; ++i) {
@@ -595,8 +615,7 @@ GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteBuffers(GrGLsizei n,
}
// map a buffer to the caller's address space
-GrGLvoid* GR_GL_FUNCTION_TYPE debugGLMapBuffer(GrGLenum target,
- GrGLenum access) {
+GrGLvoid* GR_GL_FUNCTION_TYPE debugGLMapBuffer(GrGLenum target, GrGLenum access) {
GrAlwaysAssert(GR_GL_ARRAY_BUFFER == target ||
GR_GL_ELEMENT_ARRAY_BUFFER == target);
@@ -767,6 +786,7 @@ const GrGLInterface* GrGLCreateDebugInterface() {
interface->fBindBuffer = debugGLBindBuffer;
interface->fBindFragDataLocation = noOpGLBindFragDataLocation;
interface->fBindTexture = debugGLBindTexture;
+ interface->fBindVertexArray = debugGLBindVertexArray;
interface->fBlendColor = noOpGLBlendColor;
interface->fBlendFunc = noOpGLBlendFunc;
interface->fBufferData = debugGLBufferData;
@@ -785,6 +805,7 @@ const GrGLInterface* GrGLCreateDebugInterface() {
interface->fDeleteQueries = noOpGLDeleteIds;
interface->fDeleteShader = debugGLDeleteShader;
interface->fDeleteTextures = debugGLDeleteTextures;
+ interface->fDeleteVertexArrays = debugGLDeleteVertexArrays;
interface->fDepthMask = noOpGLDepthMask;
interface->fDisable = noOpGLDisable;
interface->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray;
@@ -817,6 +838,7 @@ const GrGLInterface* GrGLCreateDebugInterface() {
interface->fGetStringi = noOpGLGetStringi;
interface->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv;
interface->fGetUniformLocation = noOpGLGetUniformLocation;
+ interface->fGenVertexArrays = debugGLGenVertexArrays;
interface->fLineWidth = noOpGLLineWidth;
interface->fLinkProgram = noOpGLLinkProgram;
interface->fPixelStorei = debugGLPixelStorei;
diff --git a/src/gpu/gl/debug/GrVertexArrayObj.h b/src/gpu/gl/debug/GrVertexArrayObj.h
new file mode 100644
index 0000000000..989c610924
--- /dev/null
+++ b/src/gpu/gl/debug/GrVertexArrayObj.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrVertexArrayObj_DEFINED
+#define GrVertexArrayObj_DEFINED
+
+#include "GrFakeRefObj.h"
+
+class GrVertexArrayObj : public GrFakeRefObj {
+ GR_DEFINE_CREATOR(GrVertexArrayObj);
+
+public:
+ GrVertexArrayObj() : GrFakeRefObj() {}
+
+ typedef GrFakeRefObj INHERITED;
+};
+#endif
diff --git a/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp b/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
index 2b4dc64df4..5492e19714 100644
--- a/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
+++ b/src/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp
@@ -79,11 +79,11 @@ const GrGLInterface* GrGLCreateNativeInterface() {
// mac uses GLenum for internalFormat param (non-standard)
// amounts to int vs. uint.
interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
- #if GL_ARB_texture_storage
+#if GL_ARB_texture_storage
interface->fTexStorage2D = glTexStorage2D;
- #elif GL_EXT_texture_storage
+#elif GL_EXT_texture_storage
interface->fTexStorage2D = glTexStorage2DEXT;
- #endif
+#endif
interface->fTexParameteri = glTexParameteri;
interface->fTexParameteriv = glTexParameteriv;
interface->fTexSubImage2D = glTexSubImage2D;
@@ -124,16 +124,21 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
interface->fBindRenderbuffer = glBindRenderbuffer;
- #if GL_OES_mapbuffer
+#if GL_OES_mapbuffer
interface->fMapBuffer = glMapBufferOES;
interface->fUnmapBuffer = glUnmapBufferOES;
- #endif
+#endif
- #if GL_APPLE_framebuffer_multisample
+#if GL_APPLE_framebuffer_multisample
interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleAPPLE;
interface->fResolveMultisampleFramebuffer = glResolveMultisampleFramebufferAPPLE;
- #endif
- interface->fBindFragDataLocationIndexed = NULL;
+#endif
+
+#if GL_OES_vertex_array_object
+ interface->fBindVertexArray = glBindVertexArrayOES;
+ interface->fDeleteVertexArrays = glDeleteVertexArraysOES;
+ interface->fGenVertexArrays = glGenVertexArraysOES;
+#endif
interface->fBindingsExported = kES2_GrGLBinding;
}
diff --git a/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp b/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp
index 2e1309f196..2b0f41c342 100644
--- a/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp
+++ b/src/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp
@@ -45,11 +45,11 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fBindAttribLocation = glBindAttribLocation;
interface->fBindBuffer = glBindBuffer;
if (ver >= GR_GL_VER(3,0)) {
- #if GL_VERSION_3_0
- interface->fBindFragDataLocation = glBindFragDataLocation;
- #else
- interface->fBindFragDataLocation = GET_PROC(BindFragDataLocation);
- #endif
+#if GL_VERSION_3_0
+ interface->fBindFragDataLocation = glBindFragDataLocation;
+#else
+ GET_PROC(BindFragDataLocation);
+#endif
}
interface->fBindTexture = glBindTexture;
interface->fBlendFunc = glBlendFunc;
@@ -131,17 +131,17 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
interface->fTexParameteri = glTexParameteri;
interface->fTexParameteriv = glTexParameteriv;
- #if GL_ARB_texture_storage || GL_VERSION_4_2
+#if GL_ARB_texture_storage || GL_VERSION_4_2
interface->fTexStorage2D = glTexStorage2D
- #elif GL_EXT_texture_storage
+#elif GL_EXT_texture_storage
interface->fTexStorage2D = glTexStorage2DEXT;
- #else
+#else
if (ver >= GR_GL_VER(4,2) || extensions.has("GL_ARB_texture_storage")) {
GET_PROC(TexStorage2D);
} else if (extensions.has("GL_EXT_texture_storage")) {
GET_PROC_SUFFIX(TexStorage2D, EXT);
}
- #endif
+#endif
interface->fTexSubImage2D = glTexSubImage2D;
interface->fUniform1f = glUniform1f;
interface->fUniform1i = glUniform1i;
@@ -169,30 +169,43 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fVertexAttribPointer = glVertexAttribPointer;
interface->fViewport = glViewport;
+ if (ver >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
+ // no ARB suffix for GL_ARB_vertex_array_object
+#if GL_ARB_vertex_array_object || GL_VERSION_3_0
+ interface->fBindVertexArray = glBindVertexArray;
+ interface->fDeleteVertexArrays = glDeleteVertexArrays;
+ interface->fGenVertexArrays = glGenVertexArrays;
+#else
+ GET_PROC(BindVertexArray);
+ GET_PROC(DeleteVertexArrays);
+ GET_PROC(GenVertexArrays);
+#endif
+ }
+
if (ver >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) {
// ARB extension doesn't use the ARB suffix on the function name
- #if GL_ARB_timer_query || GL_VERSION_3_3
- interface->fQueryCounter = glQueryCounter;
- interface->fGetQueryObjecti64v = glGetQueryObjecti64v;
- interface->fGetQueryObjectui64v = glGetQueryObjectui64v;
- #else
- interface->fQueryCounter = GET_PROC(QueryCounter);
- interface->fGetQueryObjecti64v = GET_PROC(GetQueryObjecti64v);
- interface->fGetQueryObjectui64v = GET_PROC(GetQueryObjectui64v);
- #endif
+#if GL_ARB_timer_query || GL_VERSION_3_3
+ interface->fQueryCounter = glQueryCounter;
+ interface->fGetQueryObjecti64v = glGetQueryObjecti64v;
+ interface->fGetQueryObjectui64v = glGetQueryObjectui64v;
+#else
+ GET_PROC(QueryCounter);
+ GET_PROC(GetQueryObjecti64v);
+ GET_PROC(GetQueryObjectui64v);
+#endif
} else if (extensions.has("GL_EXT_timer_query")) {
- #if GL_EXT_timer_query
- interface->fGetQueryObjecti64v = glGetQueryObjecti64vEXT;
- interface->fGetQueryObjectui64v = glGetQueryObjectui64vEXT;
- #else
- interface->fGetQueryObjecti64v = GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
- interface->fGetQueryObjectui64v = GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
- #endif
+#if GL_EXT_timer_query
+ interface->fGetQueryObjecti64v = glGetQueryObjecti64vEXT;
+ interface->fGetQueryObjectui64v = glGetQueryObjectui64vEXT;
+#else
+ GET_PROC_SUFFIX(GetQueryObjecti64v, EXT);
+ GET_PROC_SUFFIX(GetQueryObjectui64v, EXT);
+#endif
}
if (ver >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
// ARB extension doesn't use the ARB suffix on the function names
- #if GL_VERSION_3_0 || GL_ARB_framebuffer_object
+#if GL_VERSION_3_0 || GL_ARB_framebuffer_object
interface->fGenFramebuffers = glGenFramebuffers;
interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
@@ -207,74 +220,74 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fBindRenderbuffer = glBindRenderbuffer;
interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample;
interface->fBlitFramebuffer = glBlitFramebuffer;
- #else
- interface->fGenFramebuffers = GET_PROC(GenFramebuffers);
- interface->fGetFramebufferAttachmentParameteriv = GET_PROC(GetFramebufferAttachmentParameteriv);
- interface->fGetRenderbufferParameteriv = GET_PROC(GetRenderbufferParameteriv);
- interface->fBindFramebuffer = GET_PROC(BindFramebuffer);
- interface->fFramebufferTexture2D = GET_PROC(FramebufferTexture2D);
- interface->fCheckFramebufferStatus = GET_PROC(CheckFramebufferStatus);
- interface->fDeleteFramebuffers = GET_PROC(DeleteFramebuffers);
- interface->fRenderbufferStorage = GET_PROC(RenderbufferStorage);
- interface->fGenRenderbuffers = GET_PROC(GenRenderbuffers);
- interface->fDeleteRenderbuffers = GET_PROC(DeleteRenderbuffers);
- interface->fFramebufferRenderbuffer = GET_PROC(FramebufferRenderbuffer);
- interface->fBindRenderbuffer = GET_PROC(BindRenderbuffer);
- interface->fRenderbufferStorageMultisample = GET_PROC(RenderbufferStorageMultisample);
- interface->fBlitFramebuffer = GET_PROC(BlitFramebuffer);
- #endif
+#else
+ GET_PROC(GenFramebuffers);
+ GET_PROC(GetFramebufferAttachmentParameteriv);
+ GET_PROC(GetRenderbufferParameteriv);
+ GET_PROC(BindFramebuffer);
+ GET_PROC(FramebufferTexture2D);
+ GET_PROC(CheckFramebufferStatus);
+ GET_PROC(DeleteFramebuffers);
+ GET_PROC(RenderbufferStorage);
+ GET_PROC(GenRenderbuffers);
+ GET_PROC(DeleteRenderbuffers);
+ GET_PROC(FramebufferRenderbuffer);
+ GET_PROC(BindRenderbuffer);
+ GET_PROC(RenderbufferStorageMultisample);
+ GET_PROC(BlitFramebuffer);
+#endif
} else {
if (extensions.has("GL_EXT_framebuffer_object")) {
- #if GL_EXT_framebuffer_object
- interface->fGenFramebuffers = glGenFramebuffersEXT;
- interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameterivEXT;
- interface->fGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
- interface->fBindFramebuffer = glBindFramebufferEXT;
- interface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
- interface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
- interface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
- interface->fRenderbufferStorage = glRenderbufferStorageEXT;
- interface->fGenRenderbuffers = glGenRenderbuffersEXT;
- interface->fDeleteRenderbuffers = glDeleteRenderbuffersEXT;
- interface->fFramebufferRenderbuffer = glFramebufferRenderbufferEXT;
- interface->fBindRenderbuffer = glBindRenderbufferEXT;
- #else
- interface->fGenFramebuffers = GET_PROC_SUFFIX(GenFramebuffers, EXT);
- interface->fGetFramebufferAttachmentParameteriv = GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
- interface->fGetRenderbufferParameteriv = GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
- interface->fBindFramebuffer = GET_PROC_SUFFIX(BindFramebuffer, EXT);
- interface->fFramebufferTexture2D = GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
- interface->fCheckFramebufferStatus = GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
- interface->fDeleteFramebuffers = GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
- interface->fRenderbufferStorage = GET_PROC_SUFFIX(RenderbufferStorage, EXT);
- interface->fGenRenderbuffers = GET_PROC_SUFFIX(GenRenderbuffers, EXT);
- interface->fDeleteRenderbuffers = GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
- interface->fFramebufferRenderbuffer = GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
- interface->fBindRenderbuffer = GET_PROC_SUFFIX(BindRenderbuffer, EXT);
- #endif
+#if GL_EXT_framebuffer_object
+ interface->fGenFramebuffers = glGenFramebuffersEXT;
+ interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameterivEXT;
+ interface->fGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
+ interface->fBindFramebuffer = glBindFramebufferEXT;
+ interface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
+ interface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
+ interface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
+ interface->fRenderbufferStorage = glRenderbufferStorageEXT;
+ interface->fGenRenderbuffers = glGenRenderbuffersEXT;
+ interface->fDeleteRenderbuffers = glDeleteRenderbuffersEXT;
+ interface->fFramebufferRenderbuffer = glFramebufferRenderbufferEXT;
+ interface->fBindRenderbuffer = glBindRenderbufferEXT;
+#else
+ GET_PROC_SUFFIX(GenFramebuffers, EXT);
+ GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
+ GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
+ GET_PROC_SUFFIX(BindFramebuffer, EXT);
+ GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
+ GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
+ GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
+ GET_PROC_SUFFIX(RenderbufferStorage, EXT);
+ GET_PROC_SUFFIX(GenRenderbuffers, EXT);
+ GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
+ GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
+ GET_PROC_SUFFIX(BindRenderbuffer, EXT);
+#endif
}
if (extensions.has("GL_EXT_framebuffer_multisample")) {
- #if GL_EXT_framebuffer_multisample
- interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleEXT;
- #else
- interface->fRenderbufferStorageMultisample = GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
- #endif
+#if GL_EXT_framebuffer_multisample
+ interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleEXT;
+#else
+ GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
+#endif
}
if (extensions.has("GL_EXT_framebuffer_blit")) {
- #if GL_EXT_framebuffer_blit
- interface->fBlitFramebuffer = glBlitFramebufferEXT;
- #else
- interface->fBlitFramebuffer = GET_PROC_SUFFIX(BlitFramebuffer, EXT);
- #endif
+#if GL_EXT_framebuffer_blit
+ interface->fBlitFramebuffer = glBlitFramebufferEXT;
+#else
+ GET_PROC_SUFFIX(BlitFramebuffer, EXT);
+#endif
}
}
if (ver >= GR_GL_VER(3,3) || extensions.has("GL_ARB_blend_func_extended")) {
// ARB extension doesn't use the ARB suffix on the function name
- #if GL_VERSION_3_3 || GL_ARB_blend_func_extended
- interface->fBindFragDataLocationIndexed = glBindFragDataLocationIndexed;
- #else
- interface->fBindFragDataLocationIndexed = GET_PROC(BindFragDataLocationIndexed);
- #endif
+#if GL_VERSION_3_3 || GL_ARB_blend_func_extended
+ interface->fBindFragDataLocationIndexed = glBindFragDataLocationIndexed;
+#else
+ GET_PROC(BindFragDataLocationIndexed);
+#endif
}
}
glInterface.get()->ref();
diff --git a/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp b/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
index 74f6a51d9e..5fdd5c618e 100644
--- a/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
+++ b/src/gpu/gl/mesa/GrGLCreateMesaInterface.cpp
@@ -161,6 +161,13 @@ const GrGLInterface* GrGLCreateMesaInterface() {
GR_GL_GET_PROC(VertexAttribPointer);
GR_GL_GET_PROC(Viewport);
+ if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
+ // no ARB suffix for GL_ARB_vertex_array_object
+ GR_GL_GET_PROC(BindVertexArray);
+ GR_GL_GET_PROC(DeleteVertexArrays);
+ GR_GL_GET_PROC(GenVertexArrays);
+ }
+
// First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
// GL_ARB_framebuffer_object doesn't use ARB suffix.)
if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
diff --git a/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp b/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp
index 2965e7f19a..6a27ee3cb7 100644
--- a/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp
+++ b/src/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp
@@ -164,6 +164,13 @@ const GrGLInterface* GrGLCreateNativeInterface() {
interface->fViewport = glViewport;
GR_GL_GET_PROC(BindFragDataLocationIndexed);
+ if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
+ // no ARB suffix for GL_ARB_vertex_array_object
+ GR_GL_GET_PROC(BindVertexArray);
+ GR_GL_GET_PROC(GenVertexArrays);
+ GR_GL_GET_PROC(DeleteVertexArrays);
+ }
+
// First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
// GL_ARB_framebuffer_object doesn't use ARB suffix.)
if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
diff --git a/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp b/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
index e08d8d4faf..173b3a39e0 100644
--- a/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
+++ b/src/gpu/gl/win/GrGLCreateNativeInterface_win.cpp
@@ -202,9 +202,16 @@ const GrGLInterface* GrGLCreateNativeInterface() {
WGL_SET_PROC(VertexAttribPointer);
WGL_SET_PROC(BindFragDataLocationIndexed);
+ if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_vertex_array_object")) {
+ // no ARB suffix for GL_ARB_vertex_array_object
+ WGL_SET_PROC(BindVertexArray);
+ WGL_SET_PROC(DeleteVertexArrays);
+ WGL_SET_PROC(GenVertexArrays);
+ }
+
// First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
// GL_ARB_framebuffer_object doesn't use ARB suffix.)
- if (glVer > GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
+ if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
WGL_SET_PROC(GenFramebuffers);
WGL_SET_PROC(GetFramebufferAttachmentParameteriv);
WGL_SET_PROC(GetRenderbufferParameteriv);