Chromium Code Reviews| Index: src/gpu/GrBatchAtlas.h |
| diff --git a/src/gpu/GrBatchAtlas.h b/src/gpu/GrBatchAtlas.h |
| index cd8123f140980fdb581ceb9789948098c85d7452..4ff3cd620fccb2dbcac1c3028b8d83470e4709e6 100644 |
| --- a/src/gpu/GrBatchAtlas.h |
| +++ b/src/gpu/GrBatchAtlas.h |
| @@ -40,6 +40,9 @@ public: |
| // the containing GrPlot and absolute location in the backing texture. |
| // NULL is returned if the subimage cannot fit in the atlas. |
| // If provided, the image data will be written to the CPU-side backing bitmap. |
| + // NOTE: If the client intends to refer to the atlas, they should immediately call 'setUseToken' |
| + // with the currentToken from the batch target, otherwise the next call to addToAtlas might |
| + // cause an eviction |
| bool addToAtlas(AtlasID*, GrBatchTarget*, int width, int height, const void* image, |
| SkIPoint16* loc); |
| @@ -47,19 +50,58 @@ public: |
| uint64_t atlasGeneration() const { return fAtlasGeneration; } |
| bool hasID(AtlasID id); |
| - void setLastRefToken(AtlasID id, BatchToken batchToken); |
| + |
| + // To ensure the atlas does not evict a given entry, the client must set the last use token |
| + void setLastUseToken(AtlasID id, BatchToken batchToken); |
| void registerEvictionCallback(EvictionFunc func, void* userData) { |
| EvictionData* data = fEvictionCallbacks.append(); |
| data->fFunc = func; |
| data->fData = userData; |
| } |
| + /* |
| + * A class which can be handed back to GrBatchAtlas for updating in bulk last use tokens. |
|
robertphillips
2015/04/07 12:18:33
Maybe a comment re the maxplots limit (e.g., for t
|
| + */ |
| + class BulkUseTokenUpdater { |
| + public: |
| + BulkUseTokenUpdater() : fPlotAlreadyUpdated(0) {} |
| + void add(AtlasID id) { |
| + int index = GrBatchAtlas::GetIndexFromID(id); |
| + if (!this->find(index)) { |
| + this->set(index); |
| + } |
| + } |
| + |
| + void reset() { |
| + fPlotsToUpdate.reset(); |
| + fPlotAlreadyUpdated = 0; |
| + } |
| + |
| + private: |
| + bool find(int index) const { |
|
robertphillips
2015/04/07 12:18:33
SkASSERT(index < kMaxPlots); ?
|
| + return (fPlotAlreadyUpdated >> index) & 1; |
| + } |
| + void set(int index) { |
| + SkASSERT(!this->find(index)); |
| + fPlotAlreadyUpdated = fPlotAlreadyUpdated | (1 << index); |
| + fPlotsToUpdate.push_back(index); |
| + } |
| + |
| + static const int kMaxPlots = 32; |
| + uint32_t fPlotAlreadyUpdated; |
| + SkSTArray<4, int, true> fPlotsToUpdate; |
| + |
| + friend class GrBatchAtlas; |
| + }; |
| + |
| + void setLastUseTokenBulk(const BulkUseTokenUpdater& reffer, BatchToken); |
| + |
| private: |
| - int getIndexFromID(AtlasID id) { |
| + static int GetIndexFromID(AtlasID id) { |
| return id & 0xffff; |
| } |
| - int getGenerationFromID(AtlasID id) { |
| + static int GetGenerationFromID(AtlasID id) { |
| return (id >> 16) & 0xffff; |
| } |