Index: src/gpu/GrDrawTarget.h |
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h |
index c58418139647e873acff77508cb0e092422dd93a..0dca57a9db1be7131c679252108d9f2bbe1120e6 100644 |
--- a/src/gpu/GrDrawTarget.h |
+++ b/src/gpu/GrDrawTarget.h |
@@ -225,132 +225,65 @@ |
virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); } |
/** |
- * Used to communicate draw index vertex offsets and counts toto GPUs / subclasses |
+ * Used to communicate draws to GPUs / subclasses |
*/ |
class DrawInfo { |
public: |
- DrawInfo() {} |
+ DrawInfo() { fDevBounds = NULL; } |
DrawInfo(const DrawInfo& di) { (*this) = di; } |
DrawInfo& operator =(const DrawInfo& di); |
- |
- void init(GrPrimitiveType primType, const GrVertexBuffer* vertexBuffer, int startVertex, |
- int vertexCount) { |
- SkASSERT(vertexBuffer); |
- SkASSERT(vertexCount); |
- SkASSERT(startVertex >= 0); |
- fPrimitiveType = primType; |
- fVertexBuffer.reset(SkRef(vertexBuffer)); |
- fIndexBuffer.reset(NULL); |
- fStartVertex = startVertex; |
- fStartIndex = 0; |
- fVertexCount = vertexCount; |
- fIndexCount = 0; |
- fInstanceCount = 0; |
- fVerticesPerInstance = 0; |
- fIndicesPerInstance = 0; |
- } |
- |
- void initIndexed(GrPrimitiveType primType, |
- const GrVertexBuffer* vertexBuffer, |
- const GrIndexBuffer* indexBuffer, |
- int startVertex, |
- int startIndex, |
- int vertexCount, |
- int indexCount) { |
- SkASSERT(indexBuffer); |
- SkASSERT(vertexBuffer); |
- SkASSERT(indexCount); |
- SkASSERT(vertexCount); |
- SkASSERT(startIndex >= 0); |
- SkASSERT(startVertex >= 0); |
- fPrimitiveType = primType; |
- fVertexBuffer.reset(SkRef(vertexBuffer)); |
- fIndexBuffer.reset(SkRef(indexBuffer)); |
- fStartVertex = startVertex; |
- fStartIndex = startIndex; |
- fVertexCount = vertexCount; |
- fIndexCount = indexCount; |
- fInstanceCount = 0; |
- fVerticesPerInstance = 0; |
- fIndicesPerInstance = 0; |
- } |
- |
- void initInstanced(GrPrimitiveType primType, |
- const GrVertexBuffer* vertexBuffer, |
- const GrIndexBuffer* indexBuffer, |
- int startVertex, |
- int verticesPerInstance, |
- int indicesPerInstance, |
- int instanceCount) { |
- SkASSERT(vertexBuffer); |
- SkASSERT(indexBuffer); |
- SkASSERT(instanceCount); |
- SkASSERT(verticesPerInstance); |
- SkASSERT(indicesPerInstance); |
- SkASSERT(startVertex >= 0); |
- fPrimitiveType = primType; |
- fVertexBuffer.reset(SkRef(vertexBuffer)); |
- fIndexBuffer.reset(SkRef(indexBuffer)); |
- fStartVertex = startVertex; |
- fStartIndex = 0; |
- fVerticesPerInstance = verticesPerInstance; |
- fIndicesPerInstance = indicesPerInstance; |
- fInstanceCount = instanceCount; |
- fVertexCount = instanceCount * fVerticesPerInstance; |
- fIndexCount = instanceCount * fIndicesPerInstance; |
- } |
- |
- /** Variation of the above that may be used when the total number of instances may exceed |
- the number of instances supported by the index buffer. To be used with |
- nextInstances() to draw in max-sized batches.*/ |
- void initInstanced(GrPrimitiveType primType, |
- const GrVertexBuffer* vertexBuffer, |
- const GrIndexBuffer* indexBuffer, |
- int startVertex, |
- int verticesPerInstance, |
- int indicesPerInstance, |
- int* instancesRemaining, |
- int maxInstancesPerDraw) { |
- int instanceCount = SkTMin(*instancesRemaining, maxInstancesPerDraw); |
- *instancesRemaining -= instanceCount; |
- this->initInstanced(primType, vertexBuffer, indexBuffer, startVertex, |
- verticesPerInstance, indicesPerInstance, instanceCount); |
- } |
GrPrimitiveType primitiveType() const { return fPrimitiveType; } |
int startVertex() const { return fStartVertex; } |
int startIndex() const { return fStartIndex; } |
int vertexCount() const { return fVertexCount; } |
int indexCount() const { return fIndexCount; } |
- |
- /** These return 0 if initInstanced was not used to initialize the DrawInfo. */ |
int verticesPerInstance() const { return fVerticesPerInstance; } |
int indicesPerInstance() const { return fIndicesPerInstance; } |
int instanceCount() const { return fInstanceCount; } |
+ void setPrimitiveType(GrPrimitiveType type) { fPrimitiveType = type; } |
+ void setStartVertex(int startVertex) { fStartVertex = startVertex; } |
+ void setStartIndex(int startIndex) { fStartIndex = startIndex; } |
+ void setVertexCount(int vertexCount) { fVertexCount = vertexCount; } |
+ void setIndexCount(int indexCount) { fIndexCount = indexCount; } |
+ void setVerticesPerInstance(int verticesPerI) { fVerticesPerInstance = verticesPerI; } |
+ void setIndicesPerInstance(int indicesPerI) { fIndicesPerInstance = indicesPerI; } |
+ void setInstanceCount(int instanceCount) { fInstanceCount = instanceCount; } |
+ |
bool isIndexed() const { return fIndexCount > 0; } |
+#ifdef SK_DEBUG |
+ bool isInstanced() const; // this version is longer because of asserts |
+#else |
bool isInstanced() const { return fInstanceCount > 0; } |
- |
- /** Called after using this draw info to draw the next set of instances. |
- The vertex offset is advanced while the index buffer is reused at the same |
- position. instancesRemaining is number of instances that remain, maxInstances is |
- the most number of instances that can be used with the index buffer. If there |
- are no instances remaining, the DrawInfo is unmodified and false is returned.*/ |
- bool nextInstances(int* instancesRemaining, int maxInstances) { |
- SkASSERT(this->isInstanced()); |
- if (!*instancesRemaining) { |
- return false; |
- } |
- fStartVertex += fVertexCount; |
- fInstanceCount = SkTMin(*instancesRemaining, maxInstances); |
- fVertexCount = fInstanceCount * fVerticesPerInstance; |
- fIndexCount = fInstanceCount * fIndicesPerInstance; |
- *instancesRemaining -= fInstanceCount; |
- return true; |
- } |
- |
+#endif |
+ |
+ // adds or remove instances |
+ void adjustInstanceCount(int instanceOffset); |
+ // shifts the start vertex |
+ void adjustStartVertex(int vertexOffset) { |
+ fStartVertex += vertexOffset; |
+ SkASSERT(fStartVertex >= 0); |
+ } |
+ // shifts the start index |
+ void adjustStartIndex(int indexOffset) { |
+ SkASSERT(this->isIndexed()); |
+ fStartIndex += indexOffset; |
+ SkASSERT(fStartIndex >= 0); |
+ } |
+ void setDevBounds(const SkRect& bounds) { |
+ fDevBoundsStorage = bounds; |
+ fDevBounds = &fDevBoundsStorage; |
+ } |
const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); } |
const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); } |
+ void setVertexBuffer(const GrVertexBuffer* vb) { |
+ fVertexBuffer.reset(vb); |
+ } |
+ void setIndexBuffer(const GrIndexBuffer* ib) { |
+ fIndexBuffer.reset(ib); |
+ } |
+ const SkRect* getDevBounds() const { return fDevBounds; } |
private: |
friend class GrDrawTarget; |
@@ -365,6 +298,9 @@ |
int fInstanceCount; |
int fVerticesPerInstance; |
int fIndicesPerInstance; |
+ |
+ SkRect fDevBoundsStorage; |
+ SkRect* fDevBounds; |
GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer; |
GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer; |