blob: b3f6d7185b6b219de70ba1a9eb420214b044daea [file] [log] [blame]
joshualitte46760e2015-05-05 08:41:50 -07001/*
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
joshualitt3b58d752015-05-07 11:14:30 -070010#include "GrInOrderCommandBuilder.h"
11#include "GrReorderCommandBuilder.h"
12
13GrCommandBuilder* 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
joshualitte46760e2015-05-05 08:41:50 -070021GrTargetCommands::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
43GrTargetCommands::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
56GrTargetCommands::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
64GrTargetCommands::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
74GrTargetCommands::Cmd*
75GrCommandBuilder::recordXferBarrierIfNecessary(const GrPipeline& pipeline,
bsalomon4b91f762015-05-19 09:29:46 -070076 const GrCaps& caps) {
joshualitte46760e2015-05-05 08:41:50 -070077 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
cdalton231c5fd2015-05-13 12:35:36 -070085 XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), XferBarrier, (rt));
joshualitte46760e2015-05-05 08:41:50 -070086 xb->fBarrierType = barrierType;
87 return xb;
88}