| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrDrawTarget_DEFINED | 8 #ifndef GrDrawTarget_DEFINED |
| 9 #define GrDrawTarget_DEFINED | 9 #define GrDrawTarget_DEFINED |
| 10 | 10 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "SkTypes.h" | 25 #include "SkTypes.h" |
| 26 #include "SkXfermode.h" | 26 #include "SkXfermode.h" |
| 27 | 27 |
| 28 class GrClipData; | 28 class GrClipData; |
| 29 class GrDrawTargetCaps; | 29 class GrDrawTargetCaps; |
| 30 class GrPath; | 30 class GrPath; |
| 31 class GrPathRange; | 31 class GrPathRange; |
| 32 class GrVertexBuffer; | 32 class GrVertexBuffer; |
| 33 | 33 |
| 34 class GrDrawTarget : public SkRefCnt { | 34 class GrDrawTarget : public SkRefCnt { |
| 35 protected: | |
| 36 class DrawInfo; | |
| 37 | |
| 38 public: | 35 public: |
| 39 SK_DECLARE_INST_COUNT(GrDrawTarget) | 36 SK_DECLARE_INST_COUNT(GrDrawTarget) |
| 40 | 37 |
| 41 typedef GrPathRendering::PathTransformType PathTransformType ; | 38 typedef GrPathRendering::PathTransformType PathTransformType ; |
| 42 | 39 |
| 43 /////////////////////////////////////////////////////////////////////////// | 40 /////////////////////////////////////////////////////////////////////////// |
| 44 | 41 |
| 45 // The context may not be fully constructed and should not be used during Gr
DrawTarget | 42 // The context may not be fully constructed and should not be used during Gr
DrawTarget |
| 46 // construction. | 43 // construction. |
| 47 GrDrawTarget(GrContext* context); | 44 GrDrawTarget(GrContext* context); |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 */ | 450 */ |
| 454 virtual void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* des
c); | 451 virtual void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* des
c); |
| 455 | 452 |
| 456 | 453 |
| 457 /** | 454 /** |
| 458 * Release any resources that are cached but not currently in use. This | 455 * Release any resources that are cached but not currently in use. This |
| 459 * is intended to give an application some recourse when resources are low. | 456 * is intended to give an application some recourse when resources are low. |
| 460 */ | 457 */ |
| 461 virtual void purgeResources() {}; | 458 virtual void purgeResources() {}; |
| 462 | 459 |
| 460 class DrawInfo; |
| 463 /** | 461 /** |
| 464 * For subclass internal use to invoke a call to onDraw(). See DrawInfo belo
w. | 462 * For subclass internal use to invoke a call to onDraw(). See DrawInfo belo
w. |
| 465 */ | 463 */ |
| 466 void executeDraw(const DrawInfo& info, | 464 void executeDraw(const DrawInfo& info, |
| 467 const GrClipMaskManager::ScissorState& scissorState) { | 465 const GrClipMaskManager::ScissorState& scissorState) { |
| 468 this->onDraw(info, scissorState); | 466 this->onDraw(info, scissorState); |
| 469 } | 467 } |
| 470 | 468 |
| 471 /** | 469 /** |
| 472 * For subclass internal use to invoke a call to onStencilPath(). | 470 * For subclass internal use to invoke a call to onStencilPath(). |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID);
} | 681 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID);
} |
| 684 | 682 |
| 685 private: | 683 private: |
| 686 GrDrawTarget* fDrawTarget; | 684 GrDrawTarget* fDrawTarget; |
| 687 uint32_t fDrawID; // this may wrap, but we're doing direct compa
rison | 685 uint32_t fDrawID; // this may wrap, but we're doing direct compa
rison |
| 688 // so that should be okay | 686 // so that should be okay |
| 689 }; | 687 }; |
| 690 | 688 |
| 691 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); } | 689 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); } |
| 692 | 690 |
| 691 /** |
| 692 * Used to communicate draws to GPUs / subclasses |
| 693 */ |
| 694 class DrawInfo { |
| 695 public: |
| 696 DrawInfo(const DrawInfo& di) { (*this) = di; } |
| 697 DrawInfo& operator =(const DrawInfo& di); |
| 698 |
| 699 GrPrimitiveType primitiveType() const { return fPrimitiveType; } |
| 700 int startVertex() const { return fStartVertex; } |
| 701 int startIndex() const { return fStartIndex; } |
| 702 int vertexCount() const { return fVertexCount; } |
| 703 int indexCount() const { return fIndexCount; } |
| 704 int verticesPerInstance() const { return fVerticesPerInstance; } |
| 705 int indicesPerInstance() const { return fIndicesPerInstance; } |
| 706 int instanceCount() const { return fInstanceCount; } |
| 707 |
| 708 bool isIndexed() const { return fIndexCount > 0; } |
| 709 #ifdef SK_DEBUG |
| 710 bool isInstanced() const; // this version is longer because of asserts |
| 711 #else |
| 712 bool isInstanced() const { return fInstanceCount > 0; } |
| 713 #endif |
| 714 |
| 715 // adds or remove instances |
| 716 void adjustInstanceCount(int instanceOffset); |
| 717 // shifts the start vertex |
| 718 void adjustStartVertex(int vertexOffset); |
| 719 // shifts the start index |
| 720 void adjustStartIndex(int indexOffset); |
| 721 |
| 722 void setDevBounds(const SkRect& bounds) { |
| 723 fDevBoundsStorage = bounds; |
| 724 fDevBounds = &fDevBoundsStorage; |
| 725 } |
| 726 const SkRect* getDevBounds() const { return fDevBounds; } |
| 727 |
| 728 // NULL if no copy of the dst is needed for the draw. |
| 729 const GrDeviceCoordTexture* getDstCopy() const { |
| 730 if (fDstCopy.texture()) { |
| 731 return &fDstCopy; |
| 732 } else { |
| 733 return NULL; |
| 734 } |
| 735 } |
| 736 |
| 737 private: |
| 738 DrawInfo() { fDevBounds = NULL; } |
| 739 |
| 740 friend class GrDrawTarget; |
| 741 |
| 742 GrPrimitiveType fPrimitiveType; |
| 743 |
| 744 int fStartVertex; |
| 745 int fStartIndex; |
| 746 int fVertexCount; |
| 747 int fIndexCount; |
| 748 |
| 749 int fInstanceCount; |
| 750 int fVerticesPerInstance; |
| 751 int fIndicesPerInstance; |
| 752 |
| 753 SkRect fDevBoundsStorage; |
| 754 SkRect* fDevBounds; |
| 755 |
| 756 GrDeviceCoordTexture fDstCopy; |
| 757 }; |
| 693 | 758 |
| 694 bool programUnitTest(int maxStages); | 759 bool programUnitTest(int maxStages); |
| 695 | 760 |
| 696 protected: | 761 protected: |
| 697 // Extend access to GrDrawState::convertToPEndeingExec to subclasses. | 762 // Extend access to GrDrawState::convertToPEndeingExec to subclasses. |
| 698 void convertDrawStateToPendingExec(GrDrawState* ds) { | 763 void convertDrawStateToPendingExec(GrDrawState* ds) { |
| 699 ds->convertToPendingExec(); | 764 ds->convertToPendingExec(); |
| 700 } | 765 } |
| 701 | 766 |
| 702 enum GeometrySrcType { | 767 enum GeometrySrcType { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 // the vertex layout is only valid if a vertex source has been specified
. | 824 // the vertex layout is only valid if a vertex source has been specified
. |
| 760 SkASSERT(this->getGeomSrc().fVertexSrc != kNone_GeometrySrcType); | 825 SkASSERT(this->getGeomSrc().fVertexSrc != kNone_GeometrySrcType); |
| 761 return this->getGeomSrc().fVertexSize; | 826 return this->getGeomSrc().fVertexSize; |
| 762 } | 827 } |
| 763 | 828 |
| 764 // Subclass must initialize this in its constructor. | 829 // Subclass must initialize this in its constructor. |
| 765 SkAutoTUnref<const GrDrawTargetCaps> fCaps; | 830 SkAutoTUnref<const GrDrawTargetCaps> fCaps; |
| 766 | 831 |
| 767 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers
; } | 832 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers
; } |
| 768 | 833 |
| 769 /** | |
| 770 * Used to communicate draws to subclass's onDraw function. | |
| 771 */ | |
| 772 class DrawInfo { | |
| 773 public: | |
| 774 DrawInfo(const DrawInfo& di) { (*this) = di; } | |
| 775 DrawInfo& operator =(const DrawInfo& di); | |
| 776 | |
| 777 GrPrimitiveType primitiveType() const { return fPrimitiveType; } | |
| 778 int startVertex() const { return fStartVertex; } | |
| 779 int startIndex() const { return fStartIndex; } | |
| 780 int vertexCount() const { return fVertexCount; } | |
| 781 int indexCount() const { return fIndexCount; } | |
| 782 int verticesPerInstance() const { return fVerticesPerInstance; } | |
| 783 int indicesPerInstance() const { return fIndicesPerInstance; } | |
| 784 int instanceCount() const { return fInstanceCount; } | |
| 785 | |
| 786 bool isIndexed() const { return fIndexCount > 0; } | |
| 787 #ifdef SK_DEBUG | |
| 788 bool isInstanced() const; // this version is longer because of asserts | |
| 789 #else | |
| 790 bool isInstanced() const { return fInstanceCount > 0; } | |
| 791 #endif | |
| 792 | |
| 793 // adds or remove instances | |
| 794 void adjustInstanceCount(int instanceOffset); | |
| 795 // shifts the start vertex | |
| 796 void adjustStartVertex(int vertexOffset); | |
| 797 // shifts the start index | |
| 798 void adjustStartIndex(int indexOffset); | |
| 799 | |
| 800 void setDevBounds(const SkRect& bounds) { | |
| 801 fDevBoundsStorage = bounds; | |
| 802 fDevBounds = &fDevBoundsStorage; | |
| 803 } | |
| 804 const SkRect* getDevBounds() const { return fDevBounds; } | |
| 805 | |
| 806 // NULL if no copy of the dst is needed for the draw. | |
| 807 const GrDeviceCoordTexture* getDstCopy() const { | |
| 808 if (fDstCopy.texture()) { | |
| 809 return &fDstCopy; | |
| 810 } else { | |
| 811 return NULL; | |
| 812 } | |
| 813 } | |
| 814 | |
| 815 private: | |
| 816 DrawInfo() { fDevBounds = NULL; } | |
| 817 | |
| 818 friend class GrDrawTarget; | |
| 819 | |
| 820 GrPrimitiveType fPrimitiveType; | |
| 821 | |
| 822 int fStartVertex; | |
| 823 int fStartIndex; | |
| 824 int fVertexCount; | |
| 825 int fIndexCount; | |
| 826 | |
| 827 int fInstanceCount; | |
| 828 int fVerticesPerInstance; | |
| 829 int fIndicesPerInstance; | |
| 830 | |
| 831 SkRect fDevBoundsStorage; | |
| 832 SkRect* fDevBounds; | |
| 833 | |
| 834 GrDeviceCoordTexture fDstCopy; | |
| 835 }; | |
| 836 | |
| 837 // Makes a copy of the dst if it is necessary for the draw. Returns false if
a copy is required | 834 // Makes a copy of the dst if it is necessary for the draw. Returns false if
a copy is required |
| 838 // but couldn't be made. Otherwise, returns true. This method needs to be p
rotected because it | 835 // but couldn't be made. Otherwise, returns true. This method needs to be p
rotected because it |
| 839 // needs to be accessed by GLPrograms to setup a correct drawstate | 836 // needs to be accessed by GLPrograms to setup a correct drawstate |
| 840 bool setupDstReadIfNecessary(DrawInfo* info) { | 837 bool setupDstReadIfNecessary(DrawInfo* info) { |
| 841 return this->setupDstReadIfNecessary(&info->fDstCopy, info->getDevBounds
()); | 838 return this->setupDstReadIfNecessary(&info->fDstCopy, info->getDevBounds
()); |
| 842 } | 839 } |
| 843 bool setupDstReadIfNecessary(GrDeviceCoordTexture* dstCopy, const SkRect* dr
awBounds); | 840 bool setupDstReadIfNecessary(GrDeviceCoordTexture* dstCopy, const SkRect* dr
awBounds); |
| 844 | 841 |
| 845 private: | 842 private: |
| 846 // A subclass can optionally overload this function to be notified before | 843 // A subclass can optionally overload this function to be notified before |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 const GrClipData* fClip; | 919 const GrClipData* fClip; |
| 923 GrDrawState* fDrawState; | 920 GrDrawState* fDrawState; |
| 924 GrDrawState fDefaultDraw
State; | 921 GrDrawState fDefaultDraw
State; |
| 925 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar
get. | 922 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar
get. |
| 926 GrContext* fContext; | 923 GrContext* fContext; |
| 927 // To keep track that we always have at least as many debug marker adds as r
emoves | 924 // To keep track that we always have at least as many debug marker adds as r
emoves |
| 928 int fGpuTraceMar
kerCount; | 925 int fGpuTraceMar
kerCount; |
| 929 GrTraceMarkerSet fActiveTrace
Markers; | 926 GrTraceMarkerSet fActiveTrace
Markers; |
| 930 GrTraceMarkerSet fStoredTrace
Markers; | 927 GrTraceMarkerSet fStoredTrace
Markers; |
| 931 | 928 |
| 929 // TODO fix this |
| 930 friend class GrGpu; |
| 931 friend class GrGpuGL; |
| 932 |
| 932 typedef SkRefCnt INHERITED; | 933 typedef SkRefCnt INHERITED; |
| 933 }; | 934 }; |
| 934 | 935 |
| 935 /* | 936 /* |
| 936 * This class is JUST for clip mask manager. Everyone else should just use draw
target above. | 937 * This class is JUST for clip mask manager. Everyone else should just use draw
target above. |
| 937 */ | 938 */ |
| 938 class GrClipTarget : public GrDrawTarget { | 939 class GrClipTarget : public GrDrawTarget { |
| 939 public: | 940 public: |
| 940 GrClipTarget(GrContext* context) : INHERITED(context) { | 941 GrClipTarget(GrContext* context) : INHERITED(context) { |
| 941 fClipMaskManager.setClipTarget(this); | 942 fClipMaskManager.setClipTarget(this); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 | 974 |
| 974 virtual bool setupClip(const SkRect* devBounds, | 975 virtual bool setupClip(const SkRect* devBounds, |
| 975 GrDrawState::AutoRestoreEffects* are, | 976 GrDrawState::AutoRestoreEffects* are, |
| 976 GrDrawState::AutoRestoreStencil* ars, | 977 GrDrawState::AutoRestoreStencil* ars, |
| 977 GrClipMaskManager::ScissorState* scissorState) SK_OVE
RRIDE; | 978 GrClipMaskManager::ScissorState* scissorState) SK_OVE
RRIDE; |
| 978 | 979 |
| 979 typedef GrDrawTarget INHERITED; | 980 typedef GrDrawTarget INHERITED; |
| 980 }; | 981 }; |
| 981 | 982 |
| 982 #endif | 983 #endif |
| OLD | NEW |