From 056c1a821afcfbe606615ad1a7d1b554549d0846 Mon Sep 17 00:00:00 2001 From: Robert Phillips Date: Wed, 21 Feb 2018 14:17:08 -0500 Subject: Separate creation time & flush time behavior in GrDrawOpAtlas This CL clarifies what is going on in the GrDrawOpAtlas and GrAtlasGlyphCache. For the GrDrawOpAtlas: At creation time all the allowed pages are created (with their backing GrTextureProxies) but they aren't instantiated. The GrDrawOpAtlas::instantiate call is called in preFlushCB and allocates any pages known to be needed at the start of flush GrDrawOpAtlas::addToAtlas is called at flush time and, if a new page is activated, will instantiated it at that time. During compaction, an unused page will be deInstantiated but its Plots and backing GrTextureProxy will remain alive. The GrAtlasGlyphCache reflects the changes to the GrDrawOpAtlas It now carries a GrProxyProvider for when it needs to create an atlas It passes in a GrResourceProvider* at flush time to allow instantiation. It does not, yet, allocate that GrDrawOpAtlases it might ever require. Change-Id: I54909b7a3ba4bec2db5f1218f6a2a3a1636f66d6 Reviewed-on: https://skia-review.googlesource.com/108520 Commit-Queue: Robert Phillips Reviewed-by: Jim Van Verth --- src/gpu/ops/GrAtlasTextOp.cpp | 6 ++++-- src/gpu/ops/GrSmallPathRenderer.cpp | 30 ++++++++++++++++++------------ 2 files changed, 22 insertions(+), 14 deletions(-) (limited to 'src/gpu/ops') diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp index 46f38099ec..891564e586 100644 --- a/src/gpu/ops/GrAtlasTextOp.cpp +++ b/src/gpu/ops/GrAtlasTextOp.cpp @@ -222,6 +222,8 @@ static void clip_quads(const SkIRect& clipRect, char* currVertex, const char* bl } void GrAtlasTextOp::onPrepareDraws(Target* target) { + auto resourceProvider = target->resourceProvider(); + // if we have RGB, then we won't have any SkShaders so no need to use a localmatrix. // TODO actually only invert if we don't have RGBA SkMatrix localMatrix; @@ -276,8 +278,8 @@ void GrAtlasTextOp::onPrepareDraws(Target* target) { const Geometry& args = fGeoData[i]; Blob* blob = args.fBlob; GrAtlasTextBlob::VertexRegenerator regenerator( - blob, args.fRun, args.fSubRun, args.fViewMatrix, args.fX, args.fY, args.fColor, - target->deferredUploadTarget(), fFontCache, &glyphCache); + resourceProvider, blob, args.fRun, args.fSubRun, args.fViewMatrix, args.fX, args.fY, + args.fColor, target->deferredUploadTarget(), fFontCache, &glyphCache); GrAtlasTextBlob::VertexRegenerator::Result result; do { result = regenerator.regenerate(); diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp index 3e7da52230..563fbd3de3 100644 --- a/src/gpu/ops/GrSmallPathRenderer.cpp +++ b/src/gpu/ops/GrSmallPathRenderer.cpp @@ -181,7 +181,7 @@ public: fHelper.visitProxies(func); const sk_sp* proxies = fAtlas->getProxies(); - for (uint32_t i = 0; i < fAtlas->pageCount(); ++i) { + for (uint32_t i = 0; i < fAtlas->numActivePages(); ++i) { SkASSERT(proxies[i]); func(proxies[i].get()); } @@ -223,7 +223,7 @@ private: flushInfo.fPipeline = fHelper.makePipeline(target); // Setup GrGeometryProcessor GrDrawOpAtlas* atlas = fAtlas; - uint32_t atlasPageCount = atlas->pageCount(); + uint32_t atlasPageCount = atlas->numActivePages(); if (!atlasPageCount) { return; } @@ -400,6 +400,8 @@ private: bool addDFPathToAtlas(GrMeshDrawOp::Target* target, FlushInfo* flushInfo, GrDrawOpAtlas* atlas, ShapeData* shapeData, const GrShape& shape, uint32_t dimension, SkScalar scale) const { + auto resourceProvider = target->resourceProvider(); + const SkRect& bounds = shape.bounds(); // generate bounding rect for bitmap draw @@ -488,10 +490,11 @@ private: SkIPoint16 atlasLocation; GrDrawOpAtlas::AtlasID id; auto uploadTarget = target->deferredUploadTarget(); - if (!atlas->addToAtlas(&id, uploadTarget, width, height, dfStorage.get(), &atlasLocation)) { + if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, width, height, + dfStorage.get(), &atlasLocation)) { this->flush(target, flushInfo); - if (!atlas->addToAtlas(&id, uploadTarget, width, height, dfStorage.get(), - &atlasLocation)) { + if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, width, height, + dfStorage.get(), &atlasLocation)) { return false; } } @@ -530,6 +533,8 @@ private: bool addBMPathToAtlas(GrMeshDrawOp::Target* target, FlushInfo* flushInfo, GrDrawOpAtlas* atlas, ShapeData* shapeData, const GrShape& shape, const SkMatrix& ctm) const { + auto resourceProvider = target->resourceProvider(); + const SkRect& bounds = shape.bounds(); if (bounds.isEmpty()) { return false; @@ -590,11 +595,11 @@ private: SkIPoint16 atlasLocation; GrDrawOpAtlas::AtlasID id; auto uploadTarget = target->deferredUploadTarget(); - if (!atlas->addToAtlas(&id, uploadTarget, dst.width(), dst.height(), dst.addr(), - &atlasLocation)) { + if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, dst.width(), dst.height(), + dst.addr(), &atlasLocation)) { this->flush(target, flushInfo); - if (!atlas->addToAtlas(&id, uploadTarget, dst.width(), dst.height(), dst.addr(), - &atlasLocation)) { + if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, dst.width(), dst.height(), + dst.addr(), &atlasLocation)) { return false; } } @@ -696,7 +701,7 @@ private: void flush(GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const { GrGeometryProcessor* gp = flushInfo->fGeometryProcessor.get(); - if (gp->numTextureSamplers() != (int)fAtlas->pageCount()) { + if (gp->numTextureSamplers() != (int)fAtlas->numActivePages()) { // During preparation the number of atlas pages has increased. // Update the proxies used in the GP to match. if (fUsesDistanceField) { @@ -788,7 +793,7 @@ bool GrSmallPathRenderer::onDrawPath(const DrawPathArgs& args) { SkASSERT(!args.fShape->isEmpty()); SkASSERT(args.fShape->hasUnstyledKey()); if (!fAtlas) { - fAtlas = GrDrawOpAtlas::Make(args.fContext, + fAtlas = GrDrawOpAtlas::Make(args.fContext->contextPriv().proxyProvider(), kAlpha_8_GrPixelConfig, ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_HEIGHT, NUM_PLOTS_X, NUM_PLOTS_Y, @@ -858,7 +863,8 @@ GR_DRAW_OP_TEST_DEFINE(SmallPathOp) { if (context->uniqueID() != gTestStruct.fContextID) { gTestStruct.fContextID = context->uniqueID(); gTestStruct.reset(); - gTestStruct.fAtlas = GrDrawOpAtlas::Make(context, kAlpha_8_GrPixelConfig, + gTestStruct.fAtlas = GrDrawOpAtlas::Make(context->contextPriv().proxyProvider(), + kAlpha_8_GrPixelConfig, ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_HEIGHT, NUM_PLOTS_X, NUM_PLOTS_Y, GrDrawOpAtlas::AllowMultitexturing::kYes, -- cgit v1.2.3