| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 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 "GrDrawTarget.h" | 8 #include "GrDrawTarget.h" |
| 9 | 9 |
| 10 #include "GrAuditTrail.h" | 10 #include "GrAuditTrail.h" |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 if (fInstancedRendering) { | 208 if (fInstancedRendering) { |
| 209 fInstancedRendering->beginFlush(flushState->resourceProvider()); | 209 fInstancedRendering->beginFlush(flushState->resourceProvider()); |
| 210 } | 210 } |
| 211 } | 211 } |
| 212 | 212 |
| 213 void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) { | 213 void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) { |
| 214 // Draw all the generated geometry. | 214 // Draw all the generated geometry. |
| 215 SkRandom random; | 215 SkRandom random; |
| 216 GrRenderTarget* currentRT = nullptr; | 216 GrRenderTarget* currentRT = nullptr; |
| 217 SkAutoTDelete<GrGpuCommandBuffer> commandBuffer; | 217 SkAutoTDelete<GrGpuCommandBuffer> commandBuffer; |
| 218 SkRect bounds = SkRect::MakeEmpty(); |
| 218 for (int i = 0; i < fBatches.count(); ++i) { | 219 for (int i = 0; i < fBatches.count(); ++i) { |
| 219 if (!fBatches[i]) { | 220 if (!fBatches[i]) { |
| 220 continue; | 221 continue; |
| 221 } | 222 } |
| 222 if (fBatches[i]->renderTarget() != currentRT) { | 223 if (fBatches[i]->renderTarget() != currentRT) { |
| 223 if (commandBuffer) { | 224 if (commandBuffer) { |
| 224 commandBuffer->end(); | 225 commandBuffer->end(); |
| 225 // For now just use size of whole render target, but this should
be updated to | 226 if (bounds.intersect(0, 0, |
| 226 // only be the actual bounds of the various draws. | 227 SkIntToScalar(currentRT->width()), |
| 227 SkIRect bounds = SkIRect::MakeWH(currentRT->width(), currentRT->
height()); | 228 SkIntToScalar(currentRT->height()))) { |
| 228 commandBuffer->submit(bounds); | 229 SkIRect iBounds; |
| 230 bounds.roundOut(&iBounds); |
| 231 commandBuffer->submit(iBounds); |
| 232 } |
| 229 commandBuffer.reset(); | 233 commandBuffer.reset(); |
| 230 } | 234 } |
| 235 bounds.setEmpty(); |
| 231 currentRT = fBatches[i]->renderTarget(); | 236 currentRT = fBatches[i]->renderTarget(); |
| 232 if (currentRT) { | 237 if (currentRT) { |
| 233 static const GrGpuCommandBuffer::LoadAndStoreInfo kBasicLoadStor
eInfo | 238 static const GrGpuCommandBuffer::LoadAndStoreInfo kBasicLoadStor
eInfo |
| 234 { GrGpuCommandBuffer::LoadOp::kLoad,GrGpuCommandBuffer::Stor
eOp::kStore, | 239 { GrGpuCommandBuffer::LoadOp::kLoad,GrGpuCommandBuffer::Stor
eOp::kStore, |
| 235 GrColor_ILLEGAL }; | 240 GrColor_ILLEGAL }; |
| 236 commandBuffer.reset(fGpu->createCommandBuffer(currentRT, | 241 commandBuffer.reset(fGpu->createCommandBuffer(currentRT, |
| 237 kBasicLoadStoreInf
o, // Color | 242 kBasicLoadStoreInf
o, // Color |
| 238 kBasicLoadStoreInf
o)); // Stencil | 243 kBasicLoadStoreInf
o)); // Stencil |
| 239 } | 244 } |
| 240 flushState->setCommandBuffer(commandBuffer); | 245 flushState->setCommandBuffer(commandBuffer); |
| 241 } | 246 } |
| 247 if (commandBuffer) { |
| 248 bounds.join(fBatches[i]->bounds()); |
| 249 } |
| 242 if (fDrawBatchBounds) { | 250 if (fDrawBatchBounds) { |
| 243 const SkRect& bounds = fBatches[i]->bounds(); | 251 const SkRect& batchBounds = fBatches[i]->bounds(); |
| 244 SkIRect ibounds; | 252 SkIRect iBatchBounds; |
| 245 bounds.roundOut(&ibounds); | 253 batchBounds.roundOut(&iBatchBounds); |
| 246 // In multi-draw buffer all the batches use the same render target a
nd we won't need to | 254 // In multi-draw buffer all the batches use the same render target a
nd we won't need to |
| 247 // get the batchs bounds. | 255 // get the batchs bounds. |
| 248 if (GrRenderTarget* rt = fBatches[i]->renderTarget()) { | 256 if (GrRenderTarget* rt = fBatches[i]->renderTarget()) { |
| 249 fGpu->drawDebugWireRect(rt, ibounds, 0xFF000000 | random.nextU()
); | 257 fGpu->drawDebugWireRect(rt, iBatchBounds, 0xFF000000 | random.ne
xtU()); |
| 250 } | 258 } |
| 251 } | 259 } |
| 252 fBatches[i]->draw(flushState); | 260 fBatches[i]->draw(flushState); |
| 253 } | 261 } |
| 254 if (commandBuffer) { | 262 if (commandBuffer) { |
| 255 commandBuffer->end(); | 263 commandBuffer->end(); |
| 256 // For now just use size of whole render target, but this should be upda
ted to | 264 if (bounds.intersect(0, 0, |
| 257 // only be the actual bounds of the various draws. | 265 SkIntToScalar(currentRT->width()), |
| 258 SkIRect bounds = SkIRect::MakeWH(currentRT->width(), currentRT->height()
); | 266 SkIntToScalar(currentRT->height()))) { |
| 259 commandBuffer->submit(bounds); | 267 SkIRect iBounds; |
| 268 bounds.roundOut(&iBounds); |
| 269 commandBuffer->submit(iBounds); |
| 270 } |
| 260 flushState->setCommandBuffer(nullptr); | 271 flushState->setCommandBuffer(nullptr); |
| 261 } | 272 } |
| 262 | 273 |
| 263 fGpu->finishDrawTarget(); | 274 fGpu->finishDrawTarget(); |
| 264 } | 275 } |
| 265 | 276 |
| 266 void GrDrawTarget::reset() { | 277 void GrDrawTarget::reset() { |
| 267 fBatches.reset(); | 278 fBatches.reset(); |
| 268 if (fInstancedRendering) { | 279 if (fInstancedRendering) { |
| 269 fInstancedRendering->endFlush(); | 280 fInstancedRendering->endFlush(); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 } | 572 } |
| 562 } | 573 } |
| 563 | 574 |
| 564 /////////////////////////////////////////////////////////////////////////////// | 575 /////////////////////////////////////////////////////////////////////////////// |
| 565 | 576 |
| 566 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend
erTarget* rt) { | 577 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend
erTarget* rt) { |
| 567 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); | 578 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); |
| 568 this->recordBatch(batch); | 579 this->recordBatch(batch); |
| 569 batch->unref(); | 580 batch->unref(); |
| 570 } | 581 } |
| OLD | NEW |