Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/gpu/GrDrawTarget.h

Issue 13468004: Make drawRect preserve vertex attrib state and push/pop the geom sources. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrDrawState.h ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2010 Google Inc. 3 * Copyright 2010 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #ifndef GrDrawTarget_DEFINED 10 #ifndef GrDrawTarget_DEFINED
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 const SkRect* devBounds = NULL); 324 const SkRect* devBounds = NULL);
325 325
326 /** 326 /**
327 * Draws path into the stencil buffer. The fill must be either even/odd or 327 * Draws path into the stencil buffer. The fill must be either even/odd or
328 * winding (not inverse or hairline). It will respect the HW antialias flag 328 * winding (not inverse or hairline). It will respect the HW antialias flag
329 * on the draw state (if possible in the 3D API). 329 * on the draw state (if possible in the 3D API).
330 */ 330 */
331 void stencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath::FillType fill); 331 void stencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath::FillType fill);
332 332
333 /** 333 /**
334 * Helper function for drawing rects. This does not use the current index 334 * Helper function for drawing rects. It performs a geometry src push and po p
335 * and vertex sources. After returning, the vertex and index sources may 335 * and thus will finalize any reserved geometry.
336 * have changed. They should be reestablished before the next draw call.
337 * This cannot be called between reserving and releasing
338 * geometry.
339 *
340 * A subclass may override this to perform more optimal rect rendering. Its
341 * draws should be funneled through one of the public GrDrawTarget draw meth ods
342 * (e.g. drawNonIndexed, drawIndexedInstances, ...). The base class draws a two
343 * triangle fan using drawNonIndexed from reserved vertex space.
344 * 336 *
345 * @param rect the rect to draw 337 * @param rect the rect to draw
346 * @param matrix optional matrix applied to rect (before viewMatrix) 338 * @param matrix optional matrix applied to rect (before viewMatrix)
347 * @param localRect optional rect that specifies local coords to map onto 339 * @param localRect optional rect that specifies local coords to map onto
348 * rect. If NULL then rect serves as the local coords. 340 * rect. If NULL then rect serves as the local coords.
349 * @param localMatrix optional matrix applied to localRect. If 341 * @param localMatrix optional matrix applied to localRect. If
350 * srcRect is non-NULL and srcMatrix is non-NULL 342 * srcRect is non-NULL and srcMatrix is non-NULL
351 * then srcRect will be transformed by srcMatrix. 343 * then srcRect will be transformed by srcMatrix.
352 * srcMatrix can be NULL when no srcMatrix is desired. 344 * srcMatrix can be NULL when no srcMatrix is desired.
353 */ 345 */
354 virtual void drawRect(const GrRect& rect, 346 void drawRect(const GrRect& rect,
355 const SkMatrix* matrix, 347 const SkMatrix* matrix,
356 const GrRect* localRect, 348 const GrRect* localRect,
357 const SkMatrix* localMatrix); 349 const SkMatrix* localMatrix) {
350 AutoGeometryPush agp(this);
351 this->onDrawRect(rect, matrix, localRect, localMatrix);
352 }
358 353
359 /** 354 /**
360 * Helper for drawRect when the caller doesn't need separate local rects or matrices. 355 * Helper for drawRect when the caller doesn't need separate local rects or matrices.
361 */ 356 */
362 void drawSimpleRect(const GrRect& rect, const SkMatrix* matrix = NULL) { 357 void drawSimpleRect(const GrRect& rect, const SkMatrix* matrix = NULL) {
363 drawRect(rect, matrix, NULL, NULL); 358 drawRect(rect, matrix, NULL, NULL);
364 } 359 }
365 void drawSimpleRect(const GrIRect& irect, const SkMatrix* matrix = NULL) { 360 void drawSimpleRect(const GrIRect& irect, const SkMatrix* matrix = NULL) {
366 SkRect rect = SkRect::MakeFromIRect(irect); 361 SkRect rect = SkRect::MakeFromIRect(irect);
367 this->drawRect(rect, matrix, NULL, NULL); 362 this->drawRect(rect, matrix, NULL, NULL);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 } 521 }
527 private: 522 private:
528 GrDrawTarget* fTarget; 523 GrDrawTarget* fTarget;
529 const GrClipData* fClip; 524 const GrClipData* fClip;
530 SkTLazy<SkClipStack> fStack; 525 SkTLazy<SkClipStack> fStack;
531 GrClipData fReplacementClip; 526 GrClipData fReplacementClip;
532 }; 527 };
533 528
534 //////////////////////////////////////////////////////////////////////////// 529 ////////////////////////////////////////////////////////////////////////////
535 530
536 class AutoGeometryAndStatePush : ::GrNoncopyable { 531 /**
532 * Saves the geometry src state at construction and restores in the destruct or. It also saves
533 * and then restores the vertex attrib state.
534 */
535 class AutoGeometryPush : ::GrNoncopyable {
537 public: 536 public:
538 AutoGeometryAndStatePush(GrDrawTarget* target, ASRInit init) 537 AutoGeometryPush(GrDrawTarget* target)
539 : fState(target, init) { 538 : fAttribRestore(target->drawState()) {
540 GrAssert(NULL != target); 539 GrAssert(NULL != target);
541 fTarget = target; 540 fTarget = target;
542 target->pushGeometrySource(); 541 target->pushGeometrySource();
543 } 542 }
544 ~AutoGeometryAndStatePush() { 543
545 fTarget->popGeometrySource(); 544 ~AutoGeometryPush() { fTarget->popGeometrySource(); }
545
546 private:
547 GrDrawTarget* fTarget;
548 GrDrawState::AutoVertexAttribRestore fAttribRestore;
549 };
550
551 /**
552 * Combination of AutoGeometryPush and AutoStateRestore. The vertex attribs will be in default
553 * 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
554 */
555 class AutoGeometryAndStatePush : ::GrNoncopyable {
556 public:
557 AutoGeometryAndStatePush(GrDrawTarget* target, ASRInit init)
558 : fState(target, init){
559 GrAssert(NULL != target);
560 fTarget = target;
561 target->pushGeometrySource();
562 if (kPreserve_ASRInit == init) {
563 target->drawState()->setDefaultVertexAttribs();
564 }
546 } 565 }
566
567 ~AutoGeometryAndStatePush() { fTarget->popGeometrySource(); }
568
547 private: 569 private:
570 AutoStateRestore fState;
548 GrDrawTarget* fTarget; 571 GrDrawTarget* fTarget;
549 AutoStateRestore fState;
550 }; 572 };
551 573
552 protected: 574 protected:
553 575
554 enum GeometrySrcType { 576 enum GeometrySrcType {
555 kNone_GeometrySrcType, //<! src has not been specified 577 kNone_GeometrySrcType, //<! src has not been specified
556 kReserved_GeometrySrcType, //<! src was set using reserve*Space 578 kReserved_GeometrySrcType, //<! src was set using reserve*Space
557 kArray_GeometrySrcType, //<! src was set using set*SourceToArray 579 kArray_GeometrySrcType, //<! src was set using set*SourceToArray
558 kBuffer_GeometrySrcType //<! src was set using set*SourceToBuffer 580 kBuffer_GeometrySrcType //<! src was set using set*SourceToBuffer
559 }; 581 };
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 virtual void onSetVertexSourceToArray(const void* vertexArray, int vertexCou nt) = 0; 732 virtual void onSetVertexSourceToArray(const void* vertexArray, int vertexCou nt) = 0;
711 virtual void onSetIndexSourceToArray(const void* indexArray, int indexCount) = 0; 733 virtual void onSetIndexSourceToArray(const void* indexArray, int indexCount) = 0;
712 // subclass is notified that geom source will be set away from an array 734 // subclass is notified that geom source will be set away from an array
713 virtual void releaseVertexArray() = 0; 735 virtual void releaseVertexArray() = 0;
714 virtual void releaseIndexArray() = 0; 736 virtual void releaseIndexArray() = 0;
715 // subclass overrides to be notified just before geo src state is pushed/pop ped. 737 // subclass overrides to be notified just before geo src state is pushed/pop ped.
716 virtual void geometrySourceWillPush() = 0; 738 virtual void geometrySourceWillPush() = 0;
717 virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0; 739 virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
718 // subclass called to perform drawing 740 // subclass called to perform drawing
719 virtual void onDraw(const DrawInfo&) = 0; 741 virtual void onDraw(const DrawInfo&) = 0;
742 // Implementation of drawRect. The geometry src and vertex attribs will alre ady
743 // be saved before this is called and restored afterwards. A subclass may ov erride
744 // this to perform more optimal rect rendering. Its draws should be funneled through
745 // one of the public GrDrawTarget draw methods (e.g. drawNonIndexed,
746 // drawIndexedInstances, ...). The base class draws a two triangle fan using
747 // drawNonIndexed from reserved vertex space.
748 virtual void onDrawRect(const GrRect& rect,
749 const SkMatrix* matrix,
750 const GrRect* localRect,
751 const SkMatrix* localMatrix);
720 virtual void onStencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath: :FillType fill) = 0; 752 virtual void onStencilPath(const GrPath*, const SkStrokeRec& stroke, SkPath: :FillType fill) = 0;
721 753
722 // helpers for reserving vertex and index space. 754 // helpers for reserving vertex and index space.
723 bool reserveVertexSpace(size_t vertexSize, 755 bool reserveVertexSpace(size_t vertexSize,
724 int vertexCount, 756 int vertexCount,
725 void** vertices); 757 void** vertices);
726 bool reserveIndexSpace(int indexCount, void** indices); 758 bool reserveIndexSpace(int indexCount, void** indices);
727 759
728 // called by drawIndexed and drawNonIndexed. Use a negative indexCount to 760 // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
729 // indicate non-indexed drawing. 761 // indicate non-indexed drawing.
(...skipping 15 matching lines...) Expand all
745 const GrClipData* fClip; 777 const GrClipData* fClip;
746 GrDrawState* fDrawState; 778 GrDrawState* fDrawState;
747 GrDrawState fDefaultDraw State; 779 GrDrawState fDefaultDraw State;
748 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar get. 780 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar get.
749 GrContext* fContext; 781 GrContext* fContext;
750 782
751 typedef GrRefCnt INHERITED; 783 typedef GrRefCnt INHERITED;
752 }; 784 };
753 785
754 #endif 786 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrDrawState.h ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698