diff options
author | Brian Salomon <bsalomon@google.com> | 2018-06-18 12:52:47 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-18 17:13:58 +0000 |
commit | 19c1233c447f625c2522e7ecd0a0adecc629bb2f (patch) | |
tree | 891e06143986ade3aae8d4176ec8b426f70b896f /src/gpu/gl/GrGLGpu.cpp | |
parent | 146cf3ce7935019ecc63ce9e93450a8c122880d8 (diff) |
Change how vertex/instance attributes are handled in geometry processors.
* No longer register vertex/instance attributes on base class, just counts
* Separate instance and vertex attributes and remove InputRate and offset
* Make attributes constexpr where possible
Change-Id: I1f1d5e772fa177a96d2aeb805aab7b69f35bfae6
Reviewed-on: https://skia-review.googlesource.com/132405
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Chris Dalton <csmartdalton@google.com>
Diffstat (limited to 'src/gpu/gl/GrGLGpu.cpp')
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 88f5abecb4..be53222ee8 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -1775,35 +1775,29 @@ void GrGLGpu::setupGeometry(const GrBuffer* indexBuffer, attribState = fHWVertexArrayState.bindInternalVertexArray(this); } - struct { - const GrBuffer* fBuffer; - int fStride; - size_t fBufferOffset; - } bindings[2]; + int numAttribs = fHWProgram->numVertexAttributes() + fHWProgram->numInstanceAttributes(); + attribState->enableVertexArrays(this, numAttribs, enablePrimitiveRestart); if (int vertexStride = fHWProgram->vertexStride()) { SkASSERT(vertexBuffer && !vertexBuffer->isMapped()); - bindings[0].fBuffer = vertexBuffer; - bindings[0].fStride = vertexStride; - bindings[0].fBufferOffset = vertexBuffer->baseOffset() + baseVertex * vertexStride; + size_t bufferOffset = vertexBuffer->baseOffset() + baseVertex * vertexStride; + for (int i = 0; i < fHWProgram->numVertexAttributes(); ++i) { + const auto& attrib = fHWProgram->vertexAttribute(i); + static constexpr int kDivisor = 0; + attribState->set(this, attrib.fLocation, vertexBuffer, attrib.fType, vertexStride, + bufferOffset + attrib.fOffset, kDivisor); + } } if (int instanceStride = fHWProgram->instanceStride()) { SkASSERT(instanceBuffer && !instanceBuffer->isMapped()); - bindings[1].fBuffer = instanceBuffer; - bindings[1].fStride = instanceStride; - bindings[1].fBufferOffset = instanceBuffer->baseOffset() + baseInstance * instanceStride; - } - - auto numAttributes = fHWProgram->numAttributes(); - attribState->enableVertexArrays(this, numAttributes, enablePrimitiveRestart); - - for (int i = 0; i < numAttributes; ++i) { - using InputRate = GrPrimitiveProcessor::Attribute::InputRate; - const GrGLProgram::Attribute& attribute = fHWProgram->attribute(i); - const int divisor = InputRate::kPerInstance == attribute.fInputRate ? 1 : 0; - const auto& binding = bindings[divisor]; - attribState->set(this, attribute.fLocation, binding.fBuffer, attribute.fType, - binding.fStride, binding.fBufferOffset + attribute.fOffset, divisor); + size_t bufferOffset = instanceBuffer->baseOffset() + baseInstance * instanceStride; + int attribIdx = fHWProgram->numVertexAttributes(); + for (int i = 0; i < fHWProgram->numInstanceAttributes(); ++i, ++attribIdx) { + const auto& attrib = fHWProgram->instanceAttribute(i); + static constexpr int kDivisor = 1; + attribState->set(this, attrib.fLocation, instanceBuffer, attrib.fType, instanceStride, + bufferOffset + attrib.fOffset, kDivisor); + } } } |