| Index: src/gpu/gl/GrGLVertexArray.cpp
|
| diff --git a/src/gpu/gl/GrGLVertexArray.cpp b/src/gpu/gl/GrGLVertexArray.cpp
|
| index bf3d3b5e981240d85ca099980419374f84a308a9..b53bf63fdc965618c024a8090cdc97c78a06072e 100644
|
| --- a/src/gpu/gl/GrGLVertexArray.cpp
|
| +++ b/src/gpu/gl/GrGLVertexArray.cpp
|
| @@ -49,7 +49,39 @@ void GrGLAttribArrayState::set(const GrGpuGL* gpu,
|
| }
|
| }
|
|
|
| -void GrGLAttribArrayState::disableUnusedAttribArrays(const GrGpuGL* gpu, uint64_t usedMask) {
|
| +void GrGLAttribArrayState::setFixedFunctionVertexArray(const GrGpuGL* gpu,
|
| + GrGLVertexBuffer* buffer,
|
| + GrGLint size,
|
| + GrGLenum type,
|
| + GrGLsizei stride,
|
| + GrGLvoid* offset) {
|
| + SkASSERT(gpu->glCaps().fixedFunctionSupport());
|
| + AttribArrayState* array = &fFixedFunctionVertexArray;
|
| + if (!array->fEnableIsValid || !array->fEnabled) {
|
| + GR_GL_CALL(gpu->glInterface(), EnableClientState(GR_GL_VERTEX_ARRAY));
|
| + array->fEnableIsValid = true;
|
| + array->fEnabled = true;
|
| + }
|
| + if (!array->fAttribPointerIsValid ||
|
| + array->fVertexBufferID != buffer->bufferID() ||
|
| + array->fSize != size ||
|
| + array->fStride != stride ||
|
| + array->fOffset != offset) {
|
| +
|
| + buffer->bind();
|
| + GR_GL_CALL(gpu->glInterface(), VertexPointer(size,
|
| + type,
|
| + stride,
|
| + offset));
|
| + array->fAttribPointerIsValid = true;
|
| + array->fVertexBufferID = buffer->bufferID();
|
| + array->fSize = size;
|
| + array->fStride = stride;
|
| + array->fOffset = offset;
|
| + }
|
| +}
|
| +
|
| +void GrGLAttribArrayState::disableUnusedArrays(const GrGpuGL* gpu, uint64_t usedMask, bool usingFFVertexArray) {
|
| int count = fAttribArrayStates.count();
|
| for (int i = 0; i < count; ++i) {
|
| if (!(usedMask & 0x1)) {
|
| @@ -58,10 +90,39 @@ void GrGLAttribArrayState::disableUnusedAttribArrays(const GrGpuGL* gpu, uint64_
|
| fAttribArrayStates[i].fEnableIsValid = true;
|
| fAttribArrayStates[i].fEnabled = false;
|
| }
|
| + } else {
|
| + SkASSERT(fAttribArrayStates[i].fEnableIsValid && fAttribArrayStates[i].fEnabled);
|
| }
|
| // if the count is greater than 64 then this will become 0 and we will disable arrays 64+.
|
| usedMask >>= 1;
|
| }
|
| +
|
| + // Deal with fixed-function vertex arrays.
|
| + if (gpu->glCaps().fixedFunctionSupport()) {
|
| + if (!usingFFVertexArray) {
|
| + if (!fFixedFunctionVertexArray.fEnableIsValid || fFixedFunctionVertexArray.fEnabled) {
|
| + GR_GL_CALL(gpu->glInterface(), DisableClientState(GR_GL_VERTEX_ARRAY));
|
| + fFixedFunctionVertexArray.fEnableIsValid = true;
|
| + fFixedFunctionVertexArray.fEnabled = false;
|
| + }
|
| + } else {
|
| + SkASSERT(fFixedFunctionVertexArray.fEnableIsValid && fFixedFunctionVertexArray.fEnabled);
|
| + }
|
| + if (!fUnusedFixedFunctionArraysDisabled) {
|
| + GR_GL_CALL(gpu->glInterface(), DisableClientState(GR_GL_NORMAL_ARRAY));
|
| + GR_GL_CALL(gpu->glInterface(), DisableClientState(GR_GL_COLOR_ARRAY));
|
| + // SECONDARY COLOR??
|
| + GR_GL_CALL(gpu->glInterface(), DisableClientState(GR_GL_INDEX_ARRAY));
|
| + GR_GL_CALL(gpu->glInterface(), DisableClientState(GR_GL_EDGE_FLAG_ARRAY));
|
| + for (int i = 0; i < gpu->glCaps().maxFixedFunctionTextureCoords(); ++i) {
|
| + GR_GL_CALL(gpu->glInterface(), ClientActiveTexture(GR_GL_TEXTURE0 + i));
|
| + GR_GL_CALL(gpu->glInterface(), DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
|
| + }
|
| + fUnusedFixedFunctionArraysDisabled = true;
|
| + }
|
| + } else {
|
| + SkASSERT(!usingFFVertexArray);
|
| + }
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
| @@ -115,9 +176,6 @@ void GrGLVertexArray::notifyIndexBufferDelete(GrGLuint bufferID) {
|
| }
|
|
|
| void GrGLVertexArray::invalidateCachedState() {
|
| - int count = fAttribArrays.count();
|
| - for (int i = 0; i < count; ++i) {
|
| - fAttribArrays.invalidate();
|
| - }
|
| + fAttribArrays.invalidate();
|
| fIndexBufferIDIsValid = false;
|
| }
|
|
|