Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 | |
| 2 /* | |
| 3 * Copyright 2010 Google Inc. | |
|
bsalomon
2015/03/05 22:11:08
copyrights on new files are all 2010
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 | |
| 9 #ifndef GrBatchAtlas_DEFINED | |
| 10 #define GrBatchAtlas_DEFINED | |
| 11 | |
| 12 #include "GrDrawTarget.h" | |
| 13 #include "GrTexture.h" | |
| 14 #include "SkPoint.h" | |
| 15 #include "SkTInternalLList.h" | |
| 16 | |
| 17 class GrBatchAtlas; | |
| 18 class GrBatchTarget; | |
| 19 class GrGpu; | |
| 20 class GrRectanizer; | |
| 21 | |
| 22 // The backing GrTexture for a set of GrAtlases is broken into a spatial grid of GrPlots. When | |
|
bsalomon
2015/03/05 22:20:49
for a GrAtlas, not a set of atlases, right?
Jvsquare
2015/03/06 15:45:36
This comment block is from GrAtlas.h, so any chang
| |
| 23 // a GrAtlas needs space on the texture, it requests a GrPlot. Each GrAtlas can claim one | |
|
bsalomon
2015/03/05 22:20:49
atlases claim plots or have plots?
| |
| 24 // or more GrPlots. The GrPlots keep track of subimage placement via their GrRec tanizer. Once a | |
| 25 // GrPlot is "full" (i.e. there is no room for the new subimage according to the GrRectanizer), the | |
| 26 // GrAtlas can request a new GrPlot via GrAtlas::addToAtlas(). | |
|
bsalomon
2015/03/05 22:20:49
Maybe in here state somewhere that plots accumulat
| |
| 27 // | |
| 28 // If all GrPlots are allocated, the replacement strategy is up to the client. T he drawToken is | |
|
bsalomon
2015/03/05 22:20:49
Document that the unit of replacement is the plot?
joshualitt
2015/03/09 19:45:15
I rewrote this entire comment in the cpp file
| |
| 29 // available to ensure that all draw calls are finished for that particular GrPl ot. | |
| 30 // GrAtlas::removeUnusedPlots() will free up any finished plots for a given GrAt las. | |
| 31 | |
| 32 class GrBatchPlot : public SkRefCnt { | |
|
bsalomon
2015/03/05 22:20:49
Do plots need to be exposed to client of GrBatchAt
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 33 public: | |
| 34 typedef GrDrawTarget::BatchToken BatchToken; | |
| 35 SK_DECLARE_INST_COUNT(GrBatchPlot); | |
| 36 SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrBatchPlot); | |
| 37 | |
| 38 // This returns a plot ID unique to each plot in a given GrAtlas. They are | |
|
bsalomon
2015/03/05 22:20:49
we usually use genID to mean an ID that changes wh
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 39 // consecutive and start at 0. | |
| 40 int id() const { return fID; } | |
| 41 int generation() const { return fGeneration; } | |
|
bsalomon
2015/03/05 22:20:49
comment about how this changes when content of the
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 42 | |
| 43 GrTexture* texture() const { return fTexture; } | |
| 44 | |
| 45 bool addSubImage(int width, int height, const void*, SkIPoint16*); | |
| 46 | |
| 47 BatchToken lastUploadToken() const { return fLastUpload; } | |
|
bsalomon
2015/03/05 22:20:49
These should be documented, esp lastRefToken
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 48 BatchToken lastRefToken() const { return fLastRef; } | |
| 49 void setLastUploadToken(BatchToken batchToken) { fLastUpload = batchToken; } | |
| 50 void setLastRefToken(BatchToken batchToken) { fLastRef = batchToken; } | |
| 51 | |
| 52 void uploadToTexture(); | |
| 53 | |
| 54 void resetRects(); | |
| 55 | |
| 56 int x() const { return fX; } | |
| 57 int y() const { return fY; } | |
| 58 | |
| 59 private: | |
| 60 GrBatchPlot(); | |
| 61 ~GrBatchPlot(); // does not try to delete the fNext field | |
| 62 void init(GrGpu*, GrBatchAtlas*, GrTexture*, int id, uint32_t generation, in t offX, int offY, | |
| 63 int width, int height, size_t bpp); | |
| 64 | |
| 65 BatchToken fLastUpload; | |
| 66 BatchToken fLastRef; | |
| 67 | |
| 68 uint32_t fID; | |
| 69 uint32_t fGeneration; | |
| 70 unsigned char* fPlotData; | |
| 71 int fPlotWidth; | |
|
bsalomon
2015/03/06 16:34:59
Do these really need plot in the name? The object
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 72 int fPlotHeight; | |
| 73 int fX; | |
| 74 int fY; | |
| 75 GrGpu* fGpu; | |
|
bsalomon
2015/03/06 16:34:59
Does this really need the gpu object, should it be
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 76 GrTexture* fTexture; | |
| 77 GrRectanizer* fRects; | |
| 78 GrBatchAtlas* fAtlas; | |
| 79 SkIPoint16 fOffset; // the offset of the plot in the backing texture | |
| 80 size_t fBytesPerPixel; | |
| 81 SkIRect fDirtyRect; | |
| 82 SkDEBUGCODE(bool fDirty;) | |
| 83 | |
| 84 friend class GrBatchAtlas; | |
| 85 | |
| 86 typedef SkRefCnt INHERITED; | |
| 87 }; | |
| 88 | |
| 89 class GrPlotUpdater { | |
|
bsalomon
2015/03/05 22:11:08
It really seems like this should be a generic uplo
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 90 public: | |
| 91 GrPlotUpdater() : fPlot(NULL) {} | |
| 92 GrPlotUpdater(GrBatchPlot* plot) : fPlot(SkRef(plot)) { SkASSERT(plot); } | |
| 93 GrPlotUpdater(const GrPlotUpdater& other) | |
| 94 : fPlot(SkRef(other.fPlot.get())) { | |
| 95 SkASSERT(other.fPlot); | |
| 96 } | |
| 97 GrDrawTarget::BatchToken lastUploadToken() const { return fPlot->lastUploadT oken(); } | |
| 98 void update() { fPlot->uploadToTexture(); } | |
| 99 | |
| 100 private: | |
| 101 SkAutoTUnref<GrBatchPlot> fPlot; | |
| 102 }; | |
| 103 | |
| 104 typedef SkTInternalLList<GrBatchPlot> GrBatchPlotList; | |
| 105 | |
| 106 class GrBatchAtlas { | |
| 107 public: | |
| 108 typedef GrDrawTarget::BatchToken BatchToken; | |
| 109 // An AtlasID is an opaque handle which callers can use to determine if the atlas contains | |
| 110 // a specific piece of data | |
| 111 typedef uint32_t AtlasID; | |
| 112 | |
| 113 GrBatchAtlas(GrGpu*, GrTexture*, int numPlotsX, int numPlotsY); | |
| 114 ~GrBatchAtlas(); | |
| 115 | |
| 116 // Adds a width x height subimage to the atlas. Upon success it returns | |
| 117 // the containing GrPlot and absolute location in the backing texture. | |
| 118 // NULL is returned if the subimage cannot fit in the atlas. | |
| 119 // If provided, the image data will either be immediately uploaded or | |
| 120 // written to the CPU-side backing bitmap. | |
| 121 bool addToAtlas(AtlasID*, GrBatchTarget*, int width, int height, const void* image, | |
| 122 SkIPoint16* loc); | |
| 123 | |
| 124 GrTexture* getTexture() const { return fTexture; } | |
| 125 | |
| 126 // A debug function to upload all plot data to the texture | |
| 127 void uploadPlotsToTexture(); | |
|
bsalomon
2015/03/05 22:11:08
SkDEBUGCODE()?
joshualitt
2015/03/09 19:45:15
Acknowledged.
| |
| 128 | |
| 129 bool hasID(AtlasID id) { | |
| 130 int index = this->getIndexFromID(id); | |
| 131 SkASSERT(index < fNumPlotsX * fNumPlotsY); | |
| 132 return fPlotArray[index]->generation() == this->getGenerationFromID(id); | |
|
bsalomon
2015/03/05 22:20:49
is this right? I would think that we'd be using id
joshualitt
2015/03/09 19:45:15
this is correct, I have renamed id to index to mak
| |
| 133 } | |
| 134 | |
| 135 void setLastRefToken(AtlasID id, BatchToken batchToken) { | |
| 136 SkASSERT(this->hasID(id)); | |
| 137 int index = this->getIndexFromID(id); | |
| 138 fPlotArray[index]->setLastRefToken(batchToken); | |
| 139 } | |
| 140 | |
| 141 private: | |
| 142 int getIndexFromID(AtlasID id) { | |
| 143 return (id >> 16) & 0xffff; | |
| 144 } | |
| 145 | |
| 146 int getGenerationFromID(AtlasID id) { | |
| 147 return id & 0xffff; | |
| 148 } | |
| 149 | |
| 150 inline void updatePlot(GrBatchTarget*, AtlasID*, GrBatchPlot*); | |
| 151 | |
| 152 void makeMRU(GrBatchPlot* plot); | |
| 153 | |
| 154 GrGpu* fGpu; | |
| 155 GrTexture* fTexture; | |
| 156 int fNumPlotsX; | |
| 157 int fNumPlotsY; | |
| 158 int fPlotWidth; | |
| 159 int fPlotHeight; | |
| 160 size_t fBPP; | |
| 161 | |
| 162 // allocated array of GrBatchPlots | |
| 163 SkAutoTUnref<GrBatchPlot>* fPlotArray; | |
| 164 // LRU list of GrPlots (MRU at head - LRU at tail) | |
| 165 GrBatchPlotList fPlotList; | |
| 166 | |
| 167 }; | |
| 168 | |
| 169 #endif | |
| OLD | NEW |