1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "GrReorderCommandBuilder.h"
9 
intersect(const SkRect & a,const SkRect & b)10 static bool intersect(const SkRect& a, const SkRect& b) {
11     SkASSERT(a.fLeft <= a.fRight && a.fTop <= a.fBottom &&
12              b.fLeft <= b.fRight && b.fTop <= b.fBottom);
13     return a.fLeft < b.fRight && b.fLeft < a.fRight &&
14            a.fTop < b.fBottom && b.fTop < a.fBottom;
15 }
16 
recordDrawBatch(State * state,GrBatch * batch)17 GrTargetCommands::Cmd* GrReorderCommandBuilder::recordDrawBatch(State* state, GrBatch* batch) {
18     // Check if there is a Batch Draw we can batch with by linearly searching back until we either
19     // 1) check every draw
20     // 2) intersect with something
21     // 3) find a 'blocker'
22     if (!this->cmdBuffer()->empty()) {
23         GrTargetCommands::CmdBuffer::ReverseIter reverseIter(*this->cmdBuffer());
24 
25         do {
26             if (Cmd::kDrawBatch_CmdType == reverseIter->type()) {
27                 DrawBatch* previous = static_cast<DrawBatch*>(reverseIter.get());
28 
29                 if (previous->fState->getPipeline()->isEqual(*state->getPipeline()) &&
30                     previous->fBatch->combineIfPossible(batch)) {
31                     return NULL;
32                 }
33 
34                 if (intersect(previous->fBatch->bounds(), batch->bounds())) {
35                     break;
36                 }
37             } else {
38                 // TODO temporary until we can navigate the other types of commands
39                 break;
40             }
41         } while (reverseIter.previous());
42     }
43 
44     return GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), DrawBatch, (state, batch,
45                                                                     this->batchTarget()));
46 }
47