| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2015 Google Inc. | 2  * Copyright 2015 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 GrTargetCommands_DEFINED | 8 #ifndef GrTargetCommands_DEFINED | 
| 9 #define GrTargetCommands_DEFINED | 9 #define GrTargetCommands_DEFINED | 
| 10 | 10 | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 23 class GrBatchFlushState; | 23 class GrBatchFlushState; | 
| 24 | 24 | 
| 25 // TODO: Convert all commands into GrBatch and remove this class. | 25 // TODO: Convert all commands into GrBatch and remove this class. | 
| 26 class GrTargetCommands : ::SkNoncopyable { | 26 class GrTargetCommands : ::SkNoncopyable { | 
| 27 public: | 27 public: | 
| 28     GrTargetCommands() : fCmdBuffer(kCmdBufferInitialSizeInBytes), fLastFlushTok
     en(0) {} | 28     GrTargetCommands() : fCmdBuffer(kCmdBufferInitialSizeInBytes), fLastFlushTok
     en(0) {} | 
| 29 | 29 | 
| 30     class Cmd : ::SkNoncopyable { | 30     class Cmd : ::SkNoncopyable { | 
| 31     public: | 31     public: | 
| 32         enum CmdType { | 32         enum CmdType { | 
| 33             kDrawPath_CmdType          = 2, |  | 
| 34             kDrawPaths_CmdType         = 3, |  | 
| 35             kDrawBatch_CmdType         = 4, | 33             kDrawBatch_CmdType         = 4, | 
| 36         }; | 34         }; | 
| 37 | 35 | 
| 38         Cmd(CmdType type) | 36         Cmd(CmdType type) | 
| 39             : fType(type) | 37             : fType(type) | 
| 40 #if GR_BATCH_SPEW | 38 #if GR_BATCH_SPEW | 
| 41             , fUniqueID(GenID(&gUniqueID)) | 39             , fUniqueID(GenID(&gUniqueID)) | 
| 42 #endif | 40 #endif | 
| 43         {} | 41         {} | 
| 44         virtual ~Cmd() {} | 42         virtual ~Cmd() {} | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 66     void reset(); | 64     void reset(); | 
| 67     void flush(GrGpu*, GrResourceProvider*); | 65     void flush(GrGpu*, GrResourceProvider*); | 
| 68 | 66 | 
| 69 private: | 67 private: | 
| 70     friend class GrCommandBuilder; | 68     friend class GrCommandBuilder; | 
| 71     friend class GrBufferedDrawTarget; // This goes away when State becomes just
      a pipeline | 69     friend class GrBufferedDrawTarget; // This goes away when State becomes just
      a pipeline | 
| 72     friend class GrReorderCommandBuilder; | 70     friend class GrReorderCommandBuilder; | 
| 73 | 71 | 
| 74     typedef GrGpu::DrawArgs DrawArgs; | 72     typedef GrGpu::DrawArgs DrawArgs; | 
| 75 | 73 | 
| 76     // TODO: This can be just a pipeline once paths are in batch, and it should 
     live elsewhere |  | 
| 77     struct StateForPathDraw : public SkNVRefCnt<StateForPathDraw> { |  | 
| 78         // TODO get rid of the prim proc parameter when we use batch everywhere |  | 
| 79         StateForPathDraw(const GrPrimitiveProcessor* primProc = nullptr) |  | 
| 80             : fPrimitiveProcessor(primProc) |  | 
| 81             , fCompiled(false) {} |  | 
| 82 |  | 
| 83         ~StateForPathDraw() { reinterpret_cast<GrPipeline*>(fPipeline.get())->~G
     rPipeline(); } |  | 
| 84 |  | 
| 85         // This function is only for getting the location in memory where we wil
     l create our |  | 
| 86         // pipeline object. |  | 
| 87         void* pipelineLocation() { return fPipeline.get(); } |  | 
| 88 |  | 
| 89         const GrPipeline* getPipeline() const { |  | 
| 90             return reinterpret_cast<const GrPipeline*>(fPipeline.get()); |  | 
| 91         } |  | 
| 92         GrRenderTarget* getRenderTarget() const { |  | 
| 93             return this->getPipeline()->getRenderTarget(); |  | 
| 94         } |  | 
| 95         const GrXferProcessor* getXferProcessor() const { |  | 
| 96             return this->getPipeline()->getXferProcessor(); |  | 
| 97         } |  | 
| 98 |  | 
| 99         void operator delete(void* p) {} |  | 
| 100         void* operator new(size_t) { |  | 
| 101             SkFAIL("All States are created by placement new."); |  | 
| 102             return sk_malloc_throw(0); |  | 
| 103         } |  | 
| 104 |  | 
| 105         void* operator new(size_t, void* p) { return p; } |  | 
| 106         void operator delete(void* target, void* placement) { |  | 
| 107             ::operator delete(target, placement); |  | 
| 108         } |  | 
| 109 |  | 
| 110         typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimi
     tiveProcessor; |  | 
| 111         ProgramPrimitiveProcessor               fPrimitiveProcessor; |  | 
| 112         SkAlignedSStorage<sizeof(GrPipeline)>   fPipeline; |  | 
| 113         GrProgramDesc                           fDesc; |  | 
| 114         GrBatchTracker                          fBatchTracker; |  | 
| 115         bool                                    fCompiled; |  | 
| 116     }; |  | 
| 117     // TODO remove this when State is just a pipeline |  | 
| 118     friend SkNVRefCnt<StateForPathDraw>; |  | 
| 119 |  | 
| 120     struct DrawPath : public Cmd { |  | 
| 121         DrawPath(StateForPathDraw* state, const GrPath* path) |  | 
| 122             : Cmd(kDrawPath_CmdType) |  | 
| 123             , fState(SkRef(state)) |  | 
| 124             , fPath(path) {} |  | 
| 125 |  | 
| 126         const GrPath* path() const { return fPath.get(); } |  | 
| 127 |  | 
| 128         void execute(GrBatchFlushState*) override; |  | 
| 129 |  | 
| 130         SkAutoTUnref<StateForPathDraw>  fState; |  | 
| 131         GrStencilSettings               fStencilSettings; |  | 
| 132     private: |  | 
| 133         GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; |  | 
| 134     }; |  | 
| 135 |  | 
| 136     struct DrawPaths : public Cmd { |  | 
| 137         DrawPaths(StateForPathDraw* state, const GrPathRange* pathRange) |  | 
| 138             : Cmd(kDrawPaths_CmdType) |  | 
| 139             , fState(SkRef(state)) |  | 
| 140             , fPathRange(pathRange) {} |  | 
| 141 |  | 
| 142         const GrPathRange* pathRange() const { return fPathRange.get();  } |  | 
| 143 |  | 
| 144         void execute(GrBatchFlushState*) override; |  | 
| 145 |  | 
| 146         SkAutoTUnref<StateForPathDraw>  fState; |  | 
| 147         char*                           fIndices; |  | 
| 148         GrDrawTarget::PathIndexType     fIndexType; |  | 
| 149         float*                          fTransforms; |  | 
| 150         GrDrawTarget::PathTransformType fTransformType; |  | 
| 151         int                             fCount; |  | 
| 152         GrStencilSettings               fStencilSettings; |  | 
| 153 |  | 
| 154     private: |  | 
| 155         GrPendingIOResource<const GrPathRange, kRead_GrIOType> fPathRange; |  | 
| 156     }; |  | 
| 157 |  | 
| 158     struct DrawBatch : public Cmd { | 74     struct DrawBatch : public Cmd { | 
| 159         DrawBatch(GrBatch* batch) | 75         DrawBatch(GrBatch* batch) | 
| 160             : Cmd(kDrawBatch_CmdType) | 76             : Cmd(kDrawBatch_CmdType) | 
| 161             , fBatch(SkRef(batch)){ | 77             , fBatch(SkRef(batch)){ | 
| 162             SkASSERT(!batch->isUsed()); | 78             SkASSERT(!batch->isUsed()); | 
| 163         } | 79         } | 
| 164 | 80 | 
| 165         GrBatch* batch() { return fBatch; } | 81         GrBatch* batch() { return fBatch; } | 
| 166         void execute(GrBatchFlushState*) override; | 82         void execute(GrBatchFlushState*) override; | 
| 167 | 83 | 
| 168     private: | 84     private: | 
| 169         SkAutoTUnref<GrBatch>   fBatch; | 85         SkAutoTUnref<GrBatch>   fBatch; | 
| 170     }; | 86     }; | 
| 171 | 87 | 
| 172     static const int kCmdBufferInitialSizeInBytes = 8 * 1024; | 88     static const int kCmdBufferInitialSizeInBytes = 8 * 1024; | 
| 173 | 89 | 
| 174     typedef void* TCmdAlign; // This wouldn't be enough align if a command used 
     long double. | 90     typedef void* TCmdAlign; // This wouldn't be enough align if a command used 
     long double. | 
| 175     typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; | 91     typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; | 
| 176 | 92 | 
| 177     CmdBuffer* cmdBuffer() { return &fCmdBuffer; } | 93     CmdBuffer* cmdBuffer() { return &fCmdBuffer; } | 
| 178 | 94 | 
| 179     CmdBuffer                           fCmdBuffer; | 95     CmdBuffer                           fCmdBuffer; | 
| 180     GrBatchToken                        fLastFlushToken; | 96     GrBatchToken                        fLastFlushToken; | 
| 181 }; | 97 }; | 
| 182 | 98 | 
| 183 #endif | 99 #endif | 
| OLD | NEW | 
|---|