Index: src/gpu/GrBatchAtlas.h |
diff --git a/src/gpu/GrBatchAtlas.h b/src/gpu/GrBatchAtlas.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b514b9d74fbcc0b3198109ebaf86eb387283a617 |
--- /dev/null |
+++ b/src/gpu/GrBatchAtlas.h |
@@ -0,0 +1,88 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrBatchAtlas_DEFINED |
+#define GrBatchAtlas_DEFINED |
+ |
+#include "GrTexture.h" |
+#include "SkPoint.h" |
+#include "SkTDArray.h" |
+#include "SkTInternalLList.h" |
+ |
+class BatchPlot; |
+class GrBatchTarget; |
+class GrRectanizer; |
+ |
+typedef SkTInternalLList<BatchPlot> GrBatchPlotList; |
+ |
+class GrBatchAtlas { |
+public: |
+ typedef uint64_t BatchToken; |
+ // An AtlasID is an opaque handle which callers can use to determine if the atlas contains |
+ // a specific piece of data |
+ typedef uint32_t AtlasID; |
+ |
+ // A function pointer for use as a callback during eviction. Whenever GrBatchAtlas evicts a |
+ // specific AtlasID, it will call all of the registered listeners so they can optionally process |
+ // the eviction |
+ typedef void (*EvictionFunc)(GrBatchAtlas::AtlasID, void*); |
+ |
+ GrBatchAtlas(GrTexture*, int numPlotsX, int numPlotsY); |
+ ~GrBatchAtlas(); |
+ |
+ // Adds a width x height subimage to the atlas. Upon success it returns |
+ // 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. |
+ bool addToAtlas(AtlasID*, GrBatchTarget*, int width, int height, const void* image, |
+ SkIPoint16* loc); |
+ |
+ GrTexture* getTexture() const { return fTexture; } |
+ |
+ bool hasID(AtlasID id); |
+ void setLastRefToken(AtlasID id, BatchToken batchToken); |
+ void registerEvictionCallback(EvictionFunc func, void* userData) { |
+ EvictionData* data = fEvictionCallbacks.append(); |
+ data->fFunc = func; |
+ data->fData = userData; |
+ } |
+ |
+private: |
+ int getIndexFromID(AtlasID id) { |
+ return id & 0xffff; |
+ } |
+ |
+ int getGenerationFromID(AtlasID id) { |
+ return (id >> 16) & 0xffff; |
+ } |
+ |
+ inline void updatePlot(GrBatchTarget*, AtlasID*, BatchPlot*); |
+ |
+ inline void makeMRU(BatchPlot* plot); |
+ |
+ inline void processEviction(AtlasID); |
+ |
+ GrTexture* fTexture; |
+ int fNumPlotsX; |
+ int fNumPlotsY; |
+ int fPlotWidth; |
+ int fPlotHeight; |
+ size_t fBPP; |
+ |
+ struct EvictionData { |
+ EvictionFunc fFunc; |
+ void* fData; |
+ }; |
+ |
+ SkTDArray<EvictionData> fEvictionCallbacks; |
+ // allocated array of GrBatchPlots |
+ SkAutoTUnref<BatchPlot>* fPlotArray; |
+ // LRU list of GrPlots (MRU at head - LRU at tail) |
+ GrBatchPlotList fPlotList; |
+}; |
+ |
+#endif |