diff options
author | Robert Phillips <robertphillips@google.com> | 2018-02-23 12:09:22 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-02-26 14:56:17 +0000 |
commit | 96165ebeaa36a2aae0eedaf12d81f53d3caf999a (patch) | |
tree | f40174bb314aa1e17dea2c62af7851a2e2a59a57 /src/gpu/GrDrawOpAtlas.h | |
parent | 08c96b830ee9a94ededc5129d66148fb404c83f4 (diff) |
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>
Diffstat (limited to 'src/gpu/GrDrawOpAtlas.h')
-rw-r--r-- | src/gpu/GrDrawOpAtlas.h | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/gpu/GrDrawOpAtlas.h b/src/gpu/GrDrawOpAtlas.h index a2c985928d..b849d9e067 100644 --- a/src/gpu/GrDrawOpAtlas.h +++ b/src/gpu/GrDrawOpAtlas.h @@ -91,7 +91,8 @@ public: * eviction occurs * @return An initialized GrDrawOpAtlas, or nullptr if creation fails */ - static std::unique_ptr<GrDrawOpAtlas> Make(GrContext*, GrPixelConfig, int width, int height, + static std::unique_ptr<GrDrawOpAtlas> Make(GrProxyProvider*, GrPixelConfig, + int width, int height, int numPlotsX, int numPlotsY, AllowMultitexturing allowMultitexturing, GrDrawOpAtlas::EvictionFunc func, void* data); @@ -108,19 +109,21 @@ public: * 'setUseToken' with the currentToken from the GrDrawOp::Target, otherwise the next call to * addToAtlas might cause the previous data to be overwritten before it has been read. */ - bool addToAtlas(AtlasID*, GrDeferredUploadTarget*, int width, int height, const void* image, - SkIPoint16* loc); + bool addToAtlas(GrResourceProvider*, AtlasID*, GrDeferredUploadTarget*, int width, int height, + const void* image, SkIPoint16* loc); - GrContext* context() const { return fContext; } const sk_sp<GrTextureProxy>* getProxies() const { return fProxies; } uint64_t atlasGeneration() const { return fAtlasGeneration; } inline bool hasID(AtlasID id) { + if (kInvalidAtlasID == id) { + return false; + } uint32_t plot = GetPlotIndexFromID(id); SkASSERT(plot < fNumPlots); uint32_t page = GetPageIndexFromID(id); - SkASSERT(page < fNumPages); + SkASSERT(page < fNumActivePages); return fPages[page].fPlotArray[plot]->genID() == GetGenerationFromID(id); } @@ -130,7 +133,7 @@ public: uint32_t plotIdx = GetPlotIndexFromID(id); SkASSERT(plotIdx < fNumPlots); uint32_t pageIdx = GetPageIndexFromID(id); - SkASSERT(pageIdx < fNumPages); + SkASSERT(pageIdx < fNumActivePages); Plot* plot = fPages[pageIdx].fPlotArray[plotIdx].get(); this->makeMRU(plot, pageIdx); plot->setLastUseToken(token); @@ -142,7 +145,7 @@ public: data->fData = userData; } - uint32_t pageCount() { return fNumPages; } + uint32_t numActivePages() { return fNumActivePages; } /** * A class which can be handed back to GrDrawOpAtlas for updating last use tokens in bulk. The @@ -204,7 +207,7 @@ public: const BulkUseTokenUpdater::PlotData& pd = updater.fPlotsToUpdate[i]; // it's possible we've added a plot to the updater and subsequently the plot's page // was deleted -- so we check to prevent a crash - if (pd.fPageIndex < fNumPages) { + if (pd.fPageIndex < fNumActivePages) { Plot* plot = fPages[pd.fPageIndex].fPlotArray[pd.fPlotIndex].get(); this->makeMRU(plot, pd.fPageIndex); plot->setLastUseToken(token); @@ -225,12 +228,14 @@ public: void instantiate(GrOnFlushResourceProvider*); -private: uint32_t maxPages() const { return AllowMultitexturing::kYes == fAllowMultitexturing ? kMaxMultitexturePages : 1; } - GrDrawOpAtlas(GrContext*, GrPixelConfig config, int width, int height, int numPlotsX, + int numAllocated_TestingOnly() const; + +private: + GrDrawOpAtlas(GrProxyProvider*, GrPixelConfig, int width, int height, int numPlotsX, int numPlotsY, AllowMultitexturing allowMultitexturing); /** @@ -354,8 +359,9 @@ private: // the front and remove from the back there is no need for MRU. } - bool createNewPage(); - void deleteLastPage(); + bool createPages(GrProxyProvider*); + bool activateNewPage(GrResourceProvider*); + void deactivateLastPage(); void processEviction(AtlasID); inline void processEvictionAndResetRects(Plot* plot) { @@ -363,7 +369,6 @@ private: plot->resetRects(); } - GrContext* fContext; GrPixelConfig fPixelConfig; int fTextureWidth; int fTextureHeight; @@ -392,7 +397,8 @@ private: sk_sp<GrTextureProxy> fProxies[kMaxMultitexturePages]; Page fPages[kMaxMultitexturePages]; AllowMultitexturing fAllowMultitexturing; - uint32_t fNumPages; + + uint32_t fNumActivePages; }; #endif |