add gpu backend (not hooked up yet)
git-svn-id: http://skia.googlecode.com/svn/trunk@649 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/include/GrInOrderDrawBuffer.h b/gpu/include/GrInOrderDrawBuffer.h
new file mode 100644
index 0000000..805861a
--- /dev/null
+++ b/gpu/include/GrInOrderDrawBuffer.h
@@ -0,0 +1,131 @@
+/*
+ Copyright 2010 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+
+#ifndef GrInOrderDrawBuffer_DEFINED
+#define GrInOrderDrawBuffer_DEFINED
+
+#include "GrDrawTarget.h"
+#include "GrAllocPool.h"
+#include "GrAllocator.h"
+#include "GrClip.h"
+
+class GrVertexBufferAllocPool;
+
+// TODO: don't save clip per draw
+class GrInOrderDrawBuffer : public GrDrawTarget {
+public:
+
+ GrInOrderDrawBuffer(GrVertexBufferAllocPool* pool = NULL);
+
+ virtual ~GrInOrderDrawBuffer();
+
+ void initializeDrawStateAndClip(const GrDrawTarget& target);
+
+ virtual void drawIndexed(PrimitiveType type,
+ uint32_t startVertex,
+ uint32_t startIndex,
+ uint32_t vertexCount,
+ uint32_t indexCount);
+
+ virtual void drawNonIndexed(PrimitiveType type,
+ uint32_t startVertex,
+ uint32_t vertexCount);
+
+ virtual bool geometryHints(GrVertexLayout vertexLayout,
+ int32_t* vertexCount,
+ int32_t* indexCount) const;
+
+ void reset();
+
+ void playback(GrDrawTarget* target);
+
+private:
+
+ struct Draw {
+ PrimitiveType fType;
+ uint32_t fStartVertex;
+ uint32_t fStartIndex;
+ uint32_t fVertexCount;
+ uint32_t fIndexCount;
+ bool fStateChange;
+ GrVertexLayout fVertexLayout;
+ bool fUseVertexBuffer;
+ bool fClipChanged;
+ union {
+ const GrVertexBuffer* fVertexBuffer;
+ const void* fVertexArray;
+ };
+ bool fUseIndexBuffer;
+ union {
+ const GrIndexBuffer* fIndexBuffer;
+ const void* fIndexArray;
+ };
+ };
+
+ virtual bool acquireGeometryHelper(GrVertexLayout vertexLayout,
+ void** vertices,
+ void** indices);
+ virtual void releaseGeometryHelper();
+ virtual void clipWillChange(const GrClip& clip);
+
+
+ bool grabState();
+ bool grabClip();
+
+ GrTAllocator<Draw> fDraws;
+ // HACK: We hold refs on textures in saved state but not RTs, VBs, and IBs.
+ // a) RTs aren't ref counted (yet)
+ // b) we are only using this class for text which doesn't use VBs or IBs
+ // This should be fixed by either refcounting them all or having some
+ // notification occur if a cache is purging an object we have a ptr to.
+ GrTAllocator<SavedDrawState> fStates;
+
+ GrTAllocator<GrClip> fClips;
+ bool fClipChanged;
+
+ // vertices are either queued in cpu arrays or some vertex buffer pool
+ // that knows about a specific GrGpu object.
+ GrAllocPool fCPUVertices;
+ GrVertexBufferAllocPool* fBufferVertices;
+ GrAllocPool fIndices;
+ void* fCurrReservedVertices;
+ void* fCurrReservedIndices;
+ // valid if we're queueing vertices in fBufferVertices
+ GrVertexBuffer* fCurrVertexBuffer;
+ uint32_t fCurrStartVertex;
+
+ // caller may conservatively over allocate vertices / indices.
+ // we release unused space back to allocator if possible
+ size_t fReservedVertexBytes;
+ size_t fReservedIndexBytes;
+ size_t fUsedReservedVertexBytes;
+ size_t fUsedReservedIndexBytes;
+
+ static const uint32_t STATES_BLOCK_SIZE = 8;
+ static const uint32_t DRAWS_BLOCK_SIZE = 8;
+ static const uint32_t CLIPS_BLOCK_SIZE = 8;
+ static const uint32_t VERTEX_BLOCK_SIZE = 1 << 12;
+ static const uint32_t INDEX_BLOCK_SIZE = 1 << 10;
+ int8_t fDrawsStorage[sizeof(Draw) *
+ DRAWS_BLOCK_SIZE];
+ int8_t fStatesStorage[sizeof(SavedDrawState) *
+ STATES_BLOCK_SIZE];
+ int8_t fClipsStorage[sizeof(GrClip) *
+ CLIPS_BLOCK_SIZE];
+};
+
+#endif