Make drawRect preserve vertex attrib state and push/pop the geom sources.
Also, add some balancing calls for setIndexSource*() Review URL: https://codereview.chromium.org/13468004 git-svn-id: http://skia.googlecode.com/svn/trunk@8499 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
5d01bec07a
commit
0406b9e1fa
@ -842,6 +842,7 @@ bool GrAAHairLinePathRenderer::onDrawPath(const SkPath& path,
|
||||
kIdxsPerQuad*n); // iCount
|
||||
quads += n;
|
||||
}
|
||||
target->resetIndexSource();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -178,6 +178,7 @@ void GrAARectRenderer::fillAARect(GrGpu* gpu,
|
||||
target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1,
|
||||
kVertsPerAAFillRect,
|
||||
kIndicesPerAAFillRect);
|
||||
target->resetIndexSource();
|
||||
}
|
||||
|
||||
void GrAARectRenderer::strokeAARect(GrGpu* gpu,
|
||||
|
@ -976,6 +976,7 @@ void GrContext::drawVertices(const GrPaint& paint,
|
||||
if (NULL != indices) {
|
||||
target->setIndexSourceToArray(indices, indexCount);
|
||||
target->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount);
|
||||
target->resetIndexSource();
|
||||
} else {
|
||||
target->drawNonIndexed(primitiveType, 0, vertexCount);
|
||||
}
|
||||
|
@ -169,6 +169,27 @@ public:
|
||||
|
||||
bool validateVertexAttribs() const;
|
||||
|
||||
/**
|
||||
* Helper to save/restore vertex attribs
|
||||
*/
|
||||
class AutoVertexAttribRestore {
|
||||
public:
|
||||
AutoVertexAttribRestore(GrDrawState* drawState) {
|
||||
GrAssert(NULL != drawState);
|
||||
fDrawState = drawState;
|
||||
fVertexAttribs = drawState->fCommon.fVertexAttribs;
|
||||
fDrawState->setDefaultVertexAttribs();
|
||||
}
|
||||
|
||||
~AutoVertexAttribRestore(){
|
||||
fDrawState->fCommon.fVertexAttribs = fVertexAttribs;
|
||||
}
|
||||
|
||||
private:
|
||||
GrDrawState* fDrawState;
|
||||
GrVertexAttribArray<kMaxVertexAttribCnt> fVertexAttribs;
|
||||
};
|
||||
|
||||
/**
|
||||
* Accessing positions, local coords, or colors, of a vertex within an array is a hassle
|
||||
* involving casts and simple math. These helpers exist to keep GrDrawTarget clients' code a bit
|
||||
|
@ -611,10 +611,10 @@ void GrDrawTarget::drawIndexedInstances(GrPrimitiveType type,
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GrDrawTarget::drawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
void GrDrawTarget::onDrawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
// position + (optional) texture coord
|
||||
static const GrVertexAttrib kAttribs[] = {
|
||||
{kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
||||
|
@ -331,16 +331,8 @@ public:
|
||||
void stencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath::FillType fill);
|
||||
|
||||
/**
|
||||
* Helper function for drawing rects. This does not use the current index
|
||||
* and vertex sources. After returning, the vertex and index sources may
|
||||
* have changed. They should be reestablished before the next draw call.
|
||||
* This cannot be called between reserving and releasing
|
||||
* geometry.
|
||||
*
|
||||
* A subclass may override this to perform more optimal rect rendering. Its
|
||||
* draws should be funneled through one of the public GrDrawTarget draw methods
|
||||
* (e.g. drawNonIndexed, drawIndexedInstances, ...). The base class draws a two
|
||||
* triangle fan using drawNonIndexed from reserved vertex space.
|
||||
* Helper function for drawing rects. It performs a geometry src push and pop
|
||||
* and thus will finalize any reserved geometry.
|
||||
*
|
||||
* @param rect the rect to draw
|
||||
* @param matrix optional matrix applied to rect (before viewMatrix)
|
||||
@ -351,10 +343,13 @@ public:
|
||||
* then srcRect will be transformed by srcMatrix.
|
||||
* srcMatrix can be NULL when no srcMatrix is desired.
|
||||
*/
|
||||
virtual void drawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix);
|
||||
void drawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
AutoGeometryPush agp(this);
|
||||
this->onDrawRect(rect, matrix, localRect, localMatrix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper for drawRect when the caller doesn't need separate local rects or matrices.
|
||||
@ -533,20 +528,47 @@ public:
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class AutoGeometryAndStatePush : ::GrNoncopyable {
|
||||
/**
|
||||
* Saves the geometry src state at construction and restores in the destructor. It also saves
|
||||
* and then restores the vertex attrib state.
|
||||
*/
|
||||
class AutoGeometryPush : ::GrNoncopyable {
|
||||
public:
|
||||
AutoGeometryAndStatePush(GrDrawTarget* target, ASRInit init)
|
||||
: fState(target, init) {
|
||||
AutoGeometryPush(GrDrawTarget* target)
|
||||
: fAttribRestore(target->drawState()) {
|
||||
GrAssert(NULL != target);
|
||||
fTarget = target;
|
||||
target->pushGeometrySource();
|
||||
}
|
||||
~AutoGeometryAndStatePush() {
|
||||
fTarget->popGeometrySource();
|
||||
}
|
||||
|
||||
~AutoGeometryPush() { fTarget->popGeometrySource(); }
|
||||
|
||||
private:
|
||||
GrDrawTarget* fTarget;
|
||||
GrDrawState::AutoVertexAttribRestore fAttribRestore;
|
||||
};
|
||||
|
||||
/**
|
||||
* Combination of AutoGeometryPush and AutoStateRestore. The vertex attribs will be in default
|
||||
* state regardless of ASRInit value.
|
||||
*/
|
||||
class AutoGeometryAndStatePush : ::GrNoncopyable {
|
||||
public:
|
||||
AutoGeometryAndStatePush(GrDrawTarget* target, ASRInit init)
|
||||
: fState(target, init){
|
||||
GrAssert(NULL != target);
|
||||
fTarget = target;
|
||||
target->pushGeometrySource();
|
||||
if (kPreserve_ASRInit == init) {
|
||||
target->drawState()->setDefaultVertexAttribs();
|
||||
}
|
||||
}
|
||||
|
||||
~AutoGeometryAndStatePush() { fTarget->popGeometrySource(); }
|
||||
|
||||
private:
|
||||
GrDrawTarget* fTarget;
|
||||
AutoStateRestore fState;
|
||||
GrDrawTarget* fTarget;
|
||||
};
|
||||
|
||||
protected:
|
||||
@ -717,6 +739,16 @@ private:
|
||||
virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
|
||||
// subclass called to perform drawing
|
||||
virtual void onDraw(const DrawInfo&) = 0;
|
||||
// Implementation of drawRect. The geometry src and vertex attribs will already
|
||||
// be saved before this is called and restored afterwards. A subclass may override
|
||||
// this to perform more optimal rect rendering. Its draws should be funneled through
|
||||
// one of the public GrDrawTarget draw methods (e.g. drawNonIndexed,
|
||||
// drawIndexedInstances, ...). The base class draws a two triangle fan using
|
||||
// drawNonIndexed from reserved vertex space.
|
||||
virtual void onDrawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix);
|
||||
virtual void onStencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath::FillType fill) = 0;
|
||||
|
||||
// helpers for reserving vertex and index space.
|
||||
|
@ -73,10 +73,10 @@ void get_vertex_bounds(const void* vertices,
|
||||
}
|
||||
}
|
||||
|
||||
void GrInOrderDrawBuffer::drawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
void GrInOrderDrawBuffer::onDrawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
GrDrawState::AutoColorRestore acr;
|
||||
|
||||
GrDrawState* drawState = this->drawState();
|
||||
|
@ -76,10 +76,6 @@ public:
|
||||
virtual void clear(const GrIRect* rect,
|
||||
GrColor color,
|
||||
GrRenderTarget* renderTarget = NULL) SK_OVERRIDE;
|
||||
virtual void drawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) SK_OVERRIDE;
|
||||
|
||||
protected:
|
||||
virtual void clipWillBeSet(const GrClipData* newClip) SK_OVERRIDE;
|
||||
@ -119,6 +115,10 @@ private:
|
||||
|
||||
// overrides from GrDrawTarget
|
||||
virtual void onDraw(const DrawInfo&) SK_OVERRIDE;
|
||||
virtual void onDrawRect(const GrRect& rect,
|
||||
const SkMatrix* matrix,
|
||||
const GrRect* localRect,
|
||||
const SkMatrix* localMatrix) SK_OVERRIDE;
|
||||
virtual void onStencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath::FillType) SK_OVERRIDE;
|
||||
virtual bool onReserveVertexSpace(size_t vertexSize,
|
||||
int vertexCount,
|
||||
|
Loading…
Reference in New Issue
Block a user