| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2011 Google Inc. | 2  * Copyright 2011 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 GrInOrderDrawBuffer_DEFINED | 8 #ifndef GrInOrderDrawBuffer_DEFINED | 
| 9 #define GrInOrderDrawBuffer_DEFINED | 9 #define GrInOrderDrawBuffer_DEFINED | 
| 10 | 10 | 
| 11 #include "GrFlushToGpuDrawTarget.h" | 11 #include "GrFlushToGpuDrawTarget.h" | 
|  | 12 | 
|  | 13 #include "GrBatch.h" | 
|  | 14 #include "GrBatchTarget.h" | 
| 12 #include "GrPipeline.h" | 15 #include "GrPipeline.h" | 
| 13 #include "GrPath.h" | 16 #include "GrPath.h" | 
| 14 #include "GrTRecorder.h" | 17 #include "GrTRecorder.h" | 
| 15 | 18 | 
| 16 /** | 19 /** | 
| 17  * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws
      for eventual | 20  * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws
      for eventual | 
| 18  * playback into a GrGpu. In theory one draw buffer could playback into another.
      When index or | 21  * playback into a GrGpu. In theory one draw buffer could playback into another.
      When index or | 
| 19  * vertex buffers are used as geometry sources it is the callers the draw buffer
      only holds | 22  * vertex buffers are used as geometry sources it is the callers the draw buffer
      only holds | 
| 20  * references to the buffers. It is the callers responsibility to ensure that th
     e data is still | 23  * references to the buffers. It is the callers responsibility to ensure that th
     e data is still | 
| 21  * valid when the draw buffer is played back into a GrGpu. Similarly, it is the 
     caller's | 24  * valid when the draw buffer is played back into a GrGpu. Similarly, it is the 
     caller's | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 43 | 46 | 
| 44     // tracking for draws | 47     // tracking for draws | 
| 45     DrawToken getCurrentDrawToken() SK_OVERRIDE { return DrawToken(this, fDrawID
     ); } | 48     DrawToken getCurrentDrawToken() SK_OVERRIDE { return DrawToken(this, fDrawID
     ); } | 
| 46 | 49 | 
| 47     void clearStencilClip(const SkIRect& rect, | 50     void clearStencilClip(const SkIRect& rect, | 
| 48                           bool insideClip, | 51                           bool insideClip, | 
| 49                           GrRenderTarget* renderTarget) SK_OVERRIDE; | 52                           GrRenderTarget* renderTarget) SK_OVERRIDE; | 
| 50 | 53 | 
| 51     void discard(GrRenderTarget*) SK_OVERRIDE; | 54     void discard(GrRenderTarget*) SK_OVERRIDE; | 
| 52 | 55 | 
|  | 56     void willReserveVertexAndIndexSpace(int vertexCount, | 
|  | 57                                         size_t vertexStride, | 
|  | 58                                         int indexCount); | 
|  | 59 | 
| 53 private: | 60 private: | 
| 54     typedef GrGpu::DrawArgs DrawArgs; | 61     typedef GrGpu::DrawArgs DrawArgs; | 
| 55     enum { | 62     enum { | 
| 56         kDraw_Cmd           = 1, | 63         kDraw_Cmd              = 1, | 
| 57         kStencilPath_Cmd    = 2, | 64         kStencilPath_Cmd       = 2, | 
| 58         kSetState_Cmd       = 3, | 65         kSetState_Cmd          = 3, | 
| 59         kClear_Cmd          = 4, | 66         kClear_Cmd             = 4, | 
| 60         kCopySurface_Cmd    = 5, | 67         kCopySurface_Cmd       = 5, | 
| 61         kDrawPath_Cmd       = 6, | 68         kDrawPath_Cmd          = 6, | 
| 62         kDrawPaths_Cmd      = 7, | 69         kDrawPaths_Cmd         = 7, | 
|  | 70         kDrawBatch_Cmd         = 8, | 
| 63     }; | 71     }; | 
| 64 | 72 | 
| 65     struct SetState; | 73     struct SetState; | 
| 66 | 74 | 
| 67     struct Cmd : ::SkNoncopyable { | 75     struct Cmd : ::SkNoncopyable { | 
| 68         Cmd(uint8_t type) : fType(type) {} | 76         Cmd(uint8_t type) : fType(type) {} | 
| 69         virtual ~Cmd() {} | 77         virtual ~Cmd() {} | 
| 70 | 78 | 
| 71         virtual void execute(GrInOrderDrawBuffer*, const SetState*) = 0; | 79         virtual void execute(GrInOrderDrawBuffer*, const SetState*) = 0; | 
| 72 | 80 | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 173         SkIPoint    fDstPoint; | 181         SkIPoint    fDstPoint; | 
| 174         SkIRect     fSrcRect; | 182         SkIRect     fSrcRect; | 
| 175 | 183 | 
| 176     private: | 184     private: | 
| 177         GrPendingIOResource<GrSurface, kWrite_GrIOType> fDst; | 185         GrPendingIOResource<GrSurface, kWrite_GrIOType> fDst; | 
| 178         GrPendingIOResource<GrSurface, kRead_GrIOType> fSrc; | 186         GrPendingIOResource<GrSurface, kRead_GrIOType> fSrc; | 
| 179     }; | 187     }; | 
| 180 | 188 | 
| 181     // TODO: rename to SetPipeline once pp, batch tracker, and desc are removed | 189     // TODO: rename to SetPipeline once pp, batch tracker, and desc are removed | 
| 182     struct SetState : public Cmd { | 190     struct SetState : public Cmd { | 
|  | 191         // TODO get rid of the prim proc version of this when we use batch every
     where | 
| 183         SetState(const GrPipelineBuilder& pipelineBuilder, const GrPrimitiveProc
     essor* primProc, | 192         SetState(const GrPipelineBuilder& pipelineBuilder, const GrPrimitiveProc
     essor* primProc, | 
| 184                  const GrDrawTargetCaps& caps, | 193                  const GrDrawTargetCaps& caps, | 
| 185                  const GrScissorState& scissor, const GrDeviceCoordTexture* dstC
     opy) | 194                  const GrScissorState& scissor, const GrDeviceCoordTexture* dstC
     opy) | 
| 186         : Cmd(kSetState_Cmd) | 195         : Cmd(kSetState_Cmd) | 
| 187         , fPrimitiveProcessor(primProc) | 196         , fPrimitiveProcessor(primProc) | 
| 188         , fPipeline(pipelineBuilder, primProc, caps, scissor, dstCopy) {} | 197         , fPipeline(pipelineBuilder, primProc, caps, scissor, dstCopy) {} | 
| 189 | 198 | 
|  | 199         SetState(GrBatch* batch, | 
|  | 200                  const GrPipelineBuilder& pipelineBuilder, | 
|  | 201                  const GrDrawTargetCaps& caps, | 
|  | 202                  const GrScissorState& scissor, const GrDeviceCoordTexture* dstC
     opy) | 
|  | 203         : Cmd(kSetState_Cmd) | 
|  | 204         , fPipeline(batch, pipelineBuilder, caps, scissor, dstCopy) {} | 
|  | 205 | 
| 190         void execute(GrInOrderDrawBuffer*, const SetState*) SK_OVERRIDE; | 206         void execute(GrInOrderDrawBuffer*, const SetState*) SK_OVERRIDE; | 
| 191 | 207 | 
| 192         typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimi
     tiveProcessor; | 208         typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimi
     tiveProcessor; | 
| 193         ProgramPrimitiveProcessor   fPrimitiveProcessor; | 209         ProgramPrimitiveProcessor   fPrimitiveProcessor; | 
| 194         const GrPipeline            fPipeline; | 210         const GrPipeline            fPipeline; | 
| 195         GrProgramDesc               fDesc; | 211         GrProgramDesc               fDesc; | 
| 196         GrBatchTracker              fBatchTracker; | 212         GrBatchTracker              fBatchTracker; | 
| 197     }; | 213     }; | 
| 198 | 214 | 
|  | 215     struct DrawBatch : public Cmd { | 
|  | 216         DrawBatch(GrBatch* batch) : Cmd(kDrawBatch_Cmd), fBatch(SkRef(batch)) { | 
|  | 217             SkASSERT(!batch->isUsed()); | 
|  | 218         } | 
|  | 219 | 
|  | 220         void execute(GrInOrderDrawBuffer*, const SetState*) SK_OVERRIDE; | 
|  | 221 | 
|  | 222         // TODO it wouldn't be too hard to let batches allocate in the cmd buffe
     r | 
|  | 223         SkAutoTUnref<GrBatch>  fBatch; | 
|  | 224     }; | 
|  | 225 | 
| 199     typedef void* TCmdAlign; // This wouldn't be enough align if a command used 
     long double. | 226     typedef void* TCmdAlign; // This wouldn't be enough align if a command used 
     long double. | 
| 200     typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; | 227     typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; | 
| 201 | 228 | 
| 202     void onReset() SK_OVERRIDE; | 229     void onReset() SK_OVERRIDE; | 
| 203     void onFlush() SK_OVERRIDE; | 230     void onFlush() SK_OVERRIDE; | 
| 204 | 231 | 
| 205     // overrides from GrDrawTarget | 232     // overrides from GrDrawTarget | 
| 206     void onDraw(const GrPipelineBuilder&, | 233     void onDraw(const GrPipelineBuilder&, | 
| 207                 const GrGeometryProcessor*, | 234                 const GrGeometryProcessor*, | 
| 208                 const DrawInfo&, | 235                 const DrawInfo&, | 
| 209                 const GrScissorState&, | 236                 const GrScissorState&, | 
| 210                 const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; | 237                 const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; | 
|  | 238     void onDrawBatch(GrBatch*, | 
|  | 239                      const GrPipelineBuilder&, | 
|  | 240                      const GrScissorState&, | 
|  | 241                      const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; | 
| 211     void onDrawRect(GrPipelineBuilder*, | 242     void onDrawRect(GrPipelineBuilder*, | 
| 212                     GrColor, | 243                     GrColor, | 
| 213                     const SkMatrix& viewMatrix, | 244                     const SkMatrix& viewMatrix, | 
| 214                     const SkRect& rect, | 245                     const SkRect& rect, | 
| 215                     const SkRect* localRect, | 246                     const SkRect* localRect, | 
| 216                     const SkMatrix* localMatrix) SK_OVERRIDE; | 247                     const SkMatrix* localMatrix) SK_OVERRIDE; | 
| 217 | 248 | 
| 218     void onStencilPath(const GrPipelineBuilder&, | 249     void onStencilPath(const GrPipelineBuilder&, | 
| 219                        const GrPathProcessor*, | 250                        const GrPathProcessor*, | 
| 220                        const GrPath*, | 251                        const GrPath*, | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 246                        const SkIRect& srcRect, | 277                        const SkIRect& srcRect, | 
| 247                        const SkIPoint& dstPoint) SK_OVERRIDE; | 278                        const SkIPoint& dstPoint) SK_OVERRIDE; | 
| 248 | 279 | 
| 249     // Attempts to concat instances from info onto the previous draw. info must 
     represent an | 280     // Attempts to concat instances from info onto the previous draw. info must 
     represent an | 
| 250     // instanced draw. The caller must have already recorded a new draw state an
     d clip if necessary. | 281     // instanced draw. The caller must have already recorded a new draw state an
     d clip if necessary. | 
| 251     int concatInstancedDraw(const GrPipelineBuilder&, const DrawInfo&); | 282     int concatInstancedDraw(const GrPipelineBuilder&, const DrawInfo&); | 
| 252 | 283 | 
| 253     // Determines whether the current draw operation requires a new GrPipeline a
     nd if so | 284     // Determines whether the current draw operation requires a new GrPipeline a
     nd if so | 
| 254     // records it. If the draw can be skipped false is returned and no new GrPip
     eline is | 285     // records it. If the draw can be skipped false is returned and no new GrPip
     eline is | 
| 255     // recorded. | 286     // recorded. | 
|  | 287     // TODO delete the primproc variant when we have batches everywhere | 
| 256     bool SK_WARN_UNUSED_RESULT recordStateAndShouldDraw(const GrPipelineBuilder&
     , | 288     bool SK_WARN_UNUSED_RESULT recordStateAndShouldDraw(const GrPipelineBuilder&
     , | 
| 257                                                         const GrPrimitiveProcess
     or*, | 289                                                         const GrPrimitiveProcess
     or*, | 
| 258                                                         const GrScissorState&, | 290                                                         const GrScissorState&, | 
| 259                                                         const GrDeviceCoordTextu
     re*); | 291                                                         const GrDeviceCoordTextu
     re*); | 
|  | 292     bool SK_WARN_UNUSED_RESULT recordStateAndShouldDraw(GrBatch*, | 
|  | 293                                                         const GrPipelineBuilder&
     , | 
|  | 294                                                         const GrScissorState&, | 
|  | 295                                                         const GrDeviceCoordTextu
     re*); | 
|  | 296 | 
| 260     // We lazily record clip changes in order to skip clips that have no effect. | 297     // We lazily record clip changes in order to skip clips that have no effect. | 
| 261     void recordClipIfNecessary(); | 298     void recordClipIfNecessary(); | 
| 262     // Records any trace markers for a command after adding it to the buffer. | 299     // Records any trace markers for a command after adding it to the buffer. | 
| 263     void recordTraceMarkersIfNecessary(); | 300     void recordTraceMarkersIfNecessary(); | 
| 264 | 301 | 
| 265     bool isIssued(uint32_t drawID) SK_OVERRIDE { return drawID != fDrawID; } | 302     bool isIssued(uint32_t drawID) SK_OVERRIDE { return drawID != fDrawID; } | 
| 266 | 303 | 
|  | 304     GrBatchTarget* getBatchTarget() { return &fBatchTarget; } | 
|  | 305 | 
| 267     // TODO: Use a single allocator for commands and records | 306     // TODO: Use a single allocator for commands and records | 
| 268     enum { | 307     enum { | 
| 269         kCmdBufferInitialSizeInBytes = 8 * 1024, | 308         kCmdBufferInitialSizeInBytes = 8 * 1024, | 
| 270         kPathIdxBufferMinReserve     = 2 * 64,  // 64 uint16_t's | 309         kPathIdxBufferMinReserve     = 2 * 64,  // 64 uint16_t's | 
| 271         kPathXformBufferMinReserve   = 2 * 64,  // 64 two-float transforms | 310         kPathXformBufferMinReserve   = 2 * 64,  // 64 two-float transforms | 
| 272     }; | 311     }; | 
| 273 | 312 | 
| 274     CmdBuffer                           fCmdBuffer; | 313     CmdBuffer                           fCmdBuffer; | 
| 275     SetState*                           fPrevState; | 314     SetState*                           fPrevState; | 
| 276     SkTArray<GrTraceMarkerSet, false>   fGpuCmdMarkers; | 315     SkTArray<GrTraceMarkerSet, false>   fGpuCmdMarkers; | 
| 277     SkTDArray<char>                     fPathIndexBuffer; | 316     SkTDArray<char>                     fPathIndexBuffer; | 
| 278     SkTDArray<float>                    fPathTransformBuffer; | 317     SkTDArray<float>                    fPathTransformBuffer; | 
| 279     uint32_t                            fDrawID; | 318     uint32_t                            fDrawID; | 
|  | 319     GrBatchTarget                       fBatchTarget; | 
|  | 320     // TODO hack until batch is everywhere | 
|  | 321     DrawBatch*                          fDrawBatch; | 
|  | 322 | 
|  | 323     void closeBatch(); | 
| 280 | 324 | 
| 281     typedef GrFlushToGpuDrawTarget INHERITED; | 325     typedef GrFlushToGpuDrawTarget INHERITED; | 
| 282 }; | 326 }; | 
| 283 | 327 | 
| 284 #endif | 328 #endif | 
| OLD | NEW | 
|---|