| 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
|
|
|