Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: src/gpu/GrBatchAtlas.h

Issue 1835283002: Simplify GrDrawBatch uploads and token uage. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gm/convexpolyeffect.cpp ('k') | src/gpu/GrBatchAtlas.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrBatchAtlas_DEFINED 8 #ifndef GrBatchAtlas_DEFINED
9 #define GrBatchAtlas_DEFINED 9 #define GrBatchAtlas_DEFINED
10 10
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 58
59 uint64_t atlasGeneration() const { return fAtlasGeneration; } 59 uint64_t atlasGeneration() const { return fAtlasGeneration; }
60 60
61 inline bool hasID(AtlasID id) { 61 inline bool hasID(AtlasID id) {
62 uint32_t index = GetIndexFromID(id); 62 uint32_t index = GetIndexFromID(id);
63 SkASSERT(index < fNumPlots); 63 SkASSERT(index < fNumPlots);
64 return fPlotArray[index]->genID() == GetGenerationFromID(id); 64 return fPlotArray[index]->genID() == GetGenerationFromID(id);
65 } 65 }
66 66
67 // To ensure the atlas does not evict a given entry, the client must set the last use token 67 // To ensure the atlas does not evict a given entry, the client must set the last use token
68 inline void setLastUseToken(AtlasID id, GrBatchToken batchToken) { 68 inline void setLastUseToken(AtlasID id, GrBatchDrawToken batchToken) {
69 SkASSERT(this->hasID(id)); 69 SkASSERT(this->hasID(id));
70 uint32_t index = GetIndexFromID(id); 70 uint32_t index = GetIndexFromID(id);
71 SkASSERT(index < fNumPlots); 71 SkASSERT(index < fNumPlots);
72 this->makeMRU(fPlotArray[index]); 72 this->makeMRU(fPlotArray[index]);
73 fPlotArray[index]->setLastUseToken(batchToken); 73 fPlotArray[index]->setLastUseToken(batchToken);
74 } 74 }
75 75
76 inline void registerEvictionCallback(EvictionFunc func, void* userData) { 76 inline void registerEvictionCallback(EvictionFunc func, void* userData) {
77 EvictionData* data = fEvictionCallbacks.append(); 77 EvictionData* data = fEvictionCallbacks.append();
78 data->fFunc = func; 78 data->fFunc = func;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 } 117 }
118 118
119 static const int kMinItems = 4; 119 static const int kMinItems = 4;
120 static const int kMaxPlots = 32; 120 static const int kMaxPlots = 32;
121 SkSTArray<kMinItems, int, true> fPlotsToUpdate; 121 SkSTArray<kMinItems, int, true> fPlotsToUpdate;
122 uint32_t fPlotAlreadyUpdated; 122 uint32_t fPlotAlreadyUpdated;
123 123
124 friend class GrBatchAtlas; 124 friend class GrBatchAtlas;
125 }; 125 };
126 126
127 void setLastUseTokenBulk(const BulkUseTokenUpdater& updater, GrBatchToken ba tchToken) { 127 void setLastUseTokenBulk(const BulkUseTokenUpdater& updater, GrBatchDrawToke n batchToken) {
128 int count = updater.fPlotsToUpdate.count(); 128 int count = updater.fPlotsToUpdate.count();
129 for (int i = 0; i < count; i++) { 129 for (int i = 0; i < count; i++) {
130 BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]]; 130 BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]];
131 this->makeMRU(plot); 131 this->makeMRU(plot);
132 plot->setLastUseToken(batchToken); 132 plot->setLastUseToken(batchToken);
133 } 133 }
134 } 134 }
135 135
136 static const int kGlyphMaxDim = 256; 136 static const int kGlyphMaxDim = 256;
137 static bool GlyphTooLargeForAtlas(int width, int height) { 137 static bool GlyphTooLargeForAtlas(int width, int height) {
(...skipping 22 matching lines...) Expand all
160 } 160 }
161 SkDEBUGCODE(size_t bpp() const { return fBytesPerPixel; }) 161 SkDEBUGCODE(size_t bpp() const { return fBytesPerPixel; })
162 162
163 bool addSubImage(int width, int height, const void* image, SkIPoint16* l oc); 163 bool addSubImage(int width, int height, const void* image, SkIPoint16* l oc);
164 164
165 // To manage the lifetime of a plot, we use two tokens. We use the last upload token to 165 // To manage the lifetime of a plot, we use two tokens. We use the last upload token to
166 // know when we can 'piggy back' uploads, ie if the last upload hasn't b een flushed to gpu, 166 // know when we can 'piggy back' uploads, ie if the last upload hasn't b een flushed to gpu,
167 // we don't need to issue a new upload even if we update the cpu backing store. We use 167 // we don't need to issue a new upload even if we update the cpu backing store. We use
168 // lastUse to determine when we can evict a plot from the cache, ie if t he last use has 168 // lastUse to determine when we can evict a plot from the cache, ie if t he last use has
169 // already flushed through the gpu then we can reuse the plot. 169 // already flushed through the gpu then we can reuse the plot.
170 GrBatchToken lastUploadToken() const { return fLastUpload; } 170 GrBatchDrawToken lastUploadToken() const { return fLastUpload; }
171 GrBatchToken lastUseToken() const { return fLastUse; } 171 GrBatchDrawToken lastUseToken() const { return fLastUse; }
172 void setLastUploadToken(GrBatchToken batchToken) { 172 void setLastUploadToken(GrBatchDrawToken batchToken) { fLastUpload = bat chToken; }
173 SkASSERT(batchToken >= fLastUpload); 173 void setLastUseToken(GrBatchDrawToken batchToken) { fLastUse = batchToke n; }
174 fLastUpload = batchToken;
175 }
176 void setLastUseToken(GrBatchToken batchToken) {
177 SkASSERT(batchToken >= fLastUse);
178 fLastUse = batchToken;
179 }
180 174
181 void uploadToTexture(GrBatchUploader::TextureUploader* uploader, GrTextu re* texture); 175 void uploadToTexture(GrDrawBatch::WritePixelsFn&, GrTexture* texture);
182 void resetRects(); 176 void resetRects();
183 177
184 private: 178 private:
185 BatchPlot(int index, uint64_t genID, int offX, int offY, int width, int height, 179 BatchPlot(int index, uint64_t genID, int offX, int offY, int width, int height,
186 GrPixelConfig config); 180 GrPixelConfig config);
187 181
188 ~BatchPlot() override; 182 ~BatchPlot() override;
189 183
190 // Create a clone of this plot. The cloned plot will take the place of t he 184 // Create a clone of this plot. The cloned plot will take the place of t he
191 // current plot in the atlas. 185 // current plot in the atlas.
192 BatchPlot* clone() const { 186 BatchPlot* clone() const {
193 return new BatchPlot(fIndex, fGenID+1, fX, fY, fWidth, fHeight, fCon fig); 187 return new BatchPlot(fIndex, fGenID+1, fX, fY, fWidth, fHeight, fCon fig);
194 } 188 }
195 189
196 static GrBatchAtlas::AtlasID CreateId(uint32_t index, uint64_t generatio n) { 190 static GrBatchAtlas::AtlasID CreateId(uint32_t index, uint64_t generatio n) {
197 SkASSERT(index < (1 << 16)); 191 SkASSERT(index < (1 << 16));
198 SkASSERT(generation < ((uint64_t)1 << 48)); 192 SkASSERT(generation < ((uint64_t)1 << 48));
199 return generation << 16 | index; 193 return generation << 16 | index;
200 } 194 }
201 195
202 GrBatchToken fLastUpload; 196 GrBatchDrawToken fLastUpload;
203 GrBatchToken fLastUse; 197 GrBatchDrawToken fLastUse;
204 198
205 const uint32_t fIndex; 199 const uint32_t fIndex;
206 uint64_t fGenID; 200 uint64_t fGenID;
207 GrBatchAtlas::AtlasID fID; 201 GrBatchAtlas::AtlasID fID;
208 unsigned char* fData; 202 unsigned char* fData;
209 const int fWidth; 203 const int fWidth;
210 const int fHeight; 204 const int fHeight;
211 const int fX; 205 const int fX;
212 const int fY; 206 const int fY;
213 GrRectanizer* fRects; 207 GrRectanizer* fRects;
(...skipping 25 matching lines...) Expand all
239 if (fPlotList.head() == plot) { 233 if (fPlotList.head() == plot) {
240 return; 234 return;
241 } 235 }
242 236
243 fPlotList.remove(plot); 237 fPlotList.remove(plot);
244 fPlotList.addToHead(plot); 238 fPlotList.addToHead(plot);
245 } 239 }
246 240
247 inline void processEviction(AtlasID); 241 inline void processEviction(AtlasID);
248 242
249 friend class GrPlotUploader; // to access GrBatchPlot
250
251 GrTexture* fTexture; 243 GrTexture* fTexture;
252 SkDEBUGCODE(uint32_t fNumPlots;) 244 SkDEBUGCODE(uint32_t fNumPlots;)
253 245
254 uint64_t fAtlasGeneration; 246 uint64_t fAtlasGeneration;
255 247
256 struct EvictionData { 248 struct EvictionData {
257 EvictionFunc fFunc; 249 EvictionFunc fFunc;
258 void* fData; 250 void* fData;
259 }; 251 };
260 252
261 SkTDArray<EvictionData> fEvictionCallbacks; 253 SkTDArray<EvictionData> fEvictionCallbacks;
262 // allocated array of GrBatchPlots 254 // allocated array of GrBatchPlots
263 SkAutoTUnref<BatchPlot>* fPlotArray; 255 SkAutoTUnref<BatchPlot>* fPlotArray;
264 // LRU list of GrPlots (MRU at head - LRU at tail) 256 // LRU list of GrPlots (MRU at head - LRU at tail)
265 GrBatchPlotList fPlotList; 257 GrBatchPlotList fPlotList;
266 }; 258 };
267 259
268 #endif 260 #endif
OLDNEW
« no previous file with comments | « gm/convexpolyeffect.cpp ('k') | src/gpu/GrBatchAtlas.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698