Index: src/gpu/gl/GrGLVertexArray.cpp |
=================================================================== |
--- src/gpu/gl/GrGLVertexArray.cpp (revision 0) |
+++ src/gpu/gl/GrGLVertexArray.cpp (revision 0) |
@@ -0,0 +1,123 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "GrGLVertexArray.h" |
+#include "GrGpuGL.h" |
+ |
+#define GPUGL static_cast<GrGpuGL*>(this->getGpu()) |
+#define GL_CALL(X) GR_GL_CALL(GPUGL->glInterface(), X); |
+ |
+void GrGLAttribArrayState::set(const GrGpuGL* gpu, |
+ int index, |
+ GrGLVertexBuffer* buffer, |
+ GrGLint size, |
+ GrGLenum type, |
+ GrGLboolean normalized, |
+ GrGLsizei stride, |
+ GrGLvoid* offset) { |
+ GrAssert(index >= 0 && index < fAttribArrayStates.count()); |
+ AttribArrayState* array = &fAttribArrayStates[index]; |
+ if (!array->fEnableIsValid || !array->fEnabled) { |
+ GR_GL_CALL(gpu->glInterface(), EnableVertexAttribArray(index)); |
+ array->fEnableIsValid = true; |
+ array->fEnabled = true; |
+ } |
+ if (!array->fAttribPointerIsValid || |
+ array->fVertexBufferID != buffer->bufferID() || |
+ array->fSize != size || |
+ array->fNormalized != normalized || |
+ array->fStride != stride || |
+ array->fOffset != offset) { |
+ |
+ buffer->bind(); |
+ GR_GL_CALL(gpu->glInterface(), VertexAttribPointer(index, |
+ size, |
+ type, |
+ normalized, |
+ stride, |
+ offset)); |
+ array->fAttribPointerIsValid = true; |
+ array->fVertexBufferID = buffer->bufferID(); |
+ array->fSize = size; |
+ array->fNormalized = normalized; |
+ array->fStride = stride; |
+ array->fOffset = offset; |
+ } |
+} |
+ |
+void GrGLAttribArrayState::disableUnusedAttribArrays(const GrGpuGL* gpu, uint64_t usedMask) { |
+ int count = fAttribArrayStates.count(); |
+ for (int i = 0; i < count; ++i) { |
+ if (!(usedMask & 0x1)) { |
+ if (!fAttribArrayStates[i].fEnableIsValid || fAttribArrayStates[i].fEnabled) { |
+ GR_GL_CALL(gpu->glInterface(), DisableVertexAttribArray(i)); |
+ fAttribArrayStates[i].fEnableIsValid = true; |
+ fAttribArrayStates[i].fEnabled = false; |
+ } |
+ } |
+ // if the count is greater than 64 then this will become 0 and we will disable arrays 64+. |
+ usedMask >>= 1; |
+ } |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+GrGLVertexArray::GrGLVertexArray(GrGpuGL* gpu, GrGLint id, int attribCount) |
+ : GrResource(gpu, false) |
+ , fID(id) |
+ , fAttribArrays(attribCount) |
+ , fIndexBufferIDIsValid(false) { |
+} |
+ |
+void GrGLVertexArray::onAbandon() { |
+ fID = 0; |
+ INHERITED::onAbandon(); |
+} |
+ |
+void GrGLVertexArray::onRelease() { |
+ if (0 != fID) { |
+ GL_CALL(DeleteVertexArrays(1, &fID)); |
+ GPUGL->notifyVertexArrayDelete(fID); |
+ fID = 0; |
+ } |
+ INHERITED::onRelease(); |
+} |
+ |
+GrGLAttribArrayState* GrGLVertexArray::bind() { |
+ if (0 == fID) { |
+ return NULL; |
+ } |
+ GPUGL->bindVertexArray(fID); |
+ return &fAttribArrays; |
+} |
+ |
+GrGLAttribArrayState* GrGLVertexArray::bindWithIndexBuffer(const GrGLIndexBuffer* buffer) { |
+ GrGLAttribArrayState* state = this->bind(); |
+ if (NULL != state && NULL != buffer) { |
+ GrGLuint bufferID = buffer->bufferID(); |
+ if (!fIndexBufferIDIsValid || bufferID != fIndexBufferID) { |
+ GL_CALL(BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, bufferID)); |
+ fIndexBufferIDIsValid = true; |
+ fIndexBufferID = bufferID; |
+ } |
+ } |
+ return state; |
+} |
+ |
+void GrGLVertexArray::notifyIndexBufferDelete(GrGLuint bufferID) { |
+ if (fIndexBufferIDIsValid && bufferID == fIndexBufferID) { |
+ fIndexBufferID = 0; |
+ } |
+ } |
+ |
+void GrGLVertexArray::invalidateCachedState() { |
+ int count = fAttribArrays.count(); |
+ for (int i = 0; i < count; ++i) { |
+ fAttribArrays.invalidate(); |
+ } |
+ fIndexBufferIDIsValid = false; |
+} |