aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrDrawTarget.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/GrDrawTarget.h')
-rw-r--r--src/gpu/GrDrawTarget.h70
1 files changed, 59 insertions, 11 deletions
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index 629963b51e..3a85767038 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -14,6 +14,7 @@
#include "GrClip.h"
#include "GrColor.h"
#include "GrDrawState.h"
+#include "GrIndexBuffer.h"
#include "GrMatrix.h"
#include "GrRefCnt.h"
#include "GrSamplerState.h"
@@ -263,9 +264,8 @@ public:
* There are three 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 drawIndexed and drawNonIndexed
- * calls. However, the time at which the geometry data is no longer editable
- * depends on the source type.
+ * 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
@@ -291,8 +291,8 @@ public:
* data. The target provides ptrs to hold the vertex and/or index data.
*
* The data is writable up until the next drawIndexed, drawNonIndexed,
- * or pushGeometrySource. At this point the data is frozen and the ptrs
- * are no longer valid.
+ * drawIndexedInstances, 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.
@@ -319,9 +319,9 @@ public:
* source is reset and likewise for indexCount.
*
* The pointers to the space allocated for vertices and indices remain valid
- * until a drawIndexed, drawNonIndexed, or push/popGeomtrySource is called.
- * At that point logically a snapshot of the data is made and the pointers
- * are invalid.
+ * until a drawIndexed, drawNonIndexed, drawIndexedInstances, or push/
+ * popGeomtrySource is called. At that point logically a snapshot of the
+ * data is made and the pointers are invalid.
*
* @param vertexLayout the format of vertices (ignored if vertexCount == 0).
* @param vertexCount the number of vertices to reserve space for. Can be
@@ -387,7 +387,7 @@ public:
/**
* Sets source of vertex data for the next draw. Data does not have to be
- * in the buffer until drawIndexed or drawNonIndexed.
+ * in the buffer until drawIndexed, drawNonIndexed, or drawIndexedInstances.
*
* @param buffer vertex buffer containing vertex data. Must be
* unlocked before draw call.
@@ -398,7 +398,7 @@ public:
/**
* Sets source of index data for the next indexed draw. Data does not have
- * to be in the buffer until drawIndexed or drawNonIndexed.
+ * to be in the buffer until drawIndexed.
*
* @param buffer index buffer containing indices. Must be unlocked
* before indexed draw call.
@@ -503,6 +503,39 @@ public:
const GrMatrix* srcMatrices[]);
/**
+ * 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. Morever, 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).
+ */
+ virtual void drawIndexedInstances(GrPrimitiveType type,
+ int instanceCount,
+ int verticesPerInstance,
+ int indicesPerInstance);
+
+ /**
* Helper for drawRect when the caller doesn't need separate src rects or
* matrices.
*/
@@ -904,7 +937,22 @@ protected:
GrVertexLayout fVertexLayout;
};
-
+
+ int indexCountInCurrentSource() const {
+ const GeometrySrcState& src = this->getGeomSrc();
+ switch (src.fIndexSrc) {
+ case kNone_GeometrySrcType:
+ return 0;
+ case kReserved_GeometrySrcType:
+ case kArray_GeometrySrcType:
+ return src.fIndexCount;
+ case kBuffer_GeometrySrcType:
+ return src.fIndexBuffer->sizeInBytes() / sizeof(uint16_t);
+ default:
+ GrCrash("Unexpected Index Source.");
+ return 0;
+ }
+ }
// given a vertex layout and a draw state, will a stage be used?
static bool StageWillBeUsed(int stage, GrVertexLayout layout,
const GrDrawState& state) {