| Index: src/gpu/GrDrawTarget.h
|
| diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
|
| index 1d07b9eec22725e6695fcde68d0d49a76335bc04..8706702866bcfa726b53fa2160f837e7c88599e8 100644
|
| --- a/src/gpu/GrDrawTarget.h
|
| +++ b/src/gpu/GrDrawTarget.h
|
| @@ -31,7 +31,6 @@
|
| class GrBatch;
|
| class GrClip;
|
| class GrDrawTargetCaps;
|
| -class GrGeometryProcessor;
|
| class GrPath;
|
| class GrPathRange;
|
| class GrPipeline;
|
| @@ -48,205 +47,13 @@ public:
|
| // The context may not be fully constructed and should not be used during GrDrawTarget
|
| // construction.
|
| GrDrawTarget(GrContext* context);
|
| - virtual ~GrDrawTarget();
|
| + virtual ~GrDrawTarget() {}
|
|
|
| /**
|
| * Gets the capabilities of the draw target.
|
| */
|
| const GrDrawTargetCaps* caps() const { return fCaps.get(); }
|
|
|
| - /**
|
| - * There are two types of "sources" of geometry (vertices and indices) for
|
| - * draw calls made on the target. When performing an indexed draw, the
|
| - * indices and vertices can use different source types. Once a source is
|
| - * specified it can be used for multiple draws. However, the time at which
|
| - * the geometry data is no longer editable depends on the source type.
|
| - *
|
| - * Sometimes it is necessary to perform a draw while upstack code has
|
| - * already specified geometry that it isn't finished with. So there are push
|
| - * and pop methods. This allows the client to push the sources, draw
|
| - * something using alternate sources, and then pop to restore the original
|
| - * sources.
|
| - *
|
| - * Aside from pushes and pops, a source remains valid until another source
|
| - * is set or resetVertexSource / resetIndexSource is called. Drawing from
|
| - * a reset source is an error.
|
| - *
|
| - * The two types of sources are:
|
| - *
|
| - * 1. Reserve. This is most useful when the caller has data it must
|
| - * transform before drawing and is not long-lived. The caller requests
|
| - * that the draw target make room for some amount of vertex and/or index
|
| - * data. The target provides ptrs to hold the vertex and/or index data.
|
| - *
|
| - * The data is writable up until the next drawIndexed, drawNonIndexed,
|
| - * drawIndexedInstances, drawRect, copySurface, or pushGeometrySource. At
|
| - * this point the data is frozen and the ptrs are no longer valid.
|
| - *
|
| - * Where the space is allocated and how it is uploaded to the GPU is
|
| - * subclass-dependent.
|
| - *
|
| - * 2. Vertex and Index Buffers. This is most useful for geometry that will
|
| - * is long-lived. When the data in the buffer is consumed depends on the
|
| - * GrDrawTarget subclass. For deferred subclasses the caller has to
|
| - * guarantee that the data is still available in the buffers at playback.
|
| - * (TODO: Make this more automatic as we have done for read/write pixels)
|
| - */
|
| -
|
| - /**
|
| - * Reserves space for vertices and/or indices. Zero can be specifed as
|
| - * either the vertex or index count if the caller desires to only reserve
|
| - * space for only indices or only vertices. If zero is specifed for
|
| - * vertexCount then the vertex source will be unmodified and likewise for
|
| - * indexCount.
|
| - *
|
| - * If the function returns true then the reserve suceeded and the vertices
|
| - * and indices pointers will point to the space created.
|
| - *
|
| - * If the target cannot make space for the request then this function will
|
| - * return false. If vertexCount was non-zero then upon failure the vertex
|
| - * source is reset and likewise for indexCount.
|
| - *
|
| - * The pointers to the space allocated for vertices and indices remain valid
|
| - * until a drawIndexed, drawNonIndexed, drawIndexedInstances, drawRect,
|
| - * copySurface, or push/popGeomtrySource is called. At that point logically a
|
| - * snapshot of the data is made and the pointers are invalid.
|
| - *
|
| - * @param vertexCount the number of vertices to reserve space for. Can be
|
| - * 0. Vertex size is queried from the current GrPipelineBuilder.
|
| - * @param indexCount the number of indices to reserve space for. Can be 0.
|
| - * @param vertices will point to reserved vertex space if vertexCount is
|
| - * non-zero. Illegal to pass NULL if vertexCount > 0.
|
| - * @param indices will point to reserved index space if indexCount is
|
| - * non-zero. Illegal to pass NULL if indexCount > 0.
|
| - */
|
| - bool reserveVertexAndIndexSpace(int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount,
|
| - void** vertices,
|
| - void** indices);
|
| -
|
| - /**
|
| - * Provides hints to caller about the number of vertices and indices
|
| - * that can be allocated cheaply. This can be useful if caller is reserving
|
| - * space but doesn't know exactly how much geometry is needed.
|
| - *
|
| - * Also may hint whether the draw target should be flushed first. This is
|
| - * useful for deferred targets.
|
| - *
|
| - * @param vertexCount in: hint about how many vertices the caller would
|
| - * like to allocate. Vertex size is queried from the
|
| - * current GrPipelineBuilder.
|
| - * out: a hint about the number of vertices that can be
|
| - * allocated cheaply. Negative means no hint.
|
| - * Ignored if NULL.
|
| - * @param indexCount in: hint about how many indices the caller would
|
| - * like to allocate.
|
| - * out: a hint about the number of indices that can be
|
| - * allocated cheaply. Negative means no hint.
|
| - * Ignored if NULL.
|
| - *
|
| - * @return true if target should be flushed based on the input values.
|
| - */
|
| - virtual bool geometryHints(size_t vertexStride, int* vertexCount, int* indexCount) const;
|
| -
|
| - /**
|
| - * Sets source of vertex data for the next draw. Data does not have to be
|
| - * in the buffer until drawIndexed, drawNonIndexed, or drawIndexedInstances.
|
| - *
|
| - * @param buffer vertex buffer containing vertex data. Must be
|
| - * unlocked before draw call. Vertex size is queried
|
| - * from current GrPipelineBuilder.
|
| - */
|
| - void setVertexSourceToBuffer(const GrVertexBuffer* buffer, size_t vertexStride);
|
| -
|
| - /**
|
| - * Sets source of index data for the next indexed draw. Data does not have
|
| - * to be in the buffer until drawIndexed.
|
| - *
|
| - * @param buffer index buffer containing indices. Must be unlocked
|
| - * before indexed draw call.
|
| - */
|
| - void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
|
| -
|
| - /**
|
| - * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
|
| - * source to reserved, array, or buffer before next draw. May be able to free
|
| - * up temporary storage allocated by setVertexSourceToArray or
|
| - * reserveVertexSpace.
|
| - */
|
| - void resetVertexSource();
|
| -
|
| - /**
|
| - * Resets index source. Indexed Drawing from reset indices is illegal. Set
|
| - * index source to reserved, array, or buffer before next indexed draw. May
|
| - * be able to free up temporary storage allocated by setIndexSourceToArray
|
| - * or reserveIndexSpace.
|
| - */
|
| - void resetIndexSource();
|
| -
|
| - /**
|
| - * Query to find out if the vertex or index source is reserved.
|
| - */
|
| - bool hasReservedVerticesOrIndices() const {
|
| - return kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc ||
|
| - kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc;
|
| - }
|
| -
|
| - /**
|
| - * Pushes and resets the vertex/index sources. Any reserved vertex / index
|
| - * data is finalized (i.e. cannot be updated after the matching pop but can
|
| - * be drawn from). Must be balanced by a pop.
|
| - */
|
| - void pushGeometrySource();
|
| -
|
| - /**
|
| - * Pops the vertex / index sources from the matching push.
|
| - */
|
| - void popGeometrySource();
|
| -
|
| - /**
|
| - * Draws indexed geometry using the current state and current vertex / index
|
| - * sources.
|
| - *
|
| - * @param type The type of primitives to draw.
|
| - * @param startVertex the vertex in the vertex array/buffer corresponding
|
| - * to index 0
|
| - * @param startIndex first index to read from index src.
|
| - * @param vertexCount one greater than the max index.
|
| - * @param indexCount the number of index elements to read. The index count
|
| - * is effectively trimmed to the last completely
|
| - * specified primitive.
|
| - * @param devBounds optional bounds hint. This is a promise from the caller,
|
| - * not a request for clipping.
|
| - */
|
| - void drawIndexed(GrPipelineBuilder*,
|
| - const GrGeometryProcessor*,
|
| - GrPrimitiveType type,
|
| - int startVertex,
|
| - int startIndex,
|
| - int vertexCount,
|
| - int indexCount,
|
| - const SkRect* devBounds = NULL);
|
| -
|
| - /**
|
| - * Draws non-indexed geometry using the current state and current vertex
|
| - * sources.
|
| - *
|
| - * @param type The type of primitives to draw.
|
| - * @param startVertex the vertex in the vertex array/buffer corresponding
|
| - * to index 0
|
| - * @param vertexCount one greater than the max index.
|
| - * @param devBounds optional bounds hint. This is a promise from the caller,
|
| - * not a request for clipping.
|
| - */
|
| - void drawNonIndexed(GrPipelineBuilder*,
|
| - const GrGeometryProcessor*,
|
| - GrPrimitiveType type,
|
| - int startVertex,
|
| - int vertexCount,
|
| - const SkRect* devBounds = NULL);
|
| -
|
| // TODO devbounds should live on the batch
|
| void drawBatch(GrPipelineBuilder*, GrBatch*, const SkRect* devBounds = NULL);
|
|
|
| @@ -290,8 +97,7 @@ public:
|
| GrPathRendering::FillType fill);
|
|
|
| /**
|
| - * Helper function for drawing rects. It performs a geometry src push and pop
|
| - * and thus will finalize any reserved geometry.
|
| + * Helper function for drawing rects.
|
| *
|
| * @param rect the rect to draw
|
| * @param localRect optional rect that specifies local coords to map onto
|
| @@ -323,43 +129,6 @@ public:
|
| this->drawRect(ds, color, viewM, rect, NULL, NULL);
|
| }
|
|
|
| - /**
|
| - * This call is used to draw multiple instances of some geometry with a
|
| - * given number of vertices (V) and indices (I) per-instance. The indices in
|
| - * the index source must have the form i[k+I] == i[k] + V. Also, all indices
|
| - * i[kI] ... i[(k+1)I-1] must be elements of the range kV ... (k+1)V-1. As a
|
| - * concrete example, the following index buffer for drawing a series of
|
| - * quads each as two triangles each satisfies these conditions with V=4 and
|
| - * I=6:
|
| - * (0,1,2,0,2,3, 4,5,6,4,6,7, 8,9,10,8,10,11, ...)
|
| - *
|
| - * The call assumes that the pattern of indices fills the entire index
|
| - * source. The size of the index buffer limits the number of instances that
|
| - * can be drawn by the GPU in a single draw. However, the caller may specify
|
| - * any (positive) number for instanceCount and if necessary multiple GPU
|
| - * draws will be issued. Moreover, when drawIndexedInstances is called
|
| - * multiple times it may be possible for GrDrawTarget to group them into a
|
| - * single GPU draw.
|
| - *
|
| - * @param type the type of primitives to draw
|
| - * @param instanceCount the number of instances to draw. Each instance
|
| - * consists of verticesPerInstance vertices indexed by
|
| - * indicesPerInstance indices drawn as the primitive
|
| - * type specified by type.
|
| - * @param verticesPerInstance The number of vertices in each instance (V
|
| - * in the above description).
|
| - * @param indicesPerInstance The number of indices in each instance (I
|
| - * in the above description).
|
| - * @param devBounds optional bounds hint. This is a promise from the caller,
|
| - * not a request for clipping.
|
| - */
|
| - void drawIndexedInstances(GrPipelineBuilder*,
|
| - const GrGeometryProcessor*,
|
| - GrPrimitiveType type,
|
| - int instanceCount,
|
| - int verticesPerInstance,
|
| - int indicesPerInstance,
|
| - const SkRect* devBounds = NULL);
|
|
|
| /**
|
| * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole
|
| @@ -425,55 +194,6 @@ public:
|
| */
|
| virtual void purgeResources() {};
|
|
|
| - ////////////////////////////////////////////////////////////////////////////
|
| -
|
| - class AutoReleaseGeometry : public ::SkNoncopyable {
|
| - public:
|
| - AutoReleaseGeometry(GrDrawTarget* target,
|
| - int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount);
|
| - AutoReleaseGeometry();
|
| - ~AutoReleaseGeometry();
|
| - bool set(GrDrawTarget* target,
|
| - int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount);
|
| - bool succeeded() const { return SkToBool(fTarget); }
|
| - void* vertices() const { SkASSERT(this->succeeded()); return fVertices; }
|
| - void* indices() const { SkASSERT(this->succeeded()); return fIndices; }
|
| - SkPoint* positions() const {
|
| - return static_cast<SkPoint*>(this->vertices());
|
| - }
|
| -
|
| - private:
|
| - void reset();
|
| -
|
| - GrDrawTarget* fTarget;
|
| - void* fVertices;
|
| - void* fIndices;
|
| - };
|
| -
|
| - ////////////////////////////////////////////////////////////////////////////
|
| -
|
| - /**
|
| - * Saves the geometry src state at construction and restores in the destructor. It also saves
|
| - * and then restores the vertex attrib state.
|
| - */
|
| - class AutoGeometryPush : public ::SkNoncopyable {
|
| - public:
|
| - AutoGeometryPush(GrDrawTarget* target) {
|
| - SkASSERT(target);
|
| - fTarget = target;
|
| - target->pushGeometrySource();
|
| - }
|
| -
|
| - ~AutoGeometryPush() { fTarget->popGeometrySource(); }
|
| -
|
| - private:
|
| - GrDrawTarget* fTarget;
|
| - };
|
| -
|
| ///////////////////////////////////////////////////////////////////////////
|
| // Draw execution tracking (for font atlases and other resources)
|
| class DrawToken {
|
| @@ -528,10 +248,16 @@ public:
|
| // adds or remove instances
|
| void adjustInstanceCount(int instanceOffset);
|
| // shifts the start vertex
|
| - void adjustStartVertex(int vertexOffset);
|
| + void adjustStartVertex(int vertexOffset) {
|
| + fStartVertex += vertexOffset;
|
| + SkASSERT(fStartVertex >= 0);
|
| + }
|
| // shifts the start index
|
| - void adjustStartIndex(int indexOffset);
|
| -
|
| + void adjustStartIndex(int indexOffset) {
|
| + SkASSERT(this->isIndexed());
|
| + fStartIndex += indexOffset;
|
| + SkASSERT(fStartIndex >= 0);
|
| + }
|
| void setDevBounds(const SkRect& bounds) {
|
| fDevBoundsStorage = bounds;
|
| fDevBounds = &fDevBoundsStorage;
|
| @@ -567,73 +293,14 @@ public:
|
| GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
|
| };
|
|
|
| - /**
|
| - * Used to populate the vertex and index buffer on the draw info before onDraw is called.
|
| - */
|
| - virtual void setDrawBuffers(DrawInfo*, size_t vertexStride) = 0;
|
| bool programUnitTest(int maxStages);
|
|
|
| protected:
|
| friend class GrTargetCommands; // for PipelineInfo
|
|
|
| - enum GeometrySrcType {
|
| - kNone_GeometrySrcType, //<! src has not been specified
|
| - kReserved_GeometrySrcType, //<! src was set using reserve*Space
|
| - kBuffer_GeometrySrcType //<! src was set using set*SourceToBuffer
|
| - };
|
| -
|
| - struct GeometrySrcState {
|
| - GeometrySrcType fVertexSrc;
|
| - union {
|
| - // valid if src type is buffer
|
| - const GrVertexBuffer* fVertexBuffer;
|
| - // valid if src type is reserved or array
|
| - int fVertexCount;
|
| - };
|
| -
|
| - GeometrySrcType fIndexSrc;
|
| - union {
|
| - // valid if src type is buffer
|
| - const GrIndexBuffer* fIndexBuffer;
|
| - // valid if src type is reserved or array
|
| - int fIndexCount;
|
| - };
|
| -
|
| - size_t fVertexSize;
|
| - };
|
| -
|
| - int indexCountInCurrentSource() const {
|
| - const GeometrySrcState& src = this->getGeomSrc();
|
| - switch (src.fIndexSrc) {
|
| - case kNone_GeometrySrcType:
|
| - return 0;
|
| - case kReserved_GeometrySrcType:
|
| - return src.fIndexCount;
|
| - case kBuffer_GeometrySrcType:
|
| - return static_cast<int>(src.fIndexBuffer->gpuMemorySize() / sizeof(uint16_t));
|
| - default:
|
| - SkFAIL("Unexpected Index Source.");
|
| - return 0;
|
| - }
|
| - }
|
| -
|
| GrContext* getContext() { return fContext; }
|
| const GrContext* getContext() const { return fContext; }
|
|
|
| - // subclasses must call this in their destructors to ensure all vertex
|
| - // and index sources have been released (including those held by
|
| - // pushGeometrySource())
|
| - void releaseGeometry();
|
| -
|
| - // accessors for derived classes
|
| - const GeometrySrcState& getGeomSrc() const { return fGeoSrcStateStack.back(); }
|
| - // it is preferable to call this rather than getGeomSrc()->fVertexSize because of the assert.
|
| - size_t getVertexSize() const {
|
| - // the vertex layout is only valid if a vertex source has been specified.
|
| - SkASSERT(this->getGeomSrc().fVertexSrc != kNone_GeometrySrcType);
|
| - return this->getGeomSrc().fVertexSize;
|
| - }
|
| -
|
| // Subclass must initialize this in its constructor.
|
| SkAutoTUnref<const GrDrawTargetCaps> fCaps;
|
|
|
| @@ -674,12 +341,6 @@ protected:
|
|
|
| void setupPipeline(const PipelineInfo& pipelineInfo, GrPipeline* pipeline);
|
|
|
| - // A subclass can optionally overload this function to be notified before
|
| - // vertex and index space is reserved.
|
| - virtual void willReserveVertexAndIndexSpace(int vertexCount,
|
| - size_t vertexStride,
|
| - int indexCount) {}
|
| -
|
| private:
|
| /**
|
| * This will be called before allocating a texture as a dst for copySurface. This function
|
| @@ -700,17 +361,6 @@ private:
|
| const SkIRect& clippedSrcRect,
|
| const SkIPoint& clippedDstRect);
|
|
|
| - // implemented by subclass to allocate space for reserved geom
|
| - virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) = 0;
|
| - virtual bool onReserveIndexSpace(int indexCount, void** indices) = 0;
|
| - // implemented by subclass to handle release of reserved geom space
|
| - virtual void releaseReservedVertexSpace() = 0;
|
| - virtual void releaseReservedIndexSpace() = 0;
|
| - // subclass overrides to be notified just before geo src state is pushed/popped.
|
| - virtual void geometrySourceWillPush() = 0;
|
| - virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
|
| - // subclass called to perform drawing
|
| - virtual void onDraw(const GrGeometryProcessor*, const DrawInfo&, const PipelineInfo&) = 0;
|
| virtual void onDrawBatch(GrBatch*, const PipelineInfo&) = 0;
|
| // TODO copy in order drawbuffer onDrawRect to here
|
| virtual void onDrawRect(GrPipelineBuilder*,
|
| @@ -766,25 +416,6 @@ private:
|
| */
|
| virtual bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) = 0;
|
|
|
| - // helpers for reserving vertex and index space.
|
| - bool reserveVertexSpace(size_t vertexSize,
|
| - int vertexCount,
|
| - void** vertices);
|
| - bool reserveIndexSpace(int indexCount, void** indices);
|
| -
|
| - // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
|
| - // indicate non-indexed drawing.
|
| - bool checkDraw(const GrPipelineBuilder&,
|
| - const GrGeometryProcessor*,
|
| - GrPrimitiveType type,
|
| - int startVertex,
|
| - int startIndex,
|
| - int vertexCount,
|
| - int indexCount) const;
|
| - // called when setting a new vert/idx source to unref prev vb/ib
|
| - void releasePreviousVertexSource();
|
| - void releasePreviousIndexSource();
|
| -
|
| // Check to see if this set of draw commands has been sent out
|
| virtual bool isIssued(uint32_t drawID) { return true; }
|
| void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
|
| @@ -797,10 +428,6 @@ private:
|
| GrScissorState*,
|
| const SkRect* devBounds) = 0;
|
|
|
| - enum {
|
| - kPreallocGeoSrcStateStackCnt = 4,
|
| - };
|
| - SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcStateStack;
|
| // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
|
| GrContext* fContext;
|
| // To keep track that we always have at least as many debug marker adds as removes
|
|
|