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