Index: src/gpu/GrAtlas.h |
diff --git a/src/gpu/GrAtlas.h b/src/gpu/GrAtlas.h |
index b2acaee8e277d35e0146745c41a4f7849d249424..d06bba1435156978f1bea1d90b0c8927139859a1 100644 |
--- a/src/gpu/GrAtlas.h |
+++ b/src/gpu/GrAtlas.h |
@@ -6,11 +6,10 @@ |
* found in the LICENSE file. |
*/ |
- |
- |
#ifndef GrAtlas_DEFINED |
#define GrAtlas_DEFINED |
+ |
#include "GrPoint.h" |
#include "GrTexture.h" |
#include "GrDrawTarget.h" |
@@ -18,69 +17,93 @@ |
class GrGpu; |
class GrRectanizer; |
class GrAtlasMgr; |
- |
-class GrAtlas { |
+class GrAtlas; |
+ |
+// The backing GrTexture for a set of GrAtlases is broken into a spatial grid of GrPlots. When |
+// a GrAtlas needs space on the texture, it requests a GrPlot. Each GrAtlas can claim one |
+// or more GrPlots. The GrPlots keep track of subimage placement via their GrRectanizer. Once a |
+// GrPlot is "full" (i.e. there is no room for the new subimage according to the GrRectanizer), the |
+// GrAtlas can request a new GrPlot via GrAtlasMgr::addToAtlas(). |
+// |
+// If all GrPlots are allocated, the replacement strategy is up to the client. The drawToken is |
+// available to ensure that all draw calls are finished for that particular GrPlot. |
+// GrAtlasMgr::removeUnusedPlots() will free up any finished plots for a given GrAtlas. |
+ |
+class GrPlot { |
public: |
- int getPlotX() const { return fPlot.fX; } |
- int getPlotY() const { return fPlot.fY; } |
+ int getOffsetX() const { return fOffset.fX; } |
+ int getOffsetY() const { return fOffset.fY; } |
GrTexture* texture() const { return fTexture; } |
bool addSubImage(int width, int height, const void*, GrIPoint16*); |
- static void FreeLList(GrAtlas* atlas) { |
- while (NULL != atlas) { |
- GrAtlas* next = atlas->fNext; |
- delete atlas; |
- atlas = next; |
- } |
- } |
- |
- static bool RemoveUnusedAtlases(GrAtlasMgr* atlasMgr, GrAtlas** startAtlas); |
- |
GrDrawTarget::DrawToken drawToken() const { return fDrawToken; } |
void setDrawToken(GrDrawTarget::DrawToken draw) { fDrawToken = draw; } |
private: |
- GrAtlas(GrAtlasMgr*, int plotX, int plotY, int bpp); |
- ~GrAtlas(); // does not try to delete the fNext field |
+ GrPlot(); |
+ ~GrPlot(); // does not try to delete the fNext field |
// for recycling |
GrDrawTarget::DrawToken fDrawToken; |
- GrAtlas* fNext; |
+ GrPlot* fNext; |
GrTexture* fTexture; |
GrRectanizer* fRects; |
GrAtlasMgr* fAtlasMgr; |
- GrIPoint16 fPlot; |
+ GrIPoint16 fOffset; |
int fBytesPerPixel; |
friend class GrAtlasMgr; |
}; |
-class GrPlotMgr; |
- |
class GrAtlasMgr { |
public: |
GrAtlasMgr(GrGpu*, GrPixelConfig); |
~GrAtlasMgr(); |
- GrAtlas* addToAtlas(GrAtlas**, int width, int height, const void*, GrIPoint16*); |
- void deleteAtlas(GrAtlas* atlas) { delete atlas; } |
- |
+ // add subimage of width, height dimensions to atlas |
+ // returns the containing GrPlot and location relative to the backing texture |
+ GrPlot* addToAtlas(GrAtlas*, int width, int height, const void*, GrIPoint16*); |
+ |
+ // free up any plots that are not waiting on a draw call |
+ bool removeUnusedPlots(GrAtlas* atlas); |
+ |
+ // to be called by ~GrAtlas() |
+ void deletePlotList(GrPlot* plot); |
+ |
GrTexture* getTexture() const { |
return fTexture; |
} |
- // to be called by ~GrAtlas() |
- void freePlot(int x, int y); |
- |
private: |
+ GrPlot* allocPlot(); |
+ void freePlot(GrPlot* plot); |
+ |
GrGpu* fGpu; |
GrPixelConfig fPixelConfig; |
GrTexture* fTexture; |
- GrPlotMgr* fPlotMgr; |
+ |
+ // allocated array of GrPlots |
+ GrPlot* fPlots; |
+ // linked list of free GrPlots |
+ GrPlot* fFreePlots; |
+}; |
+ |
+class GrAtlas { |
+public: |
+ GrAtlas(GrAtlasMgr* mgr) : fPlots(NULL), fAtlasMgr(mgr) { } |
+ ~GrAtlas() { fAtlasMgr->deletePlotList(fPlots); } |
+ |
+ bool isEmpty() { return NULL == fPlots; } |
+ |
+private: |
+ GrPlot* fPlots; |
+ GrAtlasMgr* fAtlasMgr; |
+ |
+ friend class GrAtlasMgr; |
}; |
#endif |