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
* nicer looking.
////////////////////////////////////////////////////////////////////////////////
-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},
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)
* 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.
////////////////////////////////////////////////////////////////////////////
+ /**
+ * 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:
+ AutoGeometryPush(GrDrawTarget* target)
+ : fAttribRestore(target->drawState()) {
+ GrAssert(NULL != target);
+ fTarget = target;
+ target->pushGeometrySource();
+ }
+
+ ~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) {
+ : fState(target, init){
GrAssert(NULL != target);
fTarget = target;
target->pushGeometrySource();
+ if (kPreserve_ASRInit == init) {
+ target->drawState()->setDefaultVertexAttribs();
+ }
}
- ~AutoGeometryAndStatePush() {
- fTarget->popGeometrySource();
- }
+
+ ~AutoGeometryAndStatePush() { fTarget->popGeometrySource(); }
+
private:
- GrDrawTarget* fTarget;
AutoStateRestore fState;
+ GrDrawTarget* fTarget;
};
protected:
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.
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;
// 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,