diff options
author | Alok Hota <[email protected]> | 2018-05-25 10:19:43 -0500 |
---|---|---|
committer | Tim Rowley <[email protected]> | 2018-05-25 10:55:37 -0500 |
commit | cfe75cc7b5acbf0692baff07a516ff4efe7fa968 (patch) | |
tree | 4d6a007e8cfccbca5046a1bdae16ca98e5bdc71d /src/gallium | |
parent | 45eb24fedf5b790237263d79d72cd1e433931b87 (diff) |
swr/rast: Added in-place building to SCATTERPS
SCATTERPS previously assumed it was being used with an existing basic
block
Reviewed-by: Bruce Cherniak <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp index 6e17888f832..77c2095ea9c 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp @@ -617,17 +617,28 @@ namespace SwrJit Value* pIsUndef = ICMP_EQ(pIndex, C(32)); - // Split current block - BasicBlock* pPostLoop = pCurBB->splitBasicBlock(cast<Instruction>(pIsUndef)->getNextNode()); + // Split current block or create new one if building inline + BasicBlock* pPostLoop; + if (pCurBB->getTerminator()) + { + pPostLoop = pCurBB->splitBasicBlock(cast<Instruction>(pIsUndef)->getNextNode()); - // Remove unconditional jump created by splitBasicBlock - pCurBB->getTerminator()->eraseFromParent(); + // Remove unconditional jump created by splitBasicBlock + pCurBB->getTerminator()->eraseFromParent(); - // Add terminator to end of original block - IRB()->SetInsertPoint(pCurBB); + // Add terminator to end of original block + IRB()->SetInsertPoint(pCurBB); - // Add conditional branch - COND_BR(pIsUndef, pPostLoop, pLoop); + // Add conditional branch + COND_BR(pIsUndef, pPostLoop, pLoop); + } + else + { + pPostLoop = BasicBlock::Create(mpJitMgr->mContext, "PostScatter_Loop", pFunc); + + // Add conditional branch + COND_BR(pIsUndef, pPostLoop, pLoop); + } // Add loop basic block contents IRB()->SetInsertPoint(pLoop); @@ -642,7 +653,7 @@ namespace SwrJit Value* pOffsetElem = LOADV(pOffsetsArrayPtr, { pIndexPhi }); // GEP to this offset in dst - Value* pCurDst = GEP(pDst, pOffsetElem); + Value* pCurDst = GEP(pDst, pOffsetElem, mInt8PtrTy); pCurDst = POINTER_CAST(pCurDst, PointerType::get(pSrcTy, 0)); STORE(pSrcElem, pCurDst); |