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

Unified Diff: src/gpu/GrFlushToGpuDrawTarget.h

Issue 773433002: Add a base class for GrIODB that handles geometry data (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: cleanup Created 6 years 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
« no previous file with comments | « src/gpu/GrDrawTarget.cpp ('k') | src/gpu/GrFlushToGpuDrawTarget.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrFlushToGpuDrawTarget.h
diff --git a/src/gpu/GrFlushToGpuDrawTarget.h b/src/gpu/GrFlushToGpuDrawTarget.h
new file mode 100644
index 0000000000000000000000000000000000000000..f3f34b0cc8764c285d514784bee43ed239f8c622
--- /dev/null
+++ b/src/gpu/GrFlushToGpuDrawTarget.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrFlushToGpuDrawTarget_DEFINED
+#define GrFlushToGpuDrawTarget_DEFINED
+
+#include "GrDrawTarget.h"
+
+class GrIndexBufferAllocPool;
+class GrVertexBufferAllocPool;
+class GrGpu;
+
+/**
+ * Base class for draw targets that accumulate index and vertex data in buffers for deferred.
+ * When draw target clients reserve geometry this subclass will place that geometry into
+ * preallocated vertex/index buffers in the order the requests are made (assuming the requests fit
+ * in the preallocated buffers).
+ */
+class GrFlushToGpuDrawTarget : public GrClipTarget {
+public:
+ GrFlushToGpuDrawTarget(GrGpu*, GrVertexBufferAllocPool*,GrIndexBufferAllocPool*);
+
+ ~GrFlushToGpuDrawTarget() SK_OVERRIDE;
+
+ /**
+ * Empties the draw buffer of any queued up draws. This must not be called while inside an
+ * unbalanced pushGeometrySource().
+ */
+ void reset();
+
+ /**
+ * This plays any queued up draws to its GrGpu target. It also resets this object (i.e. flushing
+ * is destructive). This buffer must not have an active reserved vertex or index source. Any
+ * reserved geometry on the target will be finalized because it's geometry source will be pushed
+ * before flushing and popped afterwards.
+ */
+ void flush();
+
+ bool geometryHints(size_t vertexStride, int* vertexCount, int* indexCount) const SK_OVERRIDE;
+
+protected:
+ GrGpu* getGpu() { return fGpu; }
+ const GrGpu* getGpu() const{ return fGpu; }
+
+private:
+ enum {
+ kGeoPoolStatePreAllocCnt = 4,
+ };
+
+ struct GeometryPoolState {
+ const GrVertexBuffer* fPoolVertexBuffer;
+ int fPoolStartVertex;
+ const GrIndexBuffer* fPoolIndexBuffer;
+ int fPoolStartIndex;
+ // caller may conservatively over reserve vertices / indices.
+ // we release unused space back to allocator if possible
+ // can only do this if there isn't an intervening pushGeometrySource()
+ size_t fUsedPoolVertexBytes;
+ size_t fUsedPoolIndexBytes;
+ };
+
+ typedef SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> GeoPoolStateStack;
+
+ virtual void onReset() = 0;
+
+ virtual void onFlush() = 0;
+
+ void setDrawBuffers(DrawInfo*, size_t stride) SK_OVERRIDE;
+ bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) SK_OVERRIDE;
+ bool onReserveIndexSpace(int indexCount, void** indices) SK_OVERRIDE;
+ void releaseReservedVertexSpace() SK_OVERRIDE;
+ void releaseReservedIndexSpace() SK_OVERRIDE;
+ void geometrySourceWillPush() SK_OVERRIDE;
+ void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRIDE;
+ void willReserveVertexAndIndexSpace(int vertexCount,
+ size_t vertexStride,
+ int indexCount) SK_OVERRIDE;
+
+ GeoPoolStateStack fGeoPoolStateStack;
+ SkAutoTUnref<GrGpu> fGpu;
+ GrVertexBufferAllocPool* fVertexPool;
+ GrIndexBufferAllocPool* fIndexPool;
+ bool fFlushing;
+
+ typedef GrClipTarget INHERITED;
+};
+
+#endif
« no previous file with comments | « src/gpu/GrDrawTarget.cpp ('k') | src/gpu/GrFlushToGpuDrawTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698