void GrDrawAtlasBatch::onPrepareDraws(Target* target) const { // Setup geometry processor sk_sp<GrGeometryProcessor> gp(set_vertex_attributes(this->hasColors(), this->color(), this->viewMatrix(), this->coverageIgnored())); int instanceCount = fGeoData.count(); size_t vertexStride = gp->getVertexStride(); SkASSERT(vertexStride == sizeof(SkPoint) + sizeof(SkPoint) + (this->hasColors() ? sizeof(GrColor) : 0)); QuadHelper helper; int numQuads = this->quadCount(); void* verts = helper.init(target, vertexStride, numQuads); if (!verts) { SkDebugf("Could not allocate vertices\n"); return; } uint8_t* vertPtr = reinterpret_cast<uint8_t*>(verts); for (int i = 0; i < instanceCount; i++) { const Geometry& args = fGeoData[i]; size_t allocSize = args.fVerts.count(); memcpy(vertPtr, args.fVerts.begin(), allocSize); vertPtr += allocSize; } helper.recordDraw(target, gp.get()); }
void generateGeometry(GrBatchTarget* batchTarget) override { SkAutoTUnref<const GrGeometryProcessor> gp(this->createRectGP()); if (!gp) { SkDebugf("Could not create GrGeometryProcessor\n"); return; } batchTarget->initDraw(gp, this->pipeline()); int instanceCount = fGeoData.count(); size_t vertexStride = gp->getVertexStride(); SkASSERT(this->hasLocalRect() ? vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) : vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); QuadHelper helper; void* vertices = helper.init(batchTarget, vertexStride, instanceCount); if (!vertices) { return; } for (int i = 0; i < instanceCount; i++) { const Geometry& geom = fGeoData[i]; intptr_t offset = reinterpret_cast<intptr_t>(vertices) + kVerticesPerQuad * i * vertexStride; SkPoint* positions = reinterpret_cast<SkPoint*>(offset); positions->setRectFan(geom.fRect.fLeft, geom.fRect.fTop, geom.fRect.fRight, geom.fRect.fBottom, vertexStride); geom.fViewMatrix.mapPointsWithStride(positions, vertexStride, kVerticesPerQuad); // TODO we should only do this if local coords are being read if (geom.fHasLocalRect) { static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); SkPoint* coords = reinterpret_cast<SkPoint*>(offset + kLocalOffset); coords->setRectFan(geom.fLocalRect.fLeft, geom.fLocalRect.fTop, geom.fLocalRect.fRight, geom.fLocalRect.fBottom, vertexStride); if (geom.fHasLocalMatrix) { geom.fLocalMatrix.mapPointsWithStride(coords, vertexStride, kVerticesPerQuad); } } static const int kColorOffset = sizeof(SkPoint); GrColor* vertColor = reinterpret_cast<GrColor*>(offset + kColorOffset); for (int j = 0; j < 4; ++j) { *vertColor = geom.fColor; vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride); } } helper.issueDraw(batchTarget); }
void GrDrawAtlasBatch::generateGeometry(GrBatchTarget* batchTarget) { int colorOffset = -1, texOffset = -1; // Setup geometry processor SkAutoTUnref<const GrGeometryProcessor> gp( set_vertex_attributes(true, this->hasColors(), &colorOffset, &texOffset, this->color(), this->viewMatrix(), this->coverageIgnored())); batchTarget->initDraw(gp, this->pipeline()); int instanceCount = fGeoData.count(); size_t vertexStride = gp->getVertexStride(); SkASSERT(vertexStride == sizeof(SkPoint) + sizeof(SkPoint) + (this->hasColors() ? sizeof(GrColor) : 0)); QuadHelper helper; int numQuads = this->vertexCount()/4; void* verts = helper.init(batchTarget, vertexStride, numQuads); if (!verts) { SkDebugf("Could not allocate vertices\n"); return; } int vertexOffset = 0; for (int i = 0; i < instanceCount; i++) { const Geometry& args = fGeoData[i]; for (int j = 0; j < args.fPositions.count(); ++j) { *((SkPoint*)verts) = args.fPositions[j]; if (this->hasColors()) { *(GrColor*)((intptr_t)verts + colorOffset) = args.fColors[j]; } *(SkPoint*)((intptr_t)verts + texOffset) = args.fLocalCoords[j]; verts = (void*)((intptr_t)verts + vertexStride); vertexOffset++; } } helper.issueDraw(batchTarget); }
void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override { // Go to device coords to allow batching across matrix changes SkMatrix invert = SkMatrix::I(); // if we have a local rect, then we apply the localMatrix directly to the localRect to // generate vertex local coords bool hasExplicitLocalCoords = this->hasLocalRect(); if (!hasExplicitLocalCoords) { if (!this->viewMatrix().isIdentity() && !this->viewMatrix().invert(&invert)) { SkDebugf("Could not invert\n"); return; } if (this->hasLocalMatrix()) { invert.preConcat(this->localMatrix()); } } SkAutoTUnref<const GrGeometryProcessor> gp(create_rect_gp(hasExplicitLocalCoords, &invert, this->usesLocalCoords(), this->coverageIgnored())); batchTarget->initDraw(gp, pipeline); int instanceCount = fGeoData.count(); size_t vertexStride = gp->getVertexStride(); SkASSERT(hasExplicitLocalCoords ? vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) : vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); QuadHelper helper; void* vertices = helper.init(batchTarget, vertexStride, instanceCount); if (!vertices) { return; } for (int i = 0; i < instanceCount; i++) { const Geometry& geom = fGeoData[i]; intptr_t offset = GrTCast<intptr_t>(vertices) + kVerticesPerQuad * i * vertexStride; SkPoint* positions = GrTCast<SkPoint*>(offset); positions->setRectFan(geom.fRect.fLeft, geom.fRect.fTop, geom.fRect.fRight, geom.fRect.fBottom, vertexStride); geom.fViewMatrix.mapPointsWithStride(positions, vertexStride, kVerticesPerQuad); if (geom.fHasLocalRect) { static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); SkPoint* coords = GrTCast<SkPoint*>(offset + kLocalOffset); coords->setRectFan(geom.fLocalRect.fLeft, geom.fLocalRect.fTop, geom.fLocalRect.fRight, geom.fLocalRect.fBottom, vertexStride); if (geom.fHasLocalMatrix) { geom.fLocalMatrix.mapPointsWithStride(coords, vertexStride, kVerticesPerQuad); } } static const int kColorOffset = sizeof(SkPoint); GrColor* vertColor = GrTCast<GrColor*>(offset + kColorOffset); for (int j = 0; j < 4; ++j) { *vertColor = geom.fColor; vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride); } } helper.issueDraw(batchTarget); }