aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/GrGLGpu.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2018-06-18 12:52:47 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-06-18 17:13:58 +0000
commit19c1233c447f625c2522e7ecd0a0adecc629bb2f (patch)
tree891e06143986ade3aae8d4176ec8b426f70b896f /src/gpu/gl/GrGLGpu.cpp
parent146cf3ce7935019ecc63ce9e93450a8c122880d8 (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.cpp40
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);
+ }
}
}