| Index: src/gpu/GrInOrderDrawBuffer.cpp
|
| ===================================================================
|
| --- src/gpu/GrInOrderDrawBuffer.cpp (revision 8777)
|
| +++ src/gpu/GrInOrderDrawBuffer.cpp (working copy)
|
| @@ -73,25 +73,26 @@
|
| }
|
| }
|
|
|
| -void GrInOrderDrawBuffer::onDrawRect(const GrRect& rect,
|
| - const SkMatrix* matrix,
|
| - const GrRect* localRect,
|
| - const SkMatrix* localMatrix) {
|
| - GrDrawState::AutoColorRestore acr;
|
|
|
| - GrDrawState* drawState = this->drawState();
|
| +namespace {
|
|
|
| - GrColor color = drawState->getColor();
|
| - GrVertexAttribArray<3> attribs;
|
| +extern const GrVertexAttrib kRectPosColorUVAttribs[] = {
|
| + {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
| + {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding},
|
| + {kVec2f_GrVertexAttribType, sizeof(GrPoint)+sizeof(GrColor),
|
| + kLocalCoord_GrVertexAttribBinding},
|
| +};
|
|
|
| - // set position attrib
|
| - static const GrVertexAttrib kPosAttrib =
|
| - {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding};
|
| - attribs.push_back(kPosAttrib);
|
| +extern const GrVertexAttrib kRectPosUVAttribs[] = {
|
| + {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
| + {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBinding},
|
| +};
|
|
|
| - size_t currentOffset = sizeof(GrPoint);
|
| - int colorOffset = -1;
|
| - int localOffset = -1;
|
| +static void set_vertex_attributes(GrDrawState* drawState,
|
| + bool hasColor, bool hasUVs,
|
| + int* colorOffset, int* localOffset) {
|
| + *colorOffset = -1;
|
| + *localOffset = -1;
|
|
|
| // Using per-vertex colors allows batching across colors. (A lot of rects in a row differing
|
| // only in color is a common occurrence in tables). However, having per-vertex colors disables
|
| @@ -99,28 +100,47 @@
|
| // optimizations help determine whether coverage and color can be blended correctly when
|
| // dual-source blending isn't available. This comes into play when there is coverage. If colors
|
| // were a stage it could take a hint that every vertex's color will be opaque.
|
| - if (this->caps()->dualSourceBlendingSupport() || drawState->hasSolidCoverage()) {
|
| - colorOffset = currentOffset;
|
| - GrVertexAttrib colorAttrib =
|
| - {kVec4ub_GrVertexAttribType, currentOffset, kColor_GrVertexAttribBinding};
|
| - attribs.push_back(colorAttrib);
|
| - currentOffset += sizeof(GrColor);
|
| + if (hasColor && hasUVs) {
|
| + *colorOffset = sizeof(GrPoint);
|
| + *localOffset = sizeof(GrPoint) + sizeof(GrColor);
|
| + drawState->setVertexAttribs<kRectPosColorUVAttribs>(3);
|
| + } else if (hasColor) {
|
| + *colorOffset = sizeof(GrPoint);
|
| + drawState->setVertexAttribs<kRectPosColorUVAttribs>(2);
|
| + } else if (hasUVs) {
|
| + *localOffset = sizeof(GrPoint);
|
| + drawState->setVertexAttribs<kRectPosUVAttribs>(2);
|
| + } else {
|
| + drawState->setVertexAttribs<kRectPosUVAttribs>(1);
|
| + }
|
| +}
|
| +
|
| +};
|
| +
|
| +void GrInOrderDrawBuffer::onDrawRect(const GrRect& rect,
|
| + const SkMatrix* matrix,
|
| + const GrRect* localRect,
|
| + const SkMatrix* localMatrix) {
|
| + GrDrawState::AutoColorRestore acr;
|
| +
|
| + GrDrawState* drawState = this->drawState();
|
| +
|
| + GrColor color = drawState->getColor();
|
| +
|
| + int colorOffset, localOffset;
|
| + set_vertex_attributes(drawState,
|
| + this->caps()->dualSourceBlendingSupport() || drawState->hasSolidCoverage(),
|
| + NULL != localRect,
|
| + &colorOffset, &localOffset);
|
| + if (colorOffset >= 0) {
|
| // We set the draw state's color to white here. This is done so that any batching performed
|
| // in our subclass's onDraw() won't get a false from GrDrawState::op== due to a color
|
| // mismatch. TODO: Once vertex layout is owned by GrDrawState it should skip comparing the
|
| - // constant color in its op== when the kColor layout bit is set and then we can remove this.
|
| + // constant color in its op== when the kColor layout bit is set and then we can remove
|
| + // this.
|
| acr.set(drawState, 0xFFFFFFFF);
|
| }
|
|
|
| - if (NULL != localRect) {
|
| - localOffset = currentOffset;
|
| - GrVertexAttrib localCoordAttrib =
|
| - {kVec2f_GrVertexAttribType, currentOffset, kLocalCoord_GrVertexAttribBinding};
|
| - attribs.push_back(localCoordAttrib);
|
| - currentOffset += sizeof(GrPoint);
|
| - }
|
| -
|
| - drawState->setVertexAttribs(attribs.begin(), attribs.count());
|
| AutoReleaseGeometry geo(this, 4, 0);
|
| if (!geo.succeeded()) {
|
| GrPrintf("Failed to get space for vertices!\n");
|
| @@ -144,7 +164,6 @@
|
| }
|
|
|
| size_t vsize = drawState->getVertexSize();
|
| - GrAssert(vsize == currentOffset);
|
|
|
| geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vsize);
|
| combinedMatrix.mapPointsWithStride(geo.positions(), vsize, 4);
|
|
|