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 |