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

Unified Diff: src/gpu/GrBatchAtlas.h

Issue 975303005: Creation of GrBatchAtlas and Distancefieldpathrenderer batch (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: more tidying Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrBatchAtlas.h
diff --git a/src/gpu/GrBatchAtlas.h b/src/gpu/GrBatchAtlas.h
new file mode 100644
index 0000000000000000000000000000000000000000..fd16d311752219cc7041d915dd79e8d67b3fa7ec
--- /dev/null
+++ b/src/gpu/GrBatchAtlas.h
@@ -0,0 +1,169 @@
+
+/*
+ * 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.
+ *
+ * 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 "GrDrawTarget.h"
+#include "GrTexture.h"
+#include "SkPoint.h"
+#include "SkTInternalLList.h"
+
+class GrBatchAtlas;
+class GrBatchTarget;
+class GrGpu;
+class GrRectanizer;
+
+// 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
+// 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?
+// 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 GrAtlas::addToAtlas().
bsalomon 2015/03/05 22:20:49 Maybe in here state somewhere that plots accumulat
+//
+// If all GrPlots are allocated, the replacement strategy is up to the client. The 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
+// available to ensure that all draw calls are finished for that particular GrPlot.
+// GrAtlas::removeUnusedPlots() will free up any finished plots for a given GrAtlas.
+
+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.
+public:
+ typedef GrDrawTarget::BatchToken BatchToken;
+ SK_DECLARE_INST_COUNT(GrBatchPlot);
+ SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrBatchPlot);
+
+ // 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.
+ // consecutive and start at 0.
+ int id() const { return fID; }
+ 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.
+
+ GrTexture* texture() const { return fTexture; }
+
+ bool addSubImage(int width, int height, const void*, SkIPoint16*);
+
+ 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.
+ BatchToken lastRefToken() const { return fLastRef; }
+ void setLastUploadToken(BatchToken batchToken) { fLastUpload = batchToken; }
+ void setLastRefToken(BatchToken batchToken) { fLastRef = batchToken; }
+
+ void uploadToTexture();
+
+ void resetRects();
+
+ int x() const { return fX; }
+ int y() const { return fY; }
+
+private:
+ GrBatchPlot();
+ ~GrBatchPlot(); // does not try to delete the fNext field
+ void init(GrGpu*, GrBatchAtlas*, GrTexture*, int id, uint32_t generation, int offX, int offY,
+ int width, int height, size_t bpp);
+
+ BatchToken fLastUpload;
+ BatchToken fLastRef;
+
+ uint32_t fID;
+ uint32_t fGeneration;
+ unsigned char* fPlotData;
+ 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.
+ int fPlotHeight;
+ int fX;
+ int fY;
+ 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.
+ GrTexture* fTexture;
+ GrRectanizer* fRects;
+ GrBatchAtlas* fAtlas;
+ SkIPoint16 fOffset; // the offset of the plot in the backing texture
+ size_t fBytesPerPixel;
+ SkIRect fDirtyRect;
+ SkDEBUGCODE(bool fDirty;)
+
+ friend class GrBatchAtlas;
+
+ typedef SkRefCnt INHERITED;
+};
+
+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.
+public:
+ GrPlotUpdater() : fPlot(NULL) {}
+ GrPlotUpdater(GrBatchPlot* plot) : fPlot(SkRef(plot)) { SkASSERT(plot); }
+ GrPlotUpdater(const GrPlotUpdater& other)
+ : fPlot(SkRef(other.fPlot.get())) {
+ SkASSERT(other.fPlot);
+ }
+ GrDrawTarget::BatchToken lastUploadToken() const { return fPlot->lastUploadToken(); }
+ void update() { fPlot->uploadToTexture(); }
+
+private:
+ SkAutoTUnref<GrBatchPlot> fPlot;
+};
+
+typedef SkTInternalLList<GrBatchPlot> GrBatchPlotList;
+
+class GrBatchAtlas {
+public:
+ typedef GrDrawTarget::BatchToken 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;
+
+ GrBatchAtlas(GrGpu*, 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 either be immediately uploaded or
+ // 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; }
+
+ // A debug function to upload all plot data to the texture
+ void uploadPlotsToTexture();
bsalomon 2015/03/05 22:11:08 SkDEBUGCODE()?
joshualitt 2015/03/09 19:45:15 Acknowledged.
+
+ bool hasID(AtlasID id) {
+ int index = this->getIndexFromID(id);
+ SkASSERT(index < fNumPlotsX * fNumPlotsY);
+ 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
+ }
+
+ void setLastRefToken(AtlasID id, BatchToken batchToken) {
+ SkASSERT(this->hasID(id));
+ int index = this->getIndexFromID(id);
+ fPlotArray[index]->setLastRefToken(batchToken);
+ }
+
+private:
+ int getIndexFromID(AtlasID id) {
+ return (id >> 16) & 0xffff;
+ }
+
+ int getGenerationFromID(AtlasID id) {
+ return id & 0xffff;
+ }
+
+ inline void updatePlot(GrBatchTarget*, AtlasID*, GrBatchPlot*);
+
+ void makeMRU(GrBatchPlot* plot);
+
+ GrGpu* fGpu;
+ GrTexture* fTexture;
+ int fNumPlotsX;
+ int fNumPlotsY;
+ int fPlotWidth;
+ int fPlotHeight;
+ size_t fBPP;
+
+ // allocated array of GrBatchPlots
+ SkAutoTUnref<GrBatchPlot>* fPlotArray;
+ // LRU list of GrPlots (MRU at head - LRU at tail)
+ GrBatchPlotList fPlotList;
+
+};
+
+#endif

Powered by Google App Engine
This is Rietveld 408576698