diff options
author | Robert Phillips <robertphillips@google.com> | 2018-02-28 17:17:11 +0000 |
---|---|---|
committer | Robert Phillips <robertphillips@google.com> | 2018-02-28 17:42:11 +0000 |
commit | ba7a16519468dc49ea02d9256ee06f319edf9511 (patch) | |
tree | c65ad692fe2a0b96615cb0946e9804ea67992e7f /src/gpu/ops | |
parent | 3bd55bd59a0ef8bce88241a577fe096b6d651f83 (diff) |
Revert "Revert "Revert "Separate creation time & flush time behavior in GrDrawOpAtlas (take 2)"""
This reverts commit 934c3d0c548d254a0d986963ee751caf0ffcb500.
Reason for revert: Chrome
Original change's description:
> Revert "Revert "Separate creation time & flush time behavior in GrDrawOpAtlas (take 2)""
>
> This reverts commit 84d823a5e2a03b09f7db4964218b9e04e821c878.
>
> Reason for revert: The DFT diffs don't repro on Windows so I'm chalking it up to minor device differences
>
> Original change's description:
> > Revert "Separate creation time & flush time behavior in GrDrawOpAtlas (take 2)"
> >
> > This reverts commit 96165ebeaa36a2aae0eedaf12d81f53d3caf999a.
> >
> > Reason for revert: DFT GMs w/ LCD text are slightly different
> >
> > Original change's description:
> > > Separate creation time & flush time behavior in GrDrawOpAtlas (take 2)
> > >
> > > 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: Ie9b64b13e261b01ee14be09fbf7e17841b7781dc
> > > Reviewed-on: https://skia-review.googlesource.com/109749
> > > Reviewed-by: Jim Van Verth <jvanverth@google.com>
> > > Commit-Queue: Robert Phillips <robertphillips@google.com>
> >
> > TBR=jvanverth@google.com,robertphillips@google.com
> >
> > Change-Id: I62efc61c8394477e54d6e79fa2f65180c91a4515
> > No-Presubmit: true
> > No-Tree-Checks: true
> > No-Try: true
> > Reviewed-on: https://skia-review.googlesource.com/110220
> > Reviewed-by: Robert Phillips <robertphillips@google.com>
> > Commit-Queue: Robert Phillips <robertphillips@google.com>
>
> TBR=jvanverth@google.com,robertphillips@google.com
>
> Change-Id: I7c87b4523f9b53285f0de5c2d741a25893522d9a
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://skia-review.googlesource.com/110221
> Reviewed-by: Robert Phillips <robertphillips@google.com>
> Commit-Queue: Robert Phillips <robertphillips@google.com>
TBR=jvanverth@google.com,robertphillips@google.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Change-Id: I7dd73ab0159f38595f21b21eef3becc10aa0934d
Reviewed-on: https://skia-review.googlesource.com/111080
Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/ops')
-rw-r--r-- | src/gpu/ops/GrAtlasTextOp.cpp | 8 | ||||
-rw-r--r-- | src/gpu/ops/GrSmallPathRenderer.cpp | 49 |
2 files changed, 27 insertions, 30 deletions
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp index 952b3ba5ad..46f38099ec 100644 --- a/src/gpu/ops/GrAtlasTextOp.cpp +++ b/src/gpu/ops/GrAtlasTextOp.cpp @@ -222,8 +222,6 @@ 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; @@ -236,7 +234,7 @@ void GrAtlasTextOp::onPrepareDraws(Target* target) { unsigned int atlasPageCount; const sk_sp<GrTextureProxy>* proxies = fFontCache->getProxies(maskFormat, &atlasPageCount); - if (!proxies[0]) { + if (!atlasPageCount || !proxies[0]) { SkDebugf("Could not allocate backing texture for atlas\n"); return; } @@ -278,8 +276,8 @@ void GrAtlasTextOp::onPrepareDraws(Target* target) { const Geometry& args = fGeoData[i]; Blob* blob = args.fBlob; GrAtlasTextBlob::VertexRegenerator regenerator( - resourceProvider, blob, args.fRun, args.fSubRun, args.fViewMatrix, args.fX, args.fY, - args.fColor, target->deferredUploadTarget(), fFontCache, &glyphCache); + 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 c4201d7be2..3e7da52230 100644 --- a/src/gpu/ops/GrSmallPathRenderer.cpp +++ b/src/gpu/ops/GrSmallPathRenderer.cpp @@ -181,7 +181,7 @@ public: fHelper.visitProxies(func); const sk_sp<GrTextureProxy>* proxies = fAtlas->getProxies(); - for (uint32_t i = 0; i < fAtlas->numActivePages(); ++i) { + for (uint32_t i = 0; i < fAtlas->pageCount(); ++i) { SkASSERT(proxies[i]); func(proxies[i].get()); } @@ -222,6 +222,11 @@ private: FlushInfo flushInfo; flushInfo.fPipeline = fHelper.makePipeline(target); // Setup GrGeometryProcessor + GrDrawOpAtlas* atlas = fAtlas; + uint32_t atlasPageCount = atlas->pageCount(); + if (!atlasPageCount) { + return; + } const SkMatrix& ctm = fShapes[0].fViewMatrix; if (fUsesDistanceField) { uint32_t flags = 0; @@ -244,7 +249,7 @@ private: matrix = &SkMatrix::I(); } flushInfo.fGeometryProcessor = GrDistanceFieldPathGeoProc::Make( - *matrix, fAtlas->getProxies(), GrSamplerState::ClampBilerp(), flags); + *matrix, atlas->getProxies(), GrSamplerState::ClampBilerp(), flags); } else { SkMatrix invert; if (fHelper.usesLocalCoords()) { @@ -255,7 +260,7 @@ private: } flushInfo.fGeometryProcessor = GrBitmapTextGeoProc::Make( - this->color(), fAtlas->getProxies(), GrSamplerState::ClampNearest(), + this->color(), atlas->getProxies(), GrSamplerState::ClampNearest(), kA8_GrMaskFormat, invert, fHelper.usesLocalCoords()); } @@ -330,7 +335,7 @@ private: // check to see if df path is cached ShapeData::Key key(args.fShape, SkScalarCeilToInt(desiredDimension)); shapeData = fShapeCache->find(key); - if (nullptr == shapeData || !fAtlas->hasID(shapeData->fID)) { + if (nullptr == shapeData || !atlas->hasID(shapeData->fID)) { // Remove the stale cache entry if (shapeData) { fShapeCache->remove(shapeData->fKey); @@ -342,7 +347,7 @@ private: shapeData = new ShapeData; if (!this->addDFPathToAtlas(target, &flushInfo, - fAtlas, + atlas, shapeData, args.fShape, SkScalarCeilToInt(desiredDimension), @@ -355,7 +360,7 @@ private: // check to see if bitmap path is cached ShapeData::Key key(args.fShape, args.fViewMatrix); shapeData = fShapeCache->find(key); - if (nullptr == shapeData || !fAtlas->hasID(shapeData->fID)) { + if (nullptr == shapeData || !atlas->hasID(shapeData->fID)) { // Remove the stale cache entry if (shapeData) { fShapeCache->remove(shapeData->fKey); @@ -366,7 +371,7 @@ private: shapeData = new ShapeData; if (!this->addBMPathToAtlas(target, &flushInfo, - fAtlas, + atlas, shapeData, args.fShape, args.fViewMatrix)) { @@ -377,9 +382,9 @@ private: } auto uploadTarget = target->deferredUploadTarget(); - fAtlas->setLastUseToken(shapeData->fID, uploadTarget->tokenTracker()->nextDrawToken()); + atlas->setLastUseToken(shapeData->fID, uploadTarget->tokenTracker()->nextDrawToken()); - this->writePathVertices(fAtlas, + this->writePathVertices(atlas, offset, args.fColor, vertexStride, @@ -395,8 +400,6 @@ 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 @@ -485,11 +488,10 @@ private: SkIPoint16 atlasLocation; GrDrawOpAtlas::AtlasID id; auto uploadTarget = target->deferredUploadTarget(); - if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, width, height, - dfStorage.get(), &atlasLocation)) { + if (!atlas->addToAtlas(&id, uploadTarget, width, height, dfStorage.get(), &atlasLocation)) { this->flush(target, flushInfo); - if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, width, height, - dfStorage.get(), &atlasLocation)) { + if (!atlas->addToAtlas(&id, uploadTarget, width, height, dfStorage.get(), + &atlasLocation)) { return false; } } @@ -528,8 +530,6 @@ 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 +590,11 @@ private: SkIPoint16 atlasLocation; GrDrawOpAtlas::AtlasID id; auto uploadTarget = target->deferredUploadTarget(); - if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, dst.width(), dst.height(), - dst.addr(), &atlasLocation)) { + if (!atlas->addToAtlas(&id, uploadTarget, dst.width(), dst.height(), dst.addr(), + &atlasLocation)) { this->flush(target, flushInfo); - if (!atlas->addToAtlas(resourceProvider, &id, uploadTarget, dst.width(), dst.height(), - dst.addr(), &atlasLocation)) { + if (!atlas->addToAtlas(&id, uploadTarget, dst.width(), dst.height(), dst.addr(), + &atlasLocation)) { return false; } } @@ -696,7 +696,7 @@ private: void flush(GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const { GrGeometryProcessor* gp = flushInfo->fGeometryProcessor.get(); - if (gp->numTextureSamplers() != (int)fAtlas->numActivePages()) { + if (gp->numTextureSamplers() != (int)fAtlas->pageCount()) { // During preparation the number of atlas pages has increased. // Update the proxies used in the GP to match. if (fUsesDistanceField) { @@ -788,7 +788,7 @@ bool GrSmallPathRenderer::onDrawPath(const DrawPathArgs& args) { SkASSERT(!args.fShape->isEmpty()); SkASSERT(args.fShape->hasUnstyledKey()); if (!fAtlas) { - fAtlas = GrDrawOpAtlas::Make(args.fContext->contextPriv().proxyProvider(), + fAtlas = GrDrawOpAtlas::Make(args.fContext, kAlpha_8_GrPixelConfig, ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_HEIGHT, NUM_PLOTS_X, NUM_PLOTS_Y, @@ -858,8 +858,7 @@ GR_DRAW_OP_TEST_DEFINE(SmallPathOp) { if (context->uniqueID() != gTestStruct.fContextID) { gTestStruct.fContextID = context->uniqueID(); gTestStruct.reset(); - gTestStruct.fAtlas = GrDrawOpAtlas::Make(context->contextPriv().proxyProvider(), - kAlpha_8_GrPixelConfig, + gTestStruct.fAtlas = GrDrawOpAtlas::Make(context, kAlpha_8_GrPixelConfig, ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_HEIGHT, NUM_PLOTS_X, NUM_PLOTS_Y, GrDrawOpAtlas::AllowMultitexturing::kYes, |