1e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt/* 2e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt * Copyright 2015 Google Inc. 3e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt * 4e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt * Use of this source code is governed by a BSD-style license that can be 5e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt * found in the LICENSE file. 6e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt */ 7e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 8e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt#include "GrCommandBuilder.h" 9e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 103b58d75170508567436cce259384d336949407d4joshualitt#include "GrInOrderCommandBuilder.h" 113b58d75170508567436cce259384d336949407d4joshualitt#include "GrReorderCommandBuilder.h" 123b58d75170508567436cce259384d336949407d4joshualitt 133b58d75170508567436cce259384d336949407d4joshualittGrCommandBuilder* GrCommandBuilder::Create(GrGpu* gpu, bool reorder) { 143b58d75170508567436cce259384d336949407d4joshualitt if (reorder) { 153b58d75170508567436cce259384d336949407d4joshualitt return SkNEW_ARGS(GrReorderCommandBuilder, (gpu)); 163b58d75170508567436cce259384d336949407d4joshualitt } else { 173b58d75170508567436cce259384d336949407d4joshualitt return SkNEW_ARGS(GrInOrderCommandBuilder, (gpu)); 183b58d75170508567436cce259384d336949407d4joshualitt } 193b58d75170508567436cce259384d336949407d4joshualitt} 203b58d75170508567436cce259384d336949407d4joshualitt 21e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordClear(const SkIRect* rect, 22e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrColor color, 23e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt bool canIgnoreRect, 24e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrRenderTarget* renderTarget) { 25e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt SkASSERT(renderTarget); 26e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 27e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt SkIRect r; 28e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt if (NULL == rect) { 29e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt // We could do something smart and remove previous draws and clears to 30e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt // the current render target. If we get that smart we have to make sure 31e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt // those draws aren't read before this clear (render-to-texture). 32e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt r.setLTRB(0, 0, renderTarget->width(), renderTarget->height()); 33e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt rect = &r; 34e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt } 35e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt Clear* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), Clear, (renderTarget)); 36e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrColorIsPMAssert(color); 37e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt clr->fColor = color; 38e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt clr->fRect = *rect; 39e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt clr->fCanIgnoreRect = canIgnoreRect; 40e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt return clr; 41e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt} 42e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 43e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordClearStencilClip(const SkIRect& rect, 44e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt bool insideClip, 45e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrRenderTarget* renderTarget) { 46e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt SkASSERT(renderTarget); 47e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 48e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt ClearStencilClip* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), 49e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt ClearStencilClip, 50e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt (renderTarget)); 51e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt clr->fRect = rect; 52e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt clr->fInsideClip = insideClip; 53e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt return clr; 54e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt} 55e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 56e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordDiscard(GrRenderTarget* renderTarget) { 57e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt SkASSERT(renderTarget); 58e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 59e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt Clear* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), Clear, (renderTarget)); 60e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt clr->fColor = GrColor_ILLEGAL; 61e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt return clr; 62e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt} 63e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 64e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordCopySurface(GrSurface* dst, 65e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrSurface* src, 66e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt const SkIRect& srcRect, 67e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt const SkIPoint& dstPoint) { 68e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt CopySurface* cs = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), CopySurface, (dst, src)); 69e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt cs->fSrcRect = srcRect; 70e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt cs->fDstPoint = dstPoint; 71e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt return cs; 72e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt} 73e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 74e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* 75e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrCommandBuilder::recordXferBarrierIfNecessary(const GrPipeline& pipeline, 76e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt const GrDrawTargetCaps& caps) { 77e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt const GrXferProcessor& xp = *pipeline.getXferProcessor(); 78e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrRenderTarget* rt = pipeline.getRenderTarget(); 79e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 80e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt GrXferBarrierType barrierType; 81e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt if (!xp.willNeedXferBarrier(rt, caps, &barrierType)) { 82e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt return NULL; 83e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt } 84e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt 85231c5fd590c898957d65cbfbc51040c7fe236af6cdalton XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), XferBarrier, (rt)); 86e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt xb->fBarrierType = barrierType; 87e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt return xb; 88e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt} 89