Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Unified Diff: src/gpu/GrDrawTarget.h

Issue 1122673002: Start on simplifying generateGeometry() overrides (Closed) Base URL: https://skia.googlesource.com/skia.git@ibcache
Patch Set: whitespace, remove debug return Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrDefaultPathRenderer.cpp ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrDrawTarget.h
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index 0dca57a9db1be7131c679252108d9f2bbe1120e6..c58418139647e873acff77508cb0e092422dd93a 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -225,65 +225,132 @@ public:
virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
/**
- * Used to communicate draws to GPUs / subclasses
+ * Used to communicate draw index vertex offsets and counts toto GPUs / subclasses
*/
class DrawInfo {
public:
- DrawInfo() { fDevBounds = NULL; }
+ DrawInfo() {}
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; }
-#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;
+ /** 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;
}
+
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;
@@ -299,9 +366,6 @@ public:
int fVerticesPerInstance;
int fIndicesPerInstance;
- SkRect fDevBoundsStorage;
- SkRect* fDevBounds;
-
GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
};
« no previous file with comments | « src/gpu/GrDefaultPathRenderer.cpp ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698