| Index: src/gpu/batches/GrDrawVerticesBatch.cpp
|
| diff --git a/src/gpu/batches/GrDrawVerticesBatch.cpp b/src/gpu/batches/GrDrawVerticesBatch.cpp
|
| index 33bed0d0f815d0cf0748c4e4642534eb343a4816..16c70e8513a0c49f837d532ce92cde132eb91c6b 100644
|
| --- a/src/gpu/batches/GrDrawVerticesBatch.cpp
|
| +++ b/src/gpu/batches/GrDrawVerticesBatch.cpp
|
| @@ -12,32 +12,23 @@
|
| #include "GrDefaultGeoProcFactory.h"
|
|
|
| static const GrGeometryProcessor* set_vertex_attributes(bool hasLocalCoords,
|
| - bool hasColors,
|
| int* colorOffset,
|
| int* texOffset,
|
| - GrColor color,
|
| const SkMatrix& viewMatrix,
|
| bool coverageIgnored) {
|
| using namespace GrDefaultGeoProcFactory;
|
| *texOffset = -1;
|
| *colorOffset = -1;
|
| - Color gpColor(color);
|
| - if (hasColors) {
|
| - gpColor.fType = Color::kAttribute_Type;
|
| - }
|
|
|
| Coverage coverage(coverageIgnored ? Coverage::kNone_Type : Coverage::kSolid_Type);
|
| LocalCoords localCoords(hasLocalCoords ? LocalCoords::kHasExplicit_Type :
|
| LocalCoords::kUsePosition_Type);
|
| - if (hasLocalCoords && hasColors) {
|
| - *colorOffset = sizeof(SkPoint);
|
| + *colorOffset = sizeof(SkPoint);
|
| + if (hasLocalCoords) {
|
| *texOffset = sizeof(SkPoint) + sizeof(GrColor);
|
| - } else if (hasLocalCoords) {
|
| - *texOffset = sizeof(SkPoint);
|
| - } else if (hasColors) {
|
| - *colorOffset = sizeof(SkPoint);
|
| }
|
| - return GrDefaultGeoProcFactory::Create(gpColor, coverage, localCoords, viewMatrix);
|
| + return GrDefaultGeoProcFactory::Create(Color(Color::kAttribute_Type),
|
| + coverage, localCoords, viewMatrix);
|
| }
|
|
|
| GrDrawVerticesBatch::GrDrawVerticesBatch(const Geometry& geometry, GrPrimitiveType primitiveType,
|
| @@ -49,40 +40,34 @@ GrDrawVerticesBatch::GrDrawVerticesBatch(const Geometry& geometry, GrPrimitiveTy
|
| : INHERITED(ClassID()) {
|
| SkASSERT(positions);
|
|
|
| - fBatch.fViewMatrix = viewMatrix;
|
| + fViewMatrix = viewMatrix;
|
| Geometry& installedGeo = fGeoData.push_back(geometry);
|
|
|
| installedGeo.fPositions.append(vertexCount, positions);
|
| if (indices) {
|
| installedGeo.fIndices.append(indexCount, indices);
|
| - fBatch.fHasIndices = true;
|
| - } else {
|
| - fBatch.fHasIndices = false;
|
| }
|
|
|
| if (colors) {
|
| + fVariableColor = true;
|
| installedGeo.fColors.append(vertexCount, colors);
|
| - fBatch.fHasColors = true;
|
| } else {
|
| - fBatch.fHasColors = false;
|
| + fVariableColor = false;
|
| }
|
|
|
| if (localCoords) {
|
| installedGeo.fLocalCoords.append(vertexCount, localCoords);
|
| - fBatch.fHasLocalCoords = true;
|
| - } else {
|
| - fBatch.fHasLocalCoords = false;
|
| }
|
| - fBatch.fVertexCount = vertexCount;
|
| - fBatch.fIndexCount = indexCount;
|
| - fBatch.fPrimitiveType = primitiveType;
|
| + fVertexCount = vertexCount;
|
| + fIndexCount = indexCount;
|
| + fPrimitiveType = primitiveType;
|
|
|
| this->setBounds(bounds);
|
| }
|
|
|
| void GrDrawVerticesBatch::getInvariantOutputColor(GrInitInvariantOutput* out) const {
|
| // When this is called on a batch, there is only one geometry bundle
|
| - if (this->hasColors()) {
|
| + if (fVariableColor) {
|
| out->setUnknownFourComponents();
|
| } else {
|
| out->setKnownFourComponents(fGeoData[0].fColor);
|
| @@ -94,40 +79,38 @@ void GrDrawVerticesBatch::getInvariantOutputCoverage(GrInitInvariantOutput* out)
|
| }
|
|
|
| void GrDrawVerticesBatch::initBatchTracker(const GrPipelineOptimizations& opt) {
|
| - // Handle any color overrides
|
| - if (!opt.readsColor()) {
|
| - fGeoData[0].fColor = GrColor_ILLEGAL;
|
| + SkASSERT(fGeoData.count() == 1);
|
| + GrColor overrideColor;
|
| + if (opt.getOverrideColorIfSet(&overrideColor)) {
|
| + fGeoData[0].fColor = overrideColor;
|
| + fGeoData[0].fColors.reset();
|
| + fVariableColor = false;
|
| + }
|
| + fCoverageIgnored = !opt.readsCoverage();
|
| + if (!opt.readsLocalCoords()) {
|
| + fGeoData[0].fLocalCoords.reset();
|
| }
|
| - opt.getOverrideColorIfSet(&fGeoData[0].fColor);
|
| -
|
| - // setup batch properties
|
| - fBatch.fColorIgnored = !opt.readsColor();
|
| - fBatch.fColor = fGeoData[0].fColor;
|
| - fBatch.fUsesLocalCoords = opt.readsLocalCoords();
|
| - fBatch.fCoverageIgnored = !opt.readsCoverage();
|
| }
|
|
|
| void GrDrawVerticesBatch::onPrepareDraws(Target* target) {
|
| + bool hasLocalCoords = !fGeoData[0].fLocalCoords.isEmpty();
|
| int colorOffset = -1, texOffset = -1;
|
| SkAutoTUnref<const GrGeometryProcessor> gp(
|
| - set_vertex_attributes(this->hasLocalCoords(), this->hasColors(), &colorOffset,
|
| - &texOffset, this->color(), this->viewMatrix(),
|
| - this->coverageIgnored()));
|
| -
|
| + set_vertex_attributes(hasLocalCoords, &colorOffset, &texOffset, fViewMatrix,
|
| + fCoverageIgnored));
|
| target->initDraw(gp, this->pipeline());
|
|
|
| size_t vertexStride = gp->getVertexStride();
|
|
|
| - SkASSERT(vertexStride == sizeof(SkPoint) + (this->hasLocalCoords() ? sizeof(SkPoint) : 0)
|
| - + (this->hasColors() ? sizeof(GrColor) : 0));
|
| + SkASSERT(vertexStride == sizeof(SkPoint) + (hasLocalCoords ? sizeof(SkPoint) : 0)
|
| + + sizeof(GrColor));
|
|
|
| int instanceCount = fGeoData.count();
|
|
|
| const GrVertexBuffer* vertexBuffer;
|
| int firstVertex;
|
|
|
| - void* verts = target->makeVertexSpace(vertexStride, this->vertexCount(),
|
| - &vertexBuffer, &firstVertex);
|
| + void* verts = target->makeVertexSpace(vertexStride, fVertexCount, &vertexBuffer, &firstVertex);
|
|
|
| if (!verts) {
|
| SkDebugf("Could not allocate vertices\n");
|
| @@ -138,8 +121,8 @@ void GrDrawVerticesBatch::onPrepareDraws(Target* target) {
|
| int firstIndex = 0;
|
|
|
| uint16_t* indices = nullptr;
|
| - if (this->hasIndices()) {
|
| - indices = target->makeIndexSpace(this->indexCount(), &indexBuffer, &firstIndex);
|
| + if (!fGeoData[0].fIndices.isEmpty()) {
|
| + indices = target->makeIndexSpace(fIndexCount, &indexBuffer, &firstIndex);
|
|
|
| if (!indices) {
|
| SkDebugf("Could not allocate indices\n");
|
| @@ -153,7 +136,7 @@ void GrDrawVerticesBatch::onPrepareDraws(Target* target) {
|
| const Geometry& args = fGeoData[i];
|
|
|
| // TODO we can actually cache this interleaved and then just memcopy
|
| - if (this->hasIndices()) {
|
| + if (indices) {
|
| for (int j = 0; j < args.fIndices.count(); ++j, ++indexOffset) {
|
| *(indices + indexOffset) = args.fIndices[j] + vertexOffset;
|
| }
|
| @@ -161,10 +144,12 @@ void GrDrawVerticesBatch::onPrepareDraws(Target* target) {
|
|
|
| for (int j = 0; j < args.fPositions.count(); ++j) {
|
| *((SkPoint*)verts) = args.fPositions[j];
|
| - if (this->hasColors()) {
|
| + if (args.fColors.isEmpty()) {
|
| + *(GrColor*)((intptr_t)verts + colorOffset) = args.fColor;
|
| + } else {
|
| *(GrColor*)((intptr_t)verts + colorOffset) = args.fColors[j];
|
| }
|
| - if (this->hasLocalCoords()) {
|
| + if (hasLocalCoords) {
|
| *(SkPoint*)((intptr_t)verts + texOffset) = args.fLocalCoords[j];
|
| }
|
| verts = (void*)((intptr_t)verts + vertexStride);
|
| @@ -173,12 +158,12 @@ void GrDrawVerticesBatch::onPrepareDraws(Target* target) {
|
| }
|
|
|
| GrVertices vertices;
|
| - if (this->hasIndices()) {
|
| + if (indices) {
|
| vertices.initIndexed(this->primitiveType(), vertexBuffer, indexBuffer, firstVertex,
|
| - firstIndex, this->vertexCount(), this->indexCount());
|
| + firstIndex, fVertexCount, fIndexCount);
|
|
|
| } else {
|
| - vertices.init(this->primitiveType(), vertexBuffer, firstVertex, this->vertexCount());
|
| + vertices.init(this->primitiveType(), vertexBuffer, firstVertex, fVertexCount);
|
| }
|
| target->draw(vertices);
|
| }
|
| @@ -195,35 +180,28 @@ bool GrDrawVerticesBatch::onCombineIfPossible(GrBatch* t, const GrCaps& caps) {
|
| return false;
|
| }
|
|
|
| - SkASSERT(this->usesLocalCoords() == that->usesLocalCoords());
|
| -
|
| // We currently use a uniform viewmatrix for this batch
|
| - if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) {
|
| - return false;
|
| - }
|
| -
|
| - if (this->hasColors() != that->hasColors()) {
|
| + if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) {
|
| return false;
|
| }
|
|
|
| - if (this->hasIndices() != that->hasIndices()) {
|
| + if (fGeoData[0].fIndices.isEmpty() != that->fGeoData[0].fIndices.isEmpty()) {
|
| return false;
|
| }
|
|
|
| - if (this->hasLocalCoords() != that->hasLocalCoords()) {
|
| + if (fGeoData[0].fLocalCoords.isEmpty() != that->fGeoData[0].fLocalCoords.isEmpty()) {
|
| return false;
|
| }
|
|
|
| - if (!this->hasColors() && this->color() != that->color()) {
|
| - return false;
|
| + if (!fVariableColor) {
|
| + if (that->fVariableColor || that->fGeoData[0].fColor != fGeoData[0].fColor) {
|
| + fVariableColor = true;
|
| + }
|
| }
|
|
|
| - if (this->color() != that->color()) {
|
| - fBatch.fColor = GrColor_ILLEGAL;
|
| - }
|
| fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin());
|
| - fBatch.fVertexCount += that->vertexCount();
|
| - fBatch.fIndexCount += that->indexCount();
|
| + fVertexCount += that->fVertexCount;
|
| + fIndexCount += that->fIndexCount;
|
|
|
| this->joinBounds(that->bounds());
|
| return true;
|
|
|