Index: src/gpu/GrBatchTarget.h |
diff --git a/src/gpu/GrBatchTarget.h b/src/gpu/GrBatchTarget.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b73907746f055fc5b322f1a688742fe4b93efda5 |
--- /dev/null |
+++ b/src/gpu/GrBatchTarget.h |
@@ -0,0 +1,86 @@ |
+/* |
+ * 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" |
+ |
+/* |
+ * GrBatch instances use this object to allocate space for their geometry and to issue the draws |
+ * that render their batch. |
+ */ |
+ |
+class GrBatchTarget : public SkNoncopyable { |
+public: |
+ GrBatchTarget(GrGpu* gpu, |
+ GrVertexBufferAllocPool* vpool, |
+ GrIndexBufferAllocPool* ipool) |
+ : fGpu(gpu) |
+ , fVertexPool(vpool) |
+ , fIndexPool(ipool) |
+ , fFlushBuffer(kFlushBufferInitialSizeInBytes) |
+ , fIter(fFlushBuffer) {} |
+ |
+ typedef GrDrawTarget::DrawInfo DrawInfo; |
+ void initDraw(const GrPrimitiveProcessor* primProc, const GrPipeline* pipeline) { |
+ GrNEW_APPEND_TO_RECORDER(fFlushBuffer, BufferedFlush, (primProc, pipeline)); |
+ } |
+ |
+ void draw(const GrDrawTarget::DrawInfo& draw) { |
+ fFlushBuffer.back().fDraws.push_back(draw); |
+ } |
+ |
+ // TODO this is temporary until batch is everywhere |
+ //void flush(); |
+ void preFlush() { fIter = FlushBuffer::Iter(fFlushBuffer); } |
+ void flushNext(); |
+ void postFlush() { SkASSERT(!fIter.next()); fFlushBuffer.reset(); } |
+ |
+ // 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 GrPipeline* pipeline) |
+ : fPrimitiveProcessor(primProc) |
+ , fPipeline(pipeline) |
+ , fDraws(kDrawRecorderInitialSizeInBytes) {} |
+ typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimitiveProcessor; |
+ ProgramPrimitiveProcessor fPrimitiveProcessor; |
+ const GrPipeline* fPipeline; |
+ GrBatchTracker fBatchTracker; |
+ SkSTArray<4, DrawInfo, true> fDraws; |
+ }; |
+ |
+ enum { |
+ kFlushBufferInitialSizeInBytes = 8 * sizeof(BufferedFlush), |
+ kDrawRecorderInitialSizeInBytes = 8 * sizeof(DrawInfo), |
+ }; |
+ |
+ typedef GrTRecorder<BufferedFlush, TBufferAlign> FlushBuffer; |
+ |
+ FlushBuffer fFlushBuffer; |
+ // TODO this is temporary |
+ FlushBuffer::Iter fIter; |
+}; |
+ |
+#endif |