GrCommandBuilder.cpp revision e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46
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
10e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt#include "GrColor.h"
11e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt#include "GrInOrderDrawBuffer.h"
12e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt#include "GrTemplates.h"
13e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt#include "SkPoint.h"
14e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
15e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittstatic bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettings) {
16e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Face;
17e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace);
18e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    if (isWinding) {
19e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // Double check that it is in fact winding.
20e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        SkASSERT(kIncClamp_StencilOp == pathStencilSettings.passOp(pathFace));
21e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        SkASSERT(kIncClamp_StencilOp == pathStencilSettings.failOp(pathFace));
22e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        SkASSERT(0x1 != pathStencilSettings.writeMask(pathFace));
23e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        SkASSERT(!pathStencilSettings.isTwoSided());
24e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    }
25e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return isWinding;
26e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
27e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
28e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordDrawBatch(State* state, GrBatch* batch) {
29e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    // Check if there is a Batch Draw we can batch with
30e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    if (!this->cmdBuffer()->empty() &&
31e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        Cmd::kDrawBatch_CmdType == this->cmdBuffer()->back().type()) {
32e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        DrawBatch* previous = static_cast<DrawBatch*>(&this->cmdBuffer()->back());
33e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        if (previous->fState == state && previous->fBatch->combineIfPossible(batch)) {
34e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            return NULL;
35e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        }
36e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    }
37e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
38e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), DrawBatch, (state, batch,
39e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                                    this->batchTarget()));
40e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
41e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
42e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd*
43e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrCommandBuilder::recordStencilPath(const GrPipelineBuilder& pipelineBuilder,
44e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                    const GrPathProcessor* pathProc,
45e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                    const GrPath* path,
46e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                    const GrScissorState& scissorState,
47e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                    const GrStencilSettings& stencilSettings) {
48e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    StencilPath* sp = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), StencilPath,
49e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                               (path, pipelineBuilder.getRenderTarget()));
50e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
51e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    sp->fScissor = scissorState;
52e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    sp->fUseHWAA = pipelineBuilder.isHWAntialias();
53e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    sp->fViewMatrix = pathProc->viewMatrix();
54e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    sp->fStencil = stencilSettings;
55e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return sp;
56e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
57e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
58e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd*
59e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrCommandBuilder::recordDrawPath(State* state,
60e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                 const GrPathProcessor* pathProc,
61e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                 const GrPath* path,
62e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                 const GrStencilSettings& stencilSettings) {
63e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    DrawPath* dp = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), DrawPath, (state, path));
64e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fStencilSettings = stencilSettings;
65e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return dp;
66e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
67e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
68e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd*
69e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrCommandBuilder::recordDrawPaths(State* state,
70e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  GrInOrderDrawBuffer* iodb,
71e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  const GrPathProcessor* pathProc,
72e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  const GrPathRange* pathRange,
73e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  const void* indexValues,
74e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  GrDrawTarget::PathIndexType indexType,
75e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  const float transformValues[],
76e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  GrDrawTarget::PathTransformType transformType,
77e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  int count,
78e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  const GrStencilSettings& stencilSettings,
79e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                  const GrDrawTarget::PipelineInfo& pipelineInfo) {
80e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkASSERT(pathRange);
81e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkASSERT(indexValues);
82e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkASSERT(transformValues);
83e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
84e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    char* savedIndices;
85e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    float* savedTransforms;
86e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
87e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    iodb->appendIndicesAndTransforms(indexValues, indexType,
88e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                     transformValues, transformType,
89e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                     count, &savedIndices, &savedTransforms);
90e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
91e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    if (!this->cmdBuffer()->empty() &&
92e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        Cmd::kDrawPaths_CmdType == this->cmdBuffer()->back().type()) {
93e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // The previous command was also DrawPaths. Try to collapse this call into the one
94e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // before. Note that stenciling all the paths at once, then covering, may not be
95e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // equivalent to two separate draw calls if there is overlap. Blending won't work,
96e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // and the combined calls may also cancel each other's winding numbers in some
97e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // places. For now the winding numbers are only an issue if the fill is even/odd,
98e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // because DrawPaths is currently only used for glyphs, and glyphs in the same
99e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // font tend to all wind in the same direction.
100e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        DrawPaths* previous = static_cast<DrawPaths*>(&this->cmdBuffer()->back());
101e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        if (pathRange == previous->pathRange() &&
102e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            indexType == previous->fIndexType &&
103e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            transformType == previous->fTransformType &&
104e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            stencilSettings == previous->fStencilSettings &&
105e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            path_fill_type_is_winding(stencilSettings) &&
106e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            !pipelineInfo.willBlendWithDst(pathProc) &&
107e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt            previous->fState == state) {
108e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                const int indexBytes = GrPathRange::PathIndexSizeInBytes(indexType);
109e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                const int xformSize = GrPathRendering::PathTransformSize(transformType);
110e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                if (&previous->fIndices[previous->fCount*indexBytes] == savedIndices &&
111e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                    (0 == xformSize ||
112e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                     &previous->fTransforms[previous->fCount*xformSize] == savedTransforms)) {
113e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                    // Fold this DrawPaths call into the one previous.
114e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                    previous->fCount += count;
115e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                    return NULL;
116e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                }
117e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        }
118e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    }
119e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
120e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    DrawPaths* dp = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), DrawPaths, (state, pathRange));
121e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fIndices = savedIndices;
122e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fIndexType = indexType;
123e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fTransforms = savedTransforms;
124e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fTransformType = transformType;
125e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fCount = count;
126e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    dp->fStencilSettings = stencilSettings;
127e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return dp;
128e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
129e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
130e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordClear(const SkIRect* rect,
131e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                     GrColor color,
132e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                     bool canIgnoreRect,
133e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                     GrRenderTarget* renderTarget) {
134e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkASSERT(renderTarget);
135e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
136e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkIRect r;
137e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    if (NULL == rect) {
138e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // We could do something smart and remove previous draws and clears to
139e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // the current render target. If we get that smart we have to make sure
140e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        // those draws aren't read before this clear (render-to-texture).
141e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        r.setLTRB(0, 0, renderTarget->width(), renderTarget->height());
142e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        rect = &r;
143e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    }
144e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    Clear* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), Clear, (renderTarget));
145e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrColorIsPMAssert(color);
146e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    clr->fColor = color;
147e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    clr->fRect = *rect;
148e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    clr->fCanIgnoreRect = canIgnoreRect;
149e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return clr;
150e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
151e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
152e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordClearStencilClip(const SkIRect& rect,
153e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                                bool insideClip,
154e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                                GrRenderTarget* renderTarget) {
155e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkASSERT(renderTarget);
156e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
157e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    ClearStencilClip* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(),
158e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                     ClearStencilClip,
159e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                     (renderTarget));
160e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    clr->fRect = rect;
161e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    clr->fInsideClip = insideClip;
162e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return clr;
163e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
164e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
165e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordDiscard(GrRenderTarget* renderTarget) {
166e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    SkASSERT(renderTarget);
167e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
168e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    Clear* clr = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), Clear, (renderTarget));
169e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    clr->fColor = GrColor_ILLEGAL;
170e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return clr;
171e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
172e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
173e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd* GrCommandBuilder::recordCopySurface(GrSurface* dst,
174e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                           GrSurface* src,
175e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                           const SkIRect& srcRect,
176e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                                           const SkIPoint& dstPoint) {
177e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    CopySurface* cs = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), CopySurface, (dst, src));
178e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    cs->fSrcRect = srcRect;
179e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    cs->fDstPoint = dstPoint;
180e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return cs;
181e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
182e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
183e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrTargetCommands::Cmd*
184e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualittGrCommandBuilder::recordXferBarrierIfNecessary(const GrPipeline& pipeline,
185e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt                                               const GrDrawTargetCaps& caps) {
186e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    const GrXferProcessor& xp = *pipeline.getXferProcessor();
187e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrRenderTarget* rt = pipeline.getRenderTarget();
188e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
189e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    GrXferBarrierType barrierType;
190e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    if (!xp.willNeedXferBarrier(rt, caps, &barrierType)) {
191e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt        return NULL;
192e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    }
193e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt
194e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    XferBarrier* xb = GrNEW_APPEND_TO_RECORDER(*this->cmdBuffer(), XferBarrier, ());
195e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    xb->fBarrierType = barrierType;
196e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    return xb;
197e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt}
198