Chromium Code Reviews| Index: src/gpu/GrDrawTarget.h |
| =================================================================== |
| --- src/gpu/GrDrawTarget.h (revision 8471) |
| +++ src/gpu/GrDrawTarget.h (working copy) |
| @@ -331,17 +331,9 @@ |
| 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. |
| + * Helper function for drawing rects. It performs a geometry src push and pop |
| + * and thus will finalize any reserved 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. |
| - * |
| * @param rect the rect to draw |
| * @param matrix optional matrix applied to rect (before viewMatrix) |
| * @param localRect optional rect that specifies local coords to map onto |
| @@ -351,10 +343,13 @@ |
| * 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 @@ |
| //////////////////////////////////////////////////////////////////////////// |
| + /** |
| + * 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. |
|
jvanverth1
2013/04/02 18:45:35
Maybe I'm misunderstanding. What happens if the pu
bsalomon
2013/04/02 18:47:39
It's already using an AutoStateRestore. So it will
|
| + */ |
| 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: |
| + AutoStateRestore fState; |
| GrDrawTarget* fTarget; |
| - AutoStateRestore fState; |
| }; |
| protected: |
| @@ -717,6 +739,16 @@ |
| 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. |