Index: src/gpu/gl/GrGLVertexArray.h |
=================================================================== |
--- src/gpu/gl/GrGLVertexArray.h (revision 0) |
+++ src/gpu/gl/GrGLVertexArray.h (revision 0) |
@@ -0,0 +1,147 @@ |
+/* |
+ * 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 GrGLVertexArray_DEFINED |
+#define GrGLVertexArray_DEFINED |
+ |
+#include "GrResource.h" |
+#include "gl/GrGLFunctions.h" |
+ |
+#include "SkTArray.h" |
+ |
+class GrGLVertexBuffer; |
+class GrGLIndexBuffer; |
+class GrGpuGL; |
+ |
+/** |
+ * This sets and tracks the vertex attribute array state. It is used internally by GrGLVertexArray |
+ * (below) but is separate because it is also used to track the state of vertex array object 0. |
+ */ |
+class GrGLAttribArrayState { |
+public: |
+ explicit GrGLAttribArrayState(int arrayCount = 0) { this->resize(arrayCount); } |
+ |
+ void resize(int newCount) { |
+ fAttribArrayStates.resize_back(newCount); |
+ for (int i = 0; i < newCount; ++i) { |
+ fAttribArrayStates[i].invalidate(); |
+ } |
+ } |
+ |
+ /** |
+ * This function enables and sets vertex attrib state for the specified attrib index. It is |
+ * assumed that the GrGLAttribArrayState is tracking the state of the currently bound vertex |
+ * array object. |
+ */ |
+ void set(const GrGpuGL*, |
+ int index, |
+ GrGLVertexBuffer*, |
+ GrGLint size, |
+ GrGLenum type, |
+ GrGLboolean normalized, |
+ GrGLsizei stride, |
+ GrGLvoid* offset); |
+ |
+ /** |
+ * This function disables vertex attribs not present in the mask. It is assumed that the |
+ * GrGLAttribArrayState is tracking the state of the currently bound vertex array object. |
+ */ |
+ void disableUnusedAttribArrays(const GrGpuGL*, uint64_t usedAttribArrayMask); |
+ |
+ void invalidate() { |
+ int count = fAttribArrayStates.count(); |
+ for (int i = 0; i < count; ++i) { |
+ fAttribArrayStates[i].invalidate(); |
+ } |
+ } |
+ |
+ void notifyVertexBufferDelete(GrGLuint id) { |
+ int count = fAttribArrayStates.count(); |
+ for (int i = 0; i < count; ++i) { |
+ if (id == fAttribArrayStates[i].fVertexBufferID) { |
+ fAttribArrayStates[i].invalidate(); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * The number of attrib arrays that this object is configured to track. |
+ */ |
+ int count() const { return fAttribArrayStates.count(); } |
+ |
+private: |
+ /** |
+ * Tracks the state of glVertexAttribArray for an attribute index. |
+ */ |
+ struct AttribArrayState { |
+ void invalidate() { |
+ fEnableIsValid = false; |
+ fAttribPointerIsValid = false; |
+ } |
+ |
+ bool fEnableIsValid; |
+ bool fAttribPointerIsValid; |
+ bool fEnabled; |
+ GrGLuint fVertexBufferID; |
+ GrGLint fSize; |
+ GrGLenum fType; |
+ GrGLboolean fNormalized; |
+ GrGLsizei fStride; |
+ GrGLvoid* fOffset; |
+ }; |
+ |
+ SkSTArray<16, AttribArrayState, true> fAttribArrayStates; |
+}; |
+ |
+/** |
+ * This class represents an OpenGL vertex array object. It manages the lifetime of the vertex array |
+ * and is used to track the state of the vertex array to avoid redundant GL calls. |
+ */ |
+class GrGLVertexArray : public GrResource { |
+public: |
+ GrGLVertexArray(GrGpuGL* gpu, GrGLint id, int attribCount); |
+ |
+ /** |
+ * Binds this vertex array. If the ID has been deleted or abandoned then NULL is returned. |
+ * Otherwise, the GrGLAttribArrayState that is tracking this vertex array's attrib bindings is |
+ * returned. |
+ */ |
+ GrGLAttribArrayState* bind(); |
+ |
+ /** |
+ * This is a version of the above function that also binds an index buffer to the vertex |
+ * array object. |
+ */ |
+ GrGLAttribArrayState* bindWithIndexBuffer(const GrGLIndexBuffer* indexBuffer); |
+ |
+ void notifyIndexBufferDelete(GrGLuint bufferID); |
+ |
+ void notifyVertexBufferDelete(GrGLuint id) { |
+ fAttribArrays.notifyVertexBufferDelete(id); |
+ } |
+ |
+ GrGLuint arrayID() const { return fID; } |
+ |
+ void invalidateCachedState(); |
+ |
+ virtual size_t sizeInBytes() const SK_OVERRIDE { return 0; } |
+ |
+protected: |
+ virtual void onAbandon() SK_OVERRIDE; |
+ |
+ virtual void onRelease() SK_OVERRIDE; |
+ |
+private: |
+ GrGLuint fID; |
+ GrGLAttribArrayState fAttribArrays; |
+ GrGLuint fIndexBufferID; |
+ bool fIndexBufferIDIsValid; |
+ |
+ typedef GrResource INHERITED; |
+}; |
+ |
+#endif |