Index: src/gpu/GrBatchBuffer.h |
diff --git a/src/gpu/GrBatchBuffer.h b/src/gpu/GrBatchBuffer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..490b39a4cc218298ff9e00ef6cee688e2ed0b18d |
--- /dev/null |
+++ b/src/gpu/GrBatchBuffer.h |
@@ -0,0 +1,78 @@ |
+/* |
+ * 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 GrBatchBuffer_DEFINED |
+#define GrBatchBuffer_DEFINED |
+ |
+#include "GrPendingProgramElement.h" |
+#include "GrGpu.h" |
+#include "GrTRecorder.h" |
+ |
+/* |
+ * GrBatchBuffer is a simple class which lets GrDrawTarget subclasses defer flushing of batched |
bsalomon
2015/01/21 21:39:29
I'm not crazy about this name
GrBatchTarget?
Pro
|
+ * Geometry for performance reasons. |
+ */ |
+ |
+class GrBatchBuffer : public SkNoncopyable { |
+public: |
+ GrBatchBuffer(GrGpu* gpu, |
+ GrVertexBufferAllocPool* vpool, |
+ GrIndexBufferAllocPool* ipool) |
+ : fGpu(gpu) |
+ , fVertexPool(vpool) |
+ , fIndexPool(ipool) |
+ , fFlushBuffer(kFlushBufferInitialSizeInBytes) {} |
+ |
+ typedef GrDrawTarget::DrawInfo DrawInfo; |
+ void initDraw(const GrPrimitiveProcessor* primProc, const GrOptDrawState* optState) { |
+ GrNEW_APPEND_TO_RECORDER(fFlushBuffer, BufferedFlush, (primProc, optState)); |
+ } |
+ |
+ void draw(const GrDrawTarget::DrawInfo& draw) { |
+ fFlushBuffer.back().fDraws.push_back(draw); |
+ } |
+ void flush(); |
+ |
+ // TODO This goes away when everything uses batch |
+ GrBatchTracker* currentBatchTracker() { |
+ SkASSERT(!fFlushBuffer.empty()); |
+ return &fFlushBuffer.back().fBatchTracker; |
+ } |
+ |
+ GrVertexBufferAllocPool* vertexPool() { return fVertexPool; } |
+ GrIndexBufferAllocPool* indexPool() { return fIndexPool; } |
+ |
+private: |
+ GrGpu* fGpu; |
+ GrVertexBufferAllocPool* fVertexPool; |
+ GrIndexBufferAllocPool* fIndexPool; |
+ |
+ typedef void* TBufferAlign; // This wouldn't be enough align if a command used long double. |
+ |
+ struct BufferedFlush { |
+ BufferedFlush(const GrPrimitiveProcessor* primProc, const GrOptDrawState* optState) |
+ : fPrimitiveProcessor(primProc) |
+ , fOptState(optState) |
+ , fDraws(kDrawRecorderInitialSizeInBytes) {} |
+ typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimitiveProcessor; |
+ ProgramPrimitiveProcessor fPrimitiveProcessor; |
+ const GrOptDrawState* fOptState; |
+ GrBatchTracker fBatchTracker; |
+ SkSTArray<4, DrawInfo, true> fDraws; |
+ }; |
+ |
+ enum { |
+ kFlushBufferInitialSizeInBytes = 8 * sizeof(BufferedFlush), |
+ kDrawRecorderInitialSizeInBytes = 8 * sizeof(DrawInfo), |
+ }; |
+ |
+ typedef GrTRecorder<BufferedFlush, TBufferAlign> FlushBuffer; |
+ |
+ FlushBuffer fFlushBuffer; |
+}; |
+ |
+#endif |