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 |
11 #include "GrClipData.h" | 11 #include "GrClip.h" |
12 #include "GrClipMaskManager.h" | 12 #include "GrClipMaskManager.h" |
13 #include "GrContext.h" | 13 #include "GrContext.h" |
14 #include "GrPathProcessor.h" | 14 #include "GrPathProcessor.h" |
15 #include "GrPrimitiveProcessor.h" | 15 #include "GrPrimitiveProcessor.h" |
16 #include "GrIndexBuffer.h" | 16 #include "GrIndexBuffer.h" |
17 #include "GrPathRendering.h" | 17 #include "GrPathRendering.h" |
18 #include "GrPipelineBuilder.h" | 18 #include "GrPipelineBuilder.h" |
19 #include "GrTraceMarker.h" | 19 #include "GrTraceMarker.h" |
20 #include "GrVertexBuffer.h" | 20 #include "GrVertexBuffer.h" |
21 | 21 |
22 #include "SkClipStack.h" | 22 #include "SkClipStack.h" |
23 #include "SkMatrix.h" | 23 #include "SkMatrix.h" |
24 #include "SkPath.h" | 24 #include "SkPath.h" |
25 #include "SkStrokeRec.h" | 25 #include "SkStrokeRec.h" |
26 #include "SkTArray.h" | 26 #include "SkTArray.h" |
27 #include "SkTLazy.h" | 27 #include "SkTLazy.h" |
28 #include "SkTypes.h" | 28 #include "SkTypes.h" |
29 #include "SkXfermode.h" | 29 #include "SkXfermode.h" |
30 | 30 |
31 class GrBatch; | 31 class GrBatch; |
32 class GrClipData; | 32 class GrClip; |
33 class GrDrawTargetCaps; | 33 class GrDrawTargetCaps; |
34 class GrPath; | 34 class GrPath; |
35 class GrPathRange; | 35 class GrPathRange; |
36 class GrPipeline; | 36 class GrPipeline; |
37 | 37 |
38 class GrDrawTarget : public SkRefCnt { | 38 class GrDrawTarget : public SkRefCnt { |
39 public: | 39 public: |
40 SK_DECLARE_INST_COUNT(GrDrawTarget) | 40 SK_DECLARE_INST_COUNT(GrDrawTarget) |
41 | 41 |
42 typedef GrPathRange::PathIndexType PathIndexType; | 42 typedef GrPathRange::PathIndexType PathIndexType; |
43 typedef GrPathRendering::PathTransformType PathTransformType; | 43 typedef GrPathRendering::PathTransformType PathTransformType; |
44 | 44 |
45 /////////////////////////////////////////////////////////////////////////// | 45 /////////////////////////////////////////////////////////////////////////// |
46 | 46 |
47 // The context may not be fully constructed and should not be used during Gr
DrawTarget | 47 // The context may not be fully constructed and should not be used during Gr
DrawTarget |
48 // construction. | 48 // construction. |
49 GrDrawTarget(GrContext* context); | 49 GrDrawTarget(GrContext* context); |
50 virtual ~GrDrawTarget(); | 50 virtual ~GrDrawTarget(); |
51 | 51 |
52 /** | 52 /** |
53 * Gets the capabilities of the draw target. | 53 * Gets the capabilities of the draw target. |
54 */ | 54 */ |
55 const GrDrawTargetCaps* caps() const { return fCaps.get(); } | 55 const GrDrawTargetCaps* caps() const { return fCaps.get(); } |
56 | 56 |
57 /** | 57 /** |
58 * Sets the current clip to the region specified by clip. All draws will be | |
59 * clipped against this clip if kClip_StateBit is enabled. | |
60 * | |
61 * Setting the clip may (or may not) zero out the client's stencil bits. | |
62 * | |
63 * @param description of the clipping region | |
64 */ | |
65 void setClip(const GrClipData* clip); | |
66 | |
67 /** | |
68 * Gets the current clip. | |
69 * | |
70 * @return the clip. | |
71 */ | |
72 const GrClipData* getClip() const; | |
73 | |
74 /** | |
75 * There are two types of "sources" of geometry (vertices and indices) for | 58 * There are two types of "sources" of geometry (vertices and indices) for |
76 * draw calls made on the target. When performing an indexed draw, the | 59 * draw calls made on the target. When performing an indexed draw, the |
77 * indices and vertices can use different source types. Once a source is | 60 * indices and vertices can use different source types. Once a source is |
78 * specified it can be used for multiple draws. However, the time at which | 61 * specified it can be used for multiple draws. However, the time at which |
79 * the geometry data is no longer editable depends on the source type. | 62 * the geometry data is no longer editable depends on the source type. |
80 * | 63 * |
81 * Sometimes it is necessary to perform a draw while upstack code has | 64 * Sometimes it is necessary to perform a draw while upstack code has |
82 * already specified geometry that it isn't finished with. So there are push | 65 * already specified geometry that it isn't finished with. So there are push |
83 * and pop methods. This allows the client to push the sources, draw | 66 * and pop methods. This allows the client to push the sources, draw |
84 * something using alternate sources, and then pop to restore the original | 67 * something using alternate sources, and then pop to restore the original |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 * not a request for clipping. | 240 * not a request for clipping. |
258 */ | 241 */ |
259 void drawNonIndexed(GrPipelineBuilder*, | 242 void drawNonIndexed(GrPipelineBuilder*, |
260 const GrGeometryProcessor*, | 243 const GrGeometryProcessor*, |
261 GrPrimitiveType type, | 244 GrPrimitiveType type, |
262 int startVertex, | 245 int startVertex, |
263 int vertexCount, | 246 int vertexCount, |
264 const SkRect* devBounds = NULL); | 247 const SkRect* devBounds = NULL); |
265 | 248 |
266 // TODO devbounds should live on the batch | 249 // TODO devbounds should live on the batch |
267 void drawBatch(GrPipelineBuilder*, | 250 void drawBatch(GrPipelineBuilder*, GrBatch*, const SkRect* devBounds = NULL)
; |
268 GrBatch*, | |
269 const SkRect* devBounds = NULL); | |
270 | 251 |
271 /** | 252 /** |
272 * Draws path into the stencil buffer. The fill must be either even/odd or | 253 * Draws path into the stencil buffer. The fill must be either even/odd or |
273 * winding (not inverse or hairline). It will respect the HW antialias flag | 254 * winding (not inverse or hairline). It will respect the HW antialias flag |
274 * on the GrPipelineBuilder (if possible in the 3D API). Note, we will neve
r have an inverse | 255 * on the GrPipelineBuilder (if possible in the 3D API). Note, we will neve
r have an inverse |
275 * fill with stencil path | 256 * fill with stencil path |
276 */ | 257 */ |
277 void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*, | 258 void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*, |
278 GrPathRendering::FillType); | 259 GrPathRendering::FillType); |
279 | 260 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 private: | 449 private: |
469 void reset(); | 450 void reset(); |
470 | 451 |
471 GrDrawTarget* fTarget; | 452 GrDrawTarget* fTarget; |
472 void* fVertices; | 453 void* fVertices; |
473 void* fIndices; | 454 void* fIndices; |
474 }; | 455 }; |
475 | 456 |
476 //////////////////////////////////////////////////////////////////////////// | 457 //////////////////////////////////////////////////////////////////////////// |
477 | 458 |
478 class AutoClipRestore : public ::SkNoncopyable { | |
479 public: | |
480 AutoClipRestore(GrDrawTarget* target) { | |
481 fTarget = target; | |
482 fClip = fTarget->getClip(); | |
483 } | |
484 | |
485 AutoClipRestore(GrDrawTarget* target, const SkIRect& newClip); | |
486 | |
487 ~AutoClipRestore() { | |
488 fTarget->setClip(fClip); | |
489 } | |
490 private: | |
491 GrDrawTarget* fTarget; | |
492 const GrClipData* fClip; | |
493 SkTLazy<SkClipStack> fStack; | |
494 GrClipData fReplacementClip; | |
495 }; | |
496 | |
497 //////////////////////////////////////////////////////////////////////////// | |
498 | |
499 /** | 459 /** |
500 * Saves the geometry src state at construction and restores in the destruct
or. It also saves | 460 * Saves the geometry src state at construction and restores in the destruct
or. It also saves |
501 * and then restores the vertex attrib state. | 461 * and then restores the vertex attrib state. |
502 */ | 462 */ |
503 class AutoGeometryPush : public ::SkNoncopyable { | 463 class AutoGeometryPush : public ::SkNoncopyable { |
504 public: | 464 public: |
505 AutoGeometryPush(GrDrawTarget* target) { | 465 AutoGeometryPush(GrDrawTarget* target) { |
506 SkASSERT(target); | 466 SkASSERT(target); |
507 fTarget = target; | 467 fTarget = target; |
508 target->pushGeometrySource(); | 468 target->pushGeometrySource(); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 // but couldn't be made. Otherwise, returns true. This method needs to be p
rotected because it | 641 // but couldn't be made. Otherwise, returns true. This method needs to be p
rotected because it |
682 // needs to be accessed by GLPrograms to setup a correct drawstate | 642 // needs to be accessed by GLPrograms to setup a correct drawstate |
683 bool setupDstReadIfNecessary(const GrPipelineBuilder&, | 643 bool setupDstReadIfNecessary(const GrPipelineBuilder&, |
684 const GrProcOptInfo& colorPOI, | 644 const GrProcOptInfo& colorPOI, |
685 const GrProcOptInfo& coveragePOI, | 645 const GrProcOptInfo& coveragePOI, |
686 GrDeviceCoordTexture* dstCopy, | 646 GrDeviceCoordTexture* dstCopy, |
687 const SkRect* drawBounds); | 647 const SkRect* drawBounds); |
688 | 648 |
689 struct PipelineInfo { | 649 struct PipelineInfo { |
690 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor
, | 650 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor
, |
691 const GrPrimitiveProcessor* primProc, const SkRect* devBoun
ds, | 651 const GrPrimitiveProcessor* primProc, |
692 GrDrawTarget* target); | 652 const SkRect* devBounds, GrDrawTarget* target); |
693 | 653 |
694 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor
, | 654 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor
, |
695 const GrBatch* batch, const SkRect* devBounds, GrDrawTarget
* target); | 655 const GrBatch* batch, const SkRect* devBounds, |
| 656 GrDrawTarget* target); |
696 | 657 |
697 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const { | 658 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const { |
698 return fPipelineBuilder->willBlendWithDst(primProc); | 659 return fPipelineBuilder->willBlendWithDst(primProc); |
699 } | 660 } |
700 private: | 661 private: |
701 friend class GrDrawTarget; | 662 friend class GrDrawTarget; |
702 | 663 |
703 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); } | 664 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); } |
704 | 665 |
705 GrPipelineBuilder* fPipelineBuilder; | 666 GrPipelineBuilder* fPipelineBuilder; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 virtual bool setupClip(GrPipelineBuilder*, | 792 virtual bool setupClip(GrPipelineBuilder*, |
832 GrPipelineBuilder::AutoRestoreEffects* are, | 793 GrPipelineBuilder::AutoRestoreEffects* are, |
833 GrPipelineBuilder::AutoRestoreStencil* ars, | 794 GrPipelineBuilder::AutoRestoreStencil* ars, |
834 GrScissorState* scissorState, | 795 GrScissorState* scissorState, |
835 const SkRect* devBounds) = 0; | 796 const SkRect* devBounds) = 0; |
836 | 797 |
837 enum { | 798 enum { |
838 kPreallocGeoSrcStateStackCnt = 4, | 799 kPreallocGeoSrcStateStackCnt = 4, |
839 }; | 800 }; |
840 SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcState
Stack; | 801 SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcState
Stack; |
841 const GrClipData* fClip; | |
842 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar
get. | 802 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar
get. |
843 GrContext* fContext; | 803 GrContext* fContext; |
844 // To keep track that we always have at least as many debug marker adds as r
emoves | 804 // To keep track that we always have at least as many debug marker adds as r
emoves |
845 int fGpuTraceMar
kerCount; | 805 int fGpuTraceMar
kerCount; |
846 GrTraceMarkerSet fActiveTrace
Markers; | 806 GrTraceMarkerSet fActiveTrace
Markers; |
847 GrTraceMarkerSet fStoredTrace
Markers; | 807 GrTraceMarkerSet fStoredTrace
Markers; |
848 | 808 |
849 typedef SkRefCnt INHERITED; | 809 typedef SkRefCnt INHERITED; |
850 }; | 810 }; |
851 | 811 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 virtual bool setupClip(GrPipelineBuilder*, | 851 virtual bool setupClip(GrPipelineBuilder*, |
892 GrPipelineBuilder::AutoRestoreEffects* are, | 852 GrPipelineBuilder::AutoRestoreEffects* are, |
893 GrPipelineBuilder::AutoRestoreStencil* ars, | 853 GrPipelineBuilder::AutoRestoreStencil* ars, |
894 GrScissorState* scissorState, | 854 GrScissorState* scissorState, |
895 const SkRect* devBounds) SK_OVERRIDE; | 855 const SkRect* devBounds) SK_OVERRIDE; |
896 | 856 |
897 typedef GrDrawTarget INHERITED; | 857 typedef GrDrawTarget INHERITED; |
898 }; | 858 }; |
899 | 859 |
900 #endif | 860 #endif |
OLD | NEW |