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*, |
259 const GrPathProcessor*, | |
260 const GrPath*, | |
278 GrPathRendering::FillType); | 261 GrPathRendering::FillType); |
279 | 262 |
280 /** | 263 /** |
281 * Draws a path. Fill must not be a hairline. It will respect the HW | 264 * Draws a path. Fill must not be a hairline. It will respect the HW |
282 * antialias flag on the GrPipelineBuilder (if possible in the 3D API). | 265 * antialias flag on the GrPipelineBuilder (if possible in the 3D API). |
283 */ | 266 */ |
284 void drawPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*, | 267 void drawPath(GrPipelineBuilder*, |
268 const GrPathProcessor*, | |
269 const GrPath*, | |
285 GrPathRendering::FillType); | 270 GrPathRendering::FillType); |
286 | 271 |
287 /** | 272 /** |
288 * Draws the aggregate path from combining multiple. Note that this will not | 273 * Draws the aggregate path from combining multiple. Note that this will not |
289 * always be equivalent to back-to-back calls to drawPath(). It will respect | 274 * always be equivalent to back-to-back calls to drawPath(). It will respect |
290 * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API ). | 275 * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API ). |
291 * | 276 * |
292 * @param pathRange Source paths to draw from | 277 * @param pathRange Source paths to draw from |
293 * @param indices Array of path indices to draw | 278 * @param indices Array of path indices to draw |
294 * @param indexType Data type of the array elements in indexBuffer | 279 * @param indexType Data type of the array elements in indexBuffer |
(...skipping 30 matching lines...) Expand all Loading... | |
325 const SkRect& rect, | 310 const SkRect& rect, |
326 const SkRect* localRect, | 311 const SkRect* localRect, |
327 const SkMatrix* localMatrix) { | 312 const SkMatrix* localMatrix) { |
328 AutoGeometryPush agp(this); | 313 AutoGeometryPush agp(this); |
329 this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, lo calMatrix); | 314 this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, lo calMatrix); |
330 } | 315 } |
331 | 316 |
332 /** | 317 /** |
333 * Helper for drawRect when the caller doesn't need separate local rects or matrices. | 318 * Helper for drawRect when the caller doesn't need separate local rects or matrices. |
334 */ | 319 */ |
335 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& vi ewM, | 320 void drawSimpleRect(GrPipelineBuilder* ds, |
321 GrColor color, | |
322 const SkMatrix& viewM, | |
336 const SkRect& rect) { | 323 const SkRect& rect) { |
337 this->drawRect(ds, color, viewM, rect, NULL, NULL); | 324 this->drawRect(ds, color, viewM, rect, NULL, NULL); |
338 } | 325 } |
339 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& vi ewM, | 326 void drawSimpleRect(GrPipelineBuilder* ds, |
bsalomon
2015/02/23 19:31:29
A lot of the lines in this change are just wrappin
| |
327 GrColor color, | |
328 const SkMatrix& viewM, | |
340 const SkIRect& irect) { | 329 const SkIRect& irect) { |
341 SkRect rect = SkRect::Make(irect); | 330 SkRect rect = SkRect::Make(irect); |
342 this->drawRect(ds, color, viewM, rect, NULL, NULL); | 331 this->drawRect(ds, color, viewM, rect, NULL, NULL); |
343 } | 332 } |
344 | 333 |
345 /** | 334 /** |
346 * This call is used to draw multiple instances of some geometry with a | 335 * This call is used to draw multiple instances of some geometry with a |
347 * given number of vertices (V) and indices (I) per-instance. The indices in | 336 * given number of vertices (V) and indices (I) per-instance. The indices in |
348 * the index source must have the form i[k+I] == i[k] + V. Also, all indices | 337 * the index source must have the form i[k+I] == i[k] + V. Also, all indices |
349 * i[kI] ... i[(k+1)I-1] must be elements of the range kV ... (k+1)V-1. As a | 338 * i[kI] ... i[(k+1)I-1] must be elements of the range kV ... (k+1)V-1. As a |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
468 private: | 457 private: |
469 void reset(); | 458 void reset(); |
470 | 459 |
471 GrDrawTarget* fTarget; | 460 GrDrawTarget* fTarget; |
472 void* fVertices; | 461 void* fVertices; |
473 void* fIndices; | 462 void* fIndices; |
474 }; | 463 }; |
475 | 464 |
476 //////////////////////////////////////////////////////////////////////////// | 465 //////////////////////////////////////////////////////////////////////////// |
477 | 466 |
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 /** | 467 /** |
500 * Saves the geometry src state at construction and restores in the destruct or. It also saves | 468 * Saves the geometry src state at construction and restores in the destruct or. It also saves |
501 * and then restores the vertex attrib state. | 469 * and then restores the vertex attrib state. |
502 */ | 470 */ |
503 class AutoGeometryPush : public ::SkNoncopyable { | 471 class AutoGeometryPush : public ::SkNoncopyable { |
504 public: | 472 public: |
505 AutoGeometryPush(GrDrawTarget* target) { | 473 AutoGeometryPush(GrDrawTarget* target) { |
506 SkASSERT(target); | 474 SkASSERT(target); |
507 fTarget = target; | 475 fTarget = target; |
508 target->pushGeometrySource(); | 476 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 | 649 // 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 | 650 // needs to be accessed by GLPrograms to setup a correct drawstate |
683 bool setupDstReadIfNecessary(const GrPipelineBuilder&, | 651 bool setupDstReadIfNecessary(const GrPipelineBuilder&, |
684 const GrProcOptInfo& colorPOI, | 652 const GrProcOptInfo& colorPOI, |
685 const GrProcOptInfo& coveragePOI, | 653 const GrProcOptInfo& coveragePOI, |
686 GrDeviceCoordTexture* dstCopy, | 654 GrDeviceCoordTexture* dstCopy, |
687 const SkRect* drawBounds); | 655 const SkRect* drawBounds); |
688 | 656 |
689 struct PipelineInfo { | 657 struct PipelineInfo { |
690 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor , | 658 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor , |
691 const GrPrimitiveProcessor* primProc, const SkRect* devBoun ds, | 659 const GrPrimitiveProcessor* primProc, |
692 GrDrawTarget* target); | 660 const SkRect* devBounds, GrDrawTarget* target); |
693 | 661 |
694 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor , | 662 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor , |
695 const GrBatch* batch, const SkRect* devBounds, GrDrawTarget * target); | 663 const GrBatch* batch, const SkRect* devBounds, |
664 GrDrawTarget* target); | |
696 | 665 |
697 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const { | 666 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const { |
698 return fPipelineBuilder->willBlendWithDst(primProc); | 667 return fPipelineBuilder->willBlendWithDst(primProc); |
699 } | 668 } |
700 private: | 669 private: |
701 friend class GrDrawTarget; | 670 friend class GrDrawTarget; |
702 | 671 |
703 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); } | 672 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); } |
704 | 673 |
705 GrPipelineBuilder* fPipelineBuilder; | 674 GrPipelineBuilder* fPipelineBuilder; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
831 virtual bool setupClip(GrPipelineBuilder*, | 800 virtual bool setupClip(GrPipelineBuilder*, |
832 GrPipelineBuilder::AutoRestoreEffects* are, | 801 GrPipelineBuilder::AutoRestoreEffects* are, |
833 GrPipelineBuilder::AutoRestoreStencil* ars, | 802 GrPipelineBuilder::AutoRestoreStencil* ars, |
834 GrScissorState* scissorState, | 803 GrScissorState* scissorState, |
835 const SkRect* devBounds) = 0; | 804 const SkRect* devBounds) = 0; |
836 | 805 |
837 enum { | 806 enum { |
838 kPreallocGeoSrcStateStackCnt = 4, | 807 kPreallocGeoSrcStateStackCnt = 4, |
839 }; | 808 }; |
840 SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcState Stack; | 809 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. | 810 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTar get. |
843 GrContext* fContext; | 811 GrContext* fContext; |
844 // To keep track that we always have at least as many debug marker adds as r emoves | 812 // To keep track that we always have at least as many debug marker adds as r emoves |
845 int fGpuTraceMar kerCount; | 813 int fGpuTraceMar kerCount; |
846 GrTraceMarkerSet fActiveTrace Markers; | 814 GrTraceMarkerSet fActiveTrace Markers; |
847 GrTraceMarkerSet fStoredTrace Markers; | 815 GrTraceMarkerSet fStoredTrace Markers; |
848 | 816 |
849 typedef SkRefCnt INHERITED; | 817 typedef SkRefCnt INHERITED; |
850 }; | 818 }; |
851 | 819 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
891 virtual bool setupClip(GrPipelineBuilder*, | 859 virtual bool setupClip(GrPipelineBuilder*, |
892 GrPipelineBuilder::AutoRestoreEffects* are, | 860 GrPipelineBuilder::AutoRestoreEffects* are, |
893 GrPipelineBuilder::AutoRestoreStencil* ars, | 861 GrPipelineBuilder::AutoRestoreStencil* ars, |
894 GrScissorState* scissorState, | 862 GrScissorState* scissorState, |
895 const SkRect* devBounds) SK_OVERRIDE; | 863 const SkRect* devBounds) SK_OVERRIDE; |
896 | 864 |
897 typedef GrDrawTarget INHERITED; | 865 typedef GrDrawTarget INHERITED; |
898 }; | 866 }; |
899 | 867 |
900 #endif | 868 #endif |
OLD | NEW |