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 #include "GrTargetCommands.h" | 8 #include "GrTargetCommands.h" |
9 | 9 |
10 #include "GrColor.h" | 10 #include "GrColor.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 GrTargetCommands::Cmd* GrTargetCommands::recordDrawBatch( | 29 GrTargetCommands::Cmd* GrTargetCommands::recordDrawBatch( |
30 GrInOrderDrawBuffer* iodb, | 30 GrInOrderDrawBuffer* iodb, |
31 GrBatch* batch, | 31 GrBatch* batch, |
32 const GrDrawTarget::PipelineIn
fo& pipelineInfo) { | 32 const GrDrawTarget::PipelineIn
fo& pipelineInfo) { |
33 if (!this->setupPipelineAndShouldDraw(iodb, batch, pipelineInfo)) { | 33 if (!this->setupPipelineAndShouldDraw(iodb, batch, pipelineInfo)) { |
34 return NULL; | 34 return NULL; |
35 } | 35 } |
36 | 36 |
37 // Check if there is a Batch Draw we can batch with | 37 // Check if there is a Batch Draw we can batch with |
38 if (Cmd::kDrawBatch_CmdType != fCmdBuffer.back().type() || !fDrawBatch) { | 38 if (Cmd::kDrawBatch_CmdType == fCmdBuffer.back().type()) { |
39 fDrawBatch = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch, &fB
atchTarget)); | 39 DrawBatch* previous = static_cast<DrawBatch*>(&fCmdBuffer.back()); |
40 return fDrawBatch; | 40 if (previous->fBatch->combineIfPossible(batch)) { |
| 41 return NULL; |
| 42 } |
41 } | 43 } |
42 | 44 |
43 SkASSERT(&fCmdBuffer.back() == fDrawBatch); | 45 return GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch, &fBatchTarget
)); |
44 if (!fDrawBatch->fBatch->combineIfPossible(batch)) { | |
45 fDrawBatch = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch, &fB
atchTarget)); | |
46 } | |
47 | |
48 return fDrawBatch; | |
49 } | 46 } |
50 | 47 |
51 GrTargetCommands::Cmd* GrTargetCommands::recordStencilPath( | 48 GrTargetCommands::Cmd* GrTargetCommands::recordStencilPath( |
52 GrInOrderDrawBuffer* iod
b, | 49 GrInOrderDrawBuffer* iod
b, |
53 const GrPipelineBuilder&
pipelineBuilder, | 50 const GrPipelineBuilder&
pipelineBuilder, |
54 const GrPathProcessor* p
athProc, | 51 const GrPathProcessor* p
athProc, |
55 const GrPath* path, | 52 const GrPath* path, |
56 const GrScissorState& sc
issorState, | 53 const GrScissorState& sc
issorState, |
57 const GrStencilSettings&
stencilSettings) { | 54 const GrStencilSettings&
stencilSettings) { |
58 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, | 55 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 SkASSERT(renderTarget); | 180 SkASSERT(renderTarget); |
184 | 181 |
185 Clear* clr = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Clear, (renderTarget)); | 182 Clear* clr = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Clear, (renderTarget)); |
186 clr->fColor = GrColor_ILLEGAL; | 183 clr->fColor = GrColor_ILLEGAL; |
187 return clr; | 184 return clr; |
188 } | 185 } |
189 | 186 |
190 void GrTargetCommands::reset() { | 187 void GrTargetCommands::reset() { |
191 fCmdBuffer.reset(); | 188 fCmdBuffer.reset(); |
192 fPrevState = NULL; | 189 fPrevState = NULL; |
193 fDrawBatch = NULL; | |
194 } | 190 } |
195 | 191 |
196 void GrTargetCommands::flush(GrInOrderDrawBuffer* iodb) { | 192 void GrTargetCommands::flush(GrInOrderDrawBuffer* iodb) { |
197 if (fCmdBuffer.empty()) { | 193 if (fCmdBuffer.empty()) { |
198 return; | 194 return; |
199 } | 195 } |
200 | 196 |
201 // Updated every time we find a set state cmd to reflect the current state i
n the playback | 197 // Updated every time we find a set state cmd to reflect the current state i
n the playback |
202 // stream. | 198 // stream. |
203 SetState* currentState = NULL; | 199 SetState* currentState = NULL; |
204 | 200 |
205 GrGpu* gpu = iodb->getGpu(); | 201 GrGpu* gpu = iodb->getGpu(); |
206 | 202 |
207 #ifdef USE_BITMAP_TEXTBLOBS | |
208 // Loop over all batches and generate geometry | 203 // Loop over all batches and generate geometry |
209 CmdBuffer::Iter genIter(fCmdBuffer); | 204 CmdBuffer::Iter genIter(fCmdBuffer); |
210 while (genIter.next()) { | 205 while (genIter.next()) { |
211 if (Cmd::kDrawBatch_CmdType == genIter->type()) { | 206 if (Cmd::kDrawBatch_CmdType == genIter->type()) { |
212 DrawBatch* db = reinterpret_cast<DrawBatch*>(genIter.get()); | 207 DrawBatch* db = reinterpret_cast<DrawBatch*>(genIter.get()); |
213 fBatchTarget.resetNumberOfDraws(); | 208 fBatchTarget.resetNumberOfDraws(); |
214 db->execute(NULL, currentState); | 209 db->execute(NULL, currentState); |
215 db->fBatch->setNumberOfDraws(fBatchTarget.numberOfDraws()); | 210 db->fBatch->setNumberOfDraws(fBatchTarget.numberOfDraws()); |
216 } else if (Cmd::kSetState_CmdType == genIter->type()) { | 211 } else if (Cmd::kSetState_CmdType == genIter->type()) { |
217 SetState* ss = reinterpret_cast<SetState*>(genIter.get()); | 212 SetState* ss = reinterpret_cast<SetState*>(genIter.get()); |
218 | 213 |
219 ss->execute(gpu, currentState); | 214 ss->execute(gpu, currentState); |
220 currentState = ss; | 215 currentState = ss; |
221 } | 216 } |
222 } | 217 } |
223 #endif | |
224 | 218 |
225 iodb->getVertexAllocPool()->unmap(); | 219 iodb->getVertexAllocPool()->unmap(); |
226 iodb->getIndexAllocPool()->unmap(); | 220 iodb->getIndexAllocPool()->unmap(); |
227 fBatchTarget.preFlush(); | 221 fBatchTarget.preFlush(); |
228 | 222 |
229 CmdBuffer::Iter iter(fCmdBuffer); | 223 CmdBuffer::Iter iter(fCmdBuffer); |
230 | 224 |
231 while (iter.next()) { | 225 while (iter.next()) { |
232 GrGpuTraceMarker newMarker("", -1); | 226 GrGpuTraceMarker newMarker("", -1); |
233 SkString traceString; | 227 SkString traceString; |
234 if (iter->isTraced()) { | 228 if (iter->isTraced()) { |
235 traceString = iodb->getCmdString(iter->markerID()); | 229 traceString = iodb->getCmdString(iter->markerID()); |
236 newMarker.fMarker = traceString.c_str(); | 230 newMarker.fMarker = traceString.c_str(); |
237 gpu->addGpuTraceMarker(&newMarker); | 231 gpu->addGpuTraceMarker(&newMarker); |
238 } | 232 } |
239 | 233 |
240 // TODO temporary hack | |
241 if (Cmd::kDrawBatch_CmdType == iter->type()) { | 234 if (Cmd::kDrawBatch_CmdType == iter->type()) { |
242 DrawBatch* db = reinterpret_cast<DrawBatch*>(iter.get()); | 235 DrawBatch* db = reinterpret_cast<DrawBatch*>(iter.get()); |
243 fBatchTarget.flushNext(db->fBatch->numberOfDraws()); | 236 fBatchTarget.flushNext(db->fBatch->numberOfDraws()); |
244 | 237 |
245 if (iter->isTraced()) { | 238 if (iter->isTraced()) { |
246 gpu->removeGpuTraceMarker(&newMarker); | 239 gpu->removeGpuTraceMarker(&newMarker); |
247 } | 240 } |
248 continue; | 241 continue; |
249 } | 242 } |
250 | 243 |
251 if (Cmd::kSetState_CmdType == iter->type()) { | 244 if (Cmd::kSetState_CmdType == iter->type()) { |
252 #ifndef USE_BITMAP_TEXTBLOBS | |
253 SetState* ss = reinterpret_cast<SetState*>(iter.get()); | |
254 | |
255 ss->execute(gpu, currentState); | |
256 currentState = ss; | |
257 #else | |
258 // TODO this is just until NVPR is in batch | 245 // TODO this is just until NVPR is in batch |
259 SetState* ss = reinterpret_cast<SetState*>(iter.get()); | 246 SetState* ss = reinterpret_cast<SetState*>(iter.get()); |
260 | 247 |
261 if (ss->fPrimitiveProcessor) { | 248 if (ss->fPrimitiveProcessor) { |
262 ss->execute(gpu, currentState); | 249 ss->execute(gpu, currentState); |
263 } | 250 } |
264 currentState = ss; | 251 currentState = ss; |
265 #endif | |
266 | 252 |
267 } else { | 253 } else { |
268 iter->execute(gpu, currentState); | 254 iter->execute(gpu, currentState); |
269 } | 255 } |
270 | 256 |
271 if (iter->isTraced()) { | 257 if (iter->isTraced()) { |
272 gpu->removeGpuTraceMarker(&newMarker); | 258 gpu->removeGpuTraceMarker(&newMarker); |
273 } | 259 } |
274 } | 260 } |
275 | 261 |
276 // TODO see copious notes about hack | |
277 fBatchTarget.postFlush(); | 262 fBatchTarget.postFlush(); |
278 } | 263 } |
279 | 264 |
280 void GrTargetCommands::Draw::execute(GrGpu* gpu, const SetState* state) { | |
281 SkASSERT(state); | |
282 DrawArgs args(state->fPrimitiveProcessor.get(), state->getPipeline(), &state
->fDesc, | |
283 &state->fBatchTracker); | |
284 gpu->draw(args, fInfo); | |
285 } | |
286 | |
287 void GrTargetCommands::StencilPath::execute(GrGpu* gpu, const SetState*) { | 265 void GrTargetCommands::StencilPath::execute(GrGpu* gpu, const SetState*) { |
288 GrGpu::StencilPathState state; | 266 GrGpu::StencilPathState state; |
289 state.fRenderTarget = fRenderTarget.get(); | 267 state.fRenderTarget = fRenderTarget.get(); |
290 state.fScissor = &fScissor; | 268 state.fScissor = &fScissor; |
291 state.fStencil = &fStencil; | 269 state.fStencil = &fStencil; |
292 state.fUseHWAA = fUseHWAA; | 270 state.fUseHWAA = fUseHWAA; |
293 state.fViewMatrix = &fViewMatrix; | 271 state.fViewMatrix = &fViewMatrix; |
294 | 272 |
295 gpu->stencilPath(this->path(), state); | 273 gpu->stencilPath(this->path(), state); |
296 } | 274 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 if (!xp.willNeedXferBarrier(rt, *iodb->caps(), &barrierType)) { | 397 if (!xp.willNeedXferBarrier(rt, *iodb->caps(), &barrierType)) { |
420 return; | 398 return; |
421 } | 399 } |
422 | 400 |
423 XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, XferBarrier, ()); | 401 XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, XferBarrier, ()); |
424 xb->fBarrierType = barrierType; | 402 xb->fBarrierType = barrierType; |
425 | 403 |
426 iodb->recordTraceMarkersIfNecessary(xb); | 404 iodb->recordTraceMarkersIfNecessary(xb); |
427 } | 405 } |
428 | 406 |
OLD | NEW |