diff options
author | Robert Phillips <robertphillips@google.com> | 2018-03-01 10:24:02 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-03-01 15:47:34 +0000 |
commit | 4bc7011802e411da74eb2d213d6328e42f7dce1c (patch) | |
tree | ce17ae0fba6ccf8dfd060d318b23cd6fb454c58b /src/gpu/effects/GrDistanceFieldGeoProc.cpp | |
parent | a63d6900d3baa23d6340a265bd0cf4f55ca2fdd9 (diff) |
Separate creation time & flush time behavior in GrDrawOpAtlas (take 3)
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.
TBR=bsalomon@google.com
Change-Id: I276d339d81e7b709140e082a7b58c5584f73ab70
Reviewed-on: https://skia-review.googlesource.com/111100
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.cpp')
-rw-r--r-- | src/gpu/effects/GrDistanceFieldGeoProc.cpp | 86 |
1 files changed, 55 insertions, 31 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp index 4b743b0ea9..92a53bf185 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp +++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp @@ -207,7 +207,8 @@ private: /////////////////////////////////////////////////////////////////////////////// GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc( - const sk_sp<GrTextureProxy> proxies[kMaxTextures], + const sk_sp<GrTextureProxy>* proxies, + int numProxies, const GrSamplerState& params, #ifdef SK_GAMMA_APPLY_TO_A8 float distanceAdjust, @@ -221,6 +222,8 @@ GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc( , fFlags(flags & kNonLCD_DistanceFieldEffectMask) , fInColor(nullptr) , fLocalMatrix(localMatrix) { + SkASSERT(numProxies <= kMaxTextures); + SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); if (flags & kPerspective_DistanceFieldEffectFlag) { fInPosition = &this->addVertexAttrib("inPosition", kFloat3_GrVertexAttribType); @@ -229,18 +232,23 @@ GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc( } fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType); fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType); - for (int i = 0; i < kMaxTextures; ++i) { - if (proxies[i]) { - fTextureSamplers[i].reset(std::move(proxies[i]), params); - this->addTextureSampler(&fTextureSamplers[i]); - } + for (int i = 0; i < numProxies; ++i) { + SkASSERT(proxies[i]); + + fTextureSamplers[i].reset(std::move(proxies[i]), params); + this->addTextureSampler(&fTextureSamplers[i]); } } -void GrDistanceFieldA8TextGeoProc::addNewProxies(const sk_sp<GrTextureProxy> proxies[kMaxTextures], +void GrDistanceFieldA8TextGeoProc::addNewProxies(const sk_sp<GrTextureProxy>* proxies, + int numProxies, const GrSamplerState& params) { - for (int i = 0; i < kMaxTextures; ++i) { - if (proxies[i] && !fTextureSamplers[i].isInitialized()) { + SkASSERT(numProxies <= kMaxTextures); + + for (int i = 0; i < numProxies; ++i) { + SkASSERT(proxies[i]); + + if (!fTextureSamplers[i].isInitialized()) { fTextureSamplers[i].reset(std::move(proxies[i]), params); this->addTextureSampler(&fTextureSamplers[i]); } @@ -287,7 +295,7 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorT #ifdef SK_GAMMA_APPLY_TO_A8 float lum = d->fRandom->nextF(); #endif - return GrDistanceFieldA8TextGeoProc::Make(proxies, + return GrDistanceFieldA8TextGeoProc::Make(proxies, 1, samplerState, #ifdef SK_GAMMA_APPLY_TO_A8 lum, @@ -493,29 +501,37 @@ private: /////////////////////////////////////////////////////////////////////////////// GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( const SkMatrix& matrix, - const sk_sp<GrTextureProxy> proxies[kMaxTextures], + const sk_sp<GrTextureProxy>* proxies, + int numProxies, const GrSamplerState& params, uint32_t flags) : INHERITED(kGrDistanceFieldPathGeoProc_ClassID) , fMatrix(matrix) , fFlags(flags & kNonLCD_DistanceFieldEffectMask) , fInColor(nullptr) { + SkASSERT(numProxies <= kMaxTextures); + SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType); fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType); fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType); - for (int i = 0; i < kMaxTextures; ++i) { - if (proxies[i]) { - fTextureSamplers[i].reset(std::move(proxies[i]), params); - this->addTextureSampler(&fTextureSamplers[i]); - } + for (int i = 0; i < numProxies; ++i) { + SkASSERT(proxies[i]); + + fTextureSamplers[i].reset(std::move(proxies[i]), params); + this->addTextureSampler(&fTextureSamplers[i]); } } -void GrDistanceFieldPathGeoProc::addNewProxies(const sk_sp<GrTextureProxy> proxies[kMaxTextures], +void GrDistanceFieldPathGeoProc::addNewProxies(const sk_sp<GrTextureProxy>* proxies, + int numProxies, const GrSamplerState& params) { - for (int i = 0; i < kMaxTextures; ++i) { - if (proxies[i] && !fTextureSamplers[i].isInitialized()) { + SkASSERT(numProxies <= kMaxTextures); + + for (int i = 0; i < numProxies; ++i) { + SkASSERT(proxies[i]); + + if (!fTextureSamplers[i].isInitialized()) { fTextureSamplers[i].reset(std::move(proxies[i]), params); this->addTextureSampler(&fTextureSamplers[i]); } @@ -560,7 +576,7 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTes } return GrDistanceFieldPathGeoProc::Make(GrTest::TestMatrix(d->fRandom), - proxies, + proxies, 1, samplerState, flags); } @@ -787,7 +803,8 @@ private: /////////////////////////////////////////////////////////////////////////////// GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( - const sk_sp<GrTextureProxy> proxies[kMaxTextures], + const sk_sp<GrTextureProxy>* proxies, + int numProxies, const GrSamplerState& params, DistanceAdjust distanceAdjust, uint32_t flags, @@ -796,6 +813,8 @@ GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( , fDistanceAdjust(distanceAdjust) , fFlags(flags & kLCD_DistanceFieldEffectMask) , fLocalMatrix(localMatrix) { + SkASSERT(numProxies <= kMaxTextures); + SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag)); if (fFlags & kPerspective_DistanceFieldEffectFlag) { fInPosition = &this->addVertexAttrib("inPosition", kFloat3_GrVertexAttribType); @@ -804,19 +823,24 @@ GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( } fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType); fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType); - for (int i = 0; i < kMaxTextures; ++i) { - if (proxies[i]) { - fTextureSamplers[i].reset(std::move(proxies[i]), params); - this->addTextureSampler(&fTextureSamplers[i]); - } + for (int i = 0; i < numProxies; ++i) { + SkASSERT(proxies[i]); + + fTextureSamplers[i].reset(std::move(proxies[i]), params); + this->addTextureSampler(&fTextureSamplers[i]); } } -void GrDistanceFieldLCDTextGeoProc::addNewProxies(const sk_sp<GrTextureProxy> prox[kMaxTextures], +void GrDistanceFieldLCDTextGeoProc::addNewProxies(const sk_sp<GrTextureProxy>* proxies, + int numProxies, const GrSamplerState& params) { - for (int i = 0; i < kMaxTextures; ++i) { - if (prox[i] && !fTextureSamplers[i].isInitialized()) { - fTextureSamplers[i].reset(std::move(prox[i]), params); + SkASSERT(numProxies <= kMaxTextures); + + for (int i = 0; i < numProxies; ++i) { + SkASSERT(proxies[i]); + + if (!fTextureSamplers[i].isInitialized()) { + fTextureSamplers[i].reset(std::move(proxies[i]), params); this->addTextureSampler(&fTextureSamplers[i]); } } @@ -859,6 +883,6 @@ sk_sp<GrGeometryProcessor> GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessor } flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; SkMatrix localMatrix = GrTest::TestMatrix(d->fRandom); - return GrDistanceFieldLCDTextGeoProc::Make(proxies, samplerState, wa, flags, localMatrix); + return GrDistanceFieldLCDTextGeoProc::Make(proxies, 1, samplerState, wa, flags, localMatrix); } #endif |