Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: src/gpu/GrTargetCommands.cpp

Issue 1040303002: Use texture barriers to read directly from the RT (Closed) Base URL: https://skia.googlesource.com/skia.git@upload_zz1_reverseiter
Patch Set: Add Xfer barriers with glTextureBarrier instead of dst copies Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 } 395 }
396 396
397 void GrTargetCommands::ClearStencilClip::execute(GrGpu* gpu, const SetState*) { 397 void GrTargetCommands::ClearStencilClip::execute(GrGpu* gpu, const SetState*) {
398 gpu->clearStencilClip(fRect, fInsideClip, this->renderTarget()); 398 gpu->clearStencilClip(fRect, fInsideClip, this->renderTarget());
399 } 399 }
400 400
401 void GrTargetCommands::CopySurface::execute(GrGpu* gpu, const SetState*) { 401 void GrTargetCommands::CopySurface::execute(GrGpu* gpu, const SetState*) {
402 gpu->copySurface(this->dst(), this->src(), fSrcRect, fDstPoint); 402 gpu->copySurface(this->dst(), this->src(), fSrcRect, fDstPoint);
403 } 403 }
404 404
405 void GrTargetCommands::XferBarrier::execute(GrGpu* gpu, const SetState* state) {
406 gpu->setXferBarrier(fBarrierType);
407 }
408
405 GrTargetCommands::Cmd* GrTargetCommands::recordCopySurface(GrInOrderDrawBuffer* iodb, 409 GrTargetCommands::Cmd* GrTargetCommands::recordCopySurface(GrInOrderDrawBuffer* iodb,
406 GrSurface* dst, 410 GrSurface* dst,
407 GrSurface* src, 411 GrSurface* src,
408 const SkIRect& srcRec t, 412 const SkIRect& srcRec t,
409 const SkIPoint& dstPo int) { 413 const SkIPoint& dstPo int) {
410 if (iodb->getGpu()->canCopySurface(dst, src, srcRect, dstPoint)) { 414 if (iodb->getGpu()->canCopySurface(dst, src, srcRect, dstPoint)) {
411 this->closeBatch(); 415 this->closeBatch();
412 CopySurface* cs = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, CopySurface, (dst , src)); 416 CopySurface* cs = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, CopySurface, (dst , src));
413 cs->fSrcRect = srcRect; 417 cs->fSrcRect = srcRect;
414 cs->fDstPoint = dstPoint; 418 cs->fDstPoint = dstPoint;
(...skipping 19 matching lines...) Expand all
434 if (fPrevState && fPrevState->fPrimitiveProcessor.get() && 438 if (fPrevState && fPrevState->fPrimitiveProcessor.get() &&
435 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, 439 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker,
436 *ss->fPrimitiveProcessor, 440 *ss->fPrimitiveProcessor,
437 ss->fBatchTracker) && 441 ss->fBatchTracker) &&
438 fPrevState->getPipeline()->isEqual(*ss->getPipeline())) { 442 fPrevState->getPipeline()->isEqual(*ss->getPipeline())) {
439 fCmdBuffer.pop_back(); 443 fCmdBuffer.pop_back();
440 } else { 444 } else {
441 fPrevState = ss; 445 fPrevState = ss;
442 iodb->recordTraceMarkersIfNecessary(ss); 446 iodb->recordTraceMarkersIfNecessary(ss);
443 } 447 }
448
449 this->recordXferBarrierIfNecessary(iodb, pipelineInfo);
444 return true; 450 return true;
445 } 451 }
446 452
447 bool GrTargetCommands::setupPipelineAndShouldDraw(GrInOrderDrawBuffer* iodb, 453 bool GrTargetCommands::setupPipelineAndShouldDraw(GrInOrderDrawBuffer* iodb,
448 GrBatch* batch, 454 GrBatch* batch,
449 const GrDrawTarget::PipelineIn fo& pipelineInfo) { 455 const GrDrawTarget::PipelineIn fo& pipelineInfo) {
450 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, ()); 456 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, ());
451 iodb->setupPipeline(pipelineInfo, ss->pipelineLocation()); 457 iodb->setupPipeline(pipelineInfo, ss->pipelineLocation());
452 458
453 if (ss->getPipeline()->mustSkip()) { 459 if (ss->getPipeline()->mustSkip()) {
454 fCmdBuffer.pop_back(); 460 fCmdBuffer.pop_back();
455 return false; 461 return false;
456 } 462 }
457 463
458 batch->initBatchTracker(ss->getPipeline()->getInitBatchTracker()); 464 batch->initBatchTracker(ss->getPipeline()->getInitBatchTracker());
459 465
460 if (fPrevState && !fPrevState->fPrimitiveProcessor.get() && 466 if (fPrevState && !fPrevState->fPrimitiveProcessor.get() &&
461 fPrevState->getPipeline()->isEqual(*ss->getPipeline())) { 467 fPrevState->getPipeline()->isEqual(*ss->getPipeline())) {
462 fCmdBuffer.pop_back(); 468 fCmdBuffer.pop_back();
463 } else { 469 } else {
464 this->closeBatch(); 470 this->closeBatch();
465 fPrevState = ss; 471 fPrevState = ss;
466 iodb->recordTraceMarkersIfNecessary(ss); 472 iodb->recordTraceMarkersIfNecessary(ss);
467 } 473 }
474
475 this->recordXferBarrierIfNecessary(iodb, pipelineInfo);
468 return true; 476 return true;
469 } 477 }
470 478
479 void GrTargetCommands::recordXferBarrierIfNecessary(GrInOrderDrawBuffer* iodb,
480 const GrDrawTarget::Pipeline Info& info) {
481 SkASSERT(fPrevState);
482 const GrXferProcessor& xp = *fPrevState->getXferProcessor();
483 GrRenderTarget* rt = fPrevState->getRenderTarget();
484
485 GrXferBarrierType barrierType;
486 if (!xp.willNeedXferBarrier(rt, *iodb->caps(), &barrierType)) {
487 return;
488 }
489
490 this->closeBatch();
491
492 XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, XferBarrier, ());
493 xb->fBarrierType = barrierType;
494
495 iodb->recordTraceMarkersIfNecessary(xb);
496 }
497
OLDNEW
« no previous file with comments | « src/gpu/GrTargetCommands.h ('k') | src/gpu/GrTest.cpp » ('j') | src/gpu/gl/GrGLGpu.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698