Add GrDrawTarget::DrawInfo, combine API for performing indexed/non-indexed draws in subclasses.
Review URL: https://codereview.appspot.com/7237045
git-svn-id: http://skia.googlecode.com/svn/trunk@7466 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index a1a5bee..7ca07a0 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -1606,53 +1606,28 @@
#endif
#endif
-void GrGpuGL::onGpuDrawIndexed(GrPrimitiveType type,
- uint32_t startVertex,
- uint32_t startIndex,
- uint32_t vertexCount,
- uint32_t indexCount) {
- GrAssert((size_t)type < GR_ARRAY_COUNT(gPrimitiveType2GLMode));
+void GrGpuGL::onGpuDraw(const DrawInfo& info) {
+ int extraStartIndexOffset;
+ this->setupGeometry(info, &extraStartIndexOffset);
- GrGLvoid* indices = (GrGLvoid*)(sizeof(uint16_t) * startIndex);
-
- GrAssert(NULL != fHWGeometryState.fIndexBuffer);
+ GrAssert((size_t)info.primitiveType() < GR_ARRAY_COUNT(gPrimitiveType2GLMode));
GrAssert(NULL != fHWGeometryState.fVertexBuffer);
- // our setupGeometry better have adjusted this to zero since
- // DrawElements always draws from the begining of the arrays for idx 0.
- GrAssert(0 == startVertex);
-
- GL_CALL(DrawElements(gPrimitiveType2GLMode[type], indexCount,
- GR_GL_UNSIGNED_SHORT, indices));
-#if SWAP_PER_DRAW
- glFlush();
- #if GR_MAC_BUILD
- aglSwapBuffers(aglGetCurrentContext());
- int set_a_break_pt_here = 9;
- aglSwapBuffers(aglGetCurrentContext());
- #elif GR_WIN32_BUILD
- SwapBuf();
- int set_a_break_pt_here = 9;
- SwapBuf();
- #endif
-#endif
-}
-
-void GrGpuGL::onGpuDrawNonIndexed(GrPrimitiveType type,
- uint32_t startVertex,
- uint32_t vertexCount) {
- GrAssert((size_t)type < GR_ARRAY_COUNT(gPrimitiveType2GLMode));
-
- GrAssert(NULL != fHWGeometryState.fVertexBuffer);
-
- // our setupGeometry better have adjusted this to zero.
- // DrawElements doesn't take an offset so we always adjus the startVertex.
- GrAssert(0 == startVertex);
-
- // pass 0 for parameter first. We have to adjust gl*Pointer() to
- // account for startVertex in the DrawElements case. So we always
- // rely on setupGeometry to have accounted for startVertex.
- GL_CALL(DrawArrays(gPrimitiveType2GLMode[type], 0, vertexCount));
+ if (info.isIndexed()) {
+ GrAssert(NULL != fHWGeometryState.fIndexBuffer);
+ GrGLvoid* indices = (GrGLvoid*)(sizeof(uint16_t) * (info.startIndex() +
+ extraStartIndexOffset));
+ // info.startVertex() was accounted for by setupGeometry.
+ GL_CALL(DrawElements(gPrimitiveType2GLMode[info.primitiveType()],
+ info.indexCount(),
+ GR_GL_UNSIGNED_SHORT,
+ indices));
+ } else {
+ // Pass 0 for parameter first. We have to adjust glVertexAttribPointer() to account for
+ // startVertex in the DrawElements case. So we always rely on setupGeometry to have
+ // accounted for startVertex.
+ GL_CALL(DrawArrays(gPrimitiveType2GLMode[info.primitiveType()], 0, info.vertexCount()));
+ }
#if SWAP_PER_DRAW
glFlush();
#if GR_MAC_BUILD
@@ -1688,7 +1663,6 @@
}
}
-
void GrGpuGL::setStencilPathSettings(const GrPath&,
SkPath::FillType fill,
GrStencilSettings* settings) {
diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h
index 0210c65..3b8c16f 100644
--- a/src/gpu/gl/GrGpuGL.h
+++ b/src/gpu/gl/GrGpuGL.h
@@ -96,14 +96,7 @@
virtual void onResolveRenderTarget(GrRenderTarget* target) SK_OVERRIDE;
- virtual void onGpuDrawIndexed(GrPrimitiveType type,
- uint32_t startVertex,
- uint32_t startIndex,
- uint32_t vertexCount,
- uint32_t indexCount) SK_OVERRIDE;
- virtual void onGpuDrawNonIndexed(GrPrimitiveType type,
- uint32_t vertexCount,
- uint32_t numVertices) SK_OVERRIDE;
+ virtual void onGpuDraw(const DrawInfo&) SK_OVERRIDE;
virtual void setStencilPathSettings(const GrPath&,
SkPath::FillType,
@@ -115,22 +108,23 @@
virtual void clearStencilClip(const GrIRect& rect,
bool insideClip) SK_OVERRIDE;
virtual bool flushGraphicsState(DrawType) SK_OVERRIDE;
- virtual void setupGeometry(int* startVertex,
- int* startIndex,
- int vertexCount,
- int indexCount) SK_OVERRIDE;
const GrGLCaps& glCaps() const { return fGLContextInfo.caps(); }
// binds texture unit in GL
void setTextureUnit(int unitIdx);
- // binds appropriate vertex and index buffers, also returns any extra
- // extra verts or indices to offset by.
+ // Sets up vertex attribute pointers and strides. On return startIndexOffset specifies an
+ // offset into the index buffer to the first index to be read (in addition to
+ // info.startIndex()). It accounts for the fact that index buffer pool may have provided space
+ // in the middle of a larger index buffer.
+ void setupGeometry(const DrawInfo& info, int* startIndexOffset);
+ // binds appropriate vertex and index buffers, also returns any extra verts or indices to
+ // offset by based on how space was allocated in pool VB/IBs.
void setBuffers(bool indexed, int* extraVertexOffset, int* extraIndexOffset);
// Subclasses should call this to flush the blend state.
- // The params should be the final coeffecients to apply
+ // The params should be the final coefficients to apply
// (after any blending optimizations or dual source blending considerations
// have been accounted for).
void flushBlend(bool isLines, GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff);
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp
index d1a60fa..d5e8fbd 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -340,10 +340,7 @@
#error "unknown GR_TEXT_SCALAR type"
#endif
-void GrGpuGL::setupGeometry(int* startVertex,
- int* startIndex,
- int vertexCount,
- int indexCount) {
+void GrGpuGL::setupGeometry(const DrawInfo& info, int* startIndexOffset) {
int newColorOffset;
int newCoverageOffset;
@@ -352,28 +349,24 @@
GrVertexLayout currLayout = this->getVertexLayout();
- GrGLsizei newStride = GrDrawState::VertexSizeAndOffsetsByIdx(
- currLayout,
- newTexCoordOffsets,
- &newColorOffset,
- &newCoverageOffset,
- &newEdgeOffset);
+ GrGLsizei newStride = GrDrawState::VertexSizeAndOffsetsByIdx(currLayout,
+ newTexCoordOffsets,
+ &newColorOffset,
+ &newCoverageOffset,
+ &newEdgeOffset);
int oldColorOffset;
int oldCoverageOffset;
int oldTexCoordOffsets[GrDrawState::kMaxTexCoords];
int oldEdgeOffset;
- GrGLsizei oldStride = GrDrawState::VertexSizeAndOffsetsByIdx(
- fHWGeometryState.fVertexLayout,
- oldTexCoordOffsets,
- &oldColorOffset,
- &oldCoverageOffset,
- &oldEdgeOffset);
- bool indexed = NULL != startIndex;
+ GrGLsizei oldStride = GrDrawState::VertexSizeAndOffsetsByIdx(fHWGeometryState.fVertexLayout,
+ oldTexCoordOffsets,
+ &oldColorOffset,
+ &oldCoverageOffset,
+ &oldEdgeOffset);
int extraVertexOffset;
- int extraIndexOffset;
- this->setBuffers(indexed, &extraVertexOffset, &extraIndexOffset);
+ this->setBuffers(info.isIndexed(), &extraVertexOffset, startIndexOffset);
GrGLenum scalarType;
bool texCoordNorm;
@@ -381,16 +374,11 @@
scalarType = TEXT_COORDS_GL_TYPE;
texCoordNorm = SkToBool(TEXT_COORDS_ARE_NORMALIZED);
} else {
-// GR_STATIC_ASSERT(SK_SCALAR_IS_FLOAT);
scalarType = GR_GL_FLOAT;
texCoordNorm = false;
}
- size_t vertexOffset = (*startVertex + extraVertexOffset) * newStride;
- *startVertex = 0;
- if (indexed) {
- *startIndex += extraIndexOffset;
- }
+ size_t vertexOffset = (info.startVertex() + extraVertexOffset) * newStride;
// all the Pointers must be set if any of these are true
bool allOffsetsChange = fHWGeometryState.fArrayPtrsDirty ||