Home | History | Annotate | Download | only in gpu
      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 "GrCommandBuilder.h"
      9 
     10 #include "GrInOrderCommandBuilder.h"
     11 #include "GrReorderCommandBuilder.h"
     12 
     13 GrCommandBuilder* GrCommandBuilder::Create(GrGpu* gpu, bool reorder) {
     14     if (reorder) {
     15         return SkNEW_ARGS(GrReorderCommandBuilder, (gpu));
     16     } else {
     17         return SkNEW_ARGS(GrInOrderCommandBuilder, (gpu));
     18     }
     19 }
     20 
     21 GrTargetCommands::Cmd* GrCommandBuilder::recordClear(const SkIRect* rect,
     22                                                      GrColor color,
     23                                                      bool canIgnoreRect,
     24                                                      GrRenderTarget* renderTarget) {
     25     SkASSERT(renderTarget);
     26 
     27     SkIRect r;
     28     if (NULL == rect) {
     29         // We could do something smart and remove previous draws and clears to
     30         // the current render target. If we get that smart we have to make sure
     31         // those draws aren't read before this clear (render-to-texture).
     32         r.setLTRB(0, 0, renderTarget->width(), renderTarget->height());
     33         rect = &r;
     34     }
     35     Clear* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), Clear, (renderTarget));
     36     GrColorIsPMAssert(color);
     37     clr->fColor = color;
     38     clr->fRect = *rect;
     39     clr->fCanIgnoreRect = canIgnoreRect;
     40     return clr;
     41 }
     42 
     43 GrTargetCommands::Cmd* GrCommandBuilder::recordClearStencilClip(const SkIRect& rect,
     44                                                                 bool insideClip,
     45                                                                 GrRenderTarget* renderTarget) {
     46     SkASSERT(renderTarget);
     47 
     48     ClearStencilClip* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(),
     49                                                      ClearStencilClip,
     50                                                      (renderTarget));
     51     clr->fRect = rect;
     52     clr->fInsideClip = insideClip;
     53     return clr;
     54 }
     55 
     56 GrTargetCommands::Cmd* GrCommandBuilder::recordDiscard(GrRenderTarget* renderTarget) {
     57     SkASSERT(renderTarget);
     58 
     59     Clear* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), Clear, (renderTarget));
     60     clr->fColor = GrColor_ILLEGAL;
     61     return clr;
     62 }
     63 
     64 GrTargetCommands::Cmd* GrCommandBuilder::recordCopySurface(GrSurface* dst,
     65                                                            GrSurface* src,
     66                                                            const SkIRect& srcRect,
     67                                                            const SkIPoint& dstPoint) {
     68     CopySurface* cs = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), CopySurface, (dst, src));
     69     cs->fSrcRect = srcRect;
     70     cs->fDstPoint = dstPoint;
     71     return cs;
     72 }
     73 
     74 GrTargetCommands::Cmd*
     75 GrCommandBuilder::recordXferBarrierIfNecessary(const GrPipeline& pipeline,
     76                                                const GrDrawTargetCaps& caps) {
     77     const GrXferProcessor& xp = *pipeline.getXferProcessor();
     78     GrRenderTarget* rt = pipeline.getRenderTarget();
     79 
     80     GrXferBarrierType barrierType;
     81     if (!xp.willNeedXferBarrier(rt, caps, &barrierType)) {
     82         return NULL;
     83     }
     84 
     85     XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), XferBarrier, (rt));
     86     xb->fBarrierType = barrierType;
     87     return xb;
     88 }
     89