Lines Matching full:builder
29 static void StencilOp(IRBuilder<> &builder, const unsigned char op,
32 CondBranch condBranch(builder);
33 Value * s = builder.CreateLoad(sPtr, "stenciOpS");
36 builder.CreateStore(builder.getInt8(0), sPtr);
39 builder.CreateStore(s, sPtr);
42 builder.CreateStore(sRef, sPtr);
45 condBranch.ifCond(builder.CreateICmpEQ(s, builder.getInt8(255)));
46 builder.CreateStore(s, sPtr);
48 builder.CreateStore(builder.CreateAdd(s, builder.getInt8(1)), sPtr);
52 condBranch.ifCond(builder.CreateICmpEQ(s, builder.getInt8(0)));
53 builder.CreateStore(s, sPtr);
55 builder.CreateStore(builder.CreateSub(s, builder.getInt8(1)), sPtr);
59 builder.CreateStore(builder.CreateNot(s), sPtr);
62 builder.CreateStore(builder.CreateAdd(s, builder.getInt8(1)), sPtr);
65 builder.CreateStore(builder.CreateSub(s, builder.getInt8(1)), sPtr);
73 static Value * StencilOp(IRBuilder<> & builder, Value * face,
77 CondBranch condBranch(builder);
79 condBranch.ifCond(builder.CreateICmpEQ(face, builder.getInt8(0)));
81 StencilOp(builder, frontOp, sPtr, sRef);
85 StencilOp(builder, backOp, sPtr, sRef);
88 return builder.CreateLoad(sPtr);
91 static void StencilFunc(IRBuilder<> & builder, const unsigned char func,
96 builder.CreateStore(builder.getFalse(), sCmpPtr);
99 builder.CreateStore(builder.CreateICmpULT(sRef, s), sCmpPtr);
102 builder.CreateStore(builder.CreateICmpEQ(sRef, s), sCmpPtr);
105 builder.CreateStore(builder.CreateICmpULE(sRef, s), sCmpPtr);
108 builder.CreateStore(builder.CreateICmpUGT(sRef, s), sCmpPtr);
111 builder.CreateStore(builder.CreateICmpNE(sRef, s), sCmpPtr);
114 builder.CreateStore(builder.CreateICmpUGE(sRef, s), sCmpPtr);
117 builder.CreateStore(builder.getTrue(), sCmpPtr);
128 Value * sOne, const bool isVector, IRBuilder<> & builder)
142 factor = builder.CreateSub(one, src);
148 factor = builder.CreateSub(one, dst);
153 factor = intVec(builder, factor, factor, factor, factor);
156 factor = builder.CreateSub(sOne, srcA);
158 factor = intVec(builder, factor, factor, factor, factor);
163 factor = intVec(builder, factor, factor, factor, factor);
166 factor = builder.CreateSub(sOne, dstA);
168 factor = intVec(builder, factor, factor, factor, factor);
172 factor = minIntScalar(builder, srcA, builder.CreateSub(sOne, dstA));
174 factor = intVec(builder, factor, factor, factor, sOne);
182 factor = builder.CreateSub(one, constant);
187 factor = intVec(builder, factor, factor, factor, factor);
190 factor = builder.CreateSub(sOne, constantA);
192 factor = intVec(builder, factor, factor, factor, factor);
201 static Value * Saturate(IRBuilder<> & builder, Value * intVector)
203 intVector = intVecMax(builder, intVector, constIntVec(builder, 0,0,0,0));
204 return intVecMin(builder, intVector, constIntVec(builder, 255,255,255,255));
209 static Value * IntVectorToScreenColor(IRBuilder<> & builder, const GGLPixelFormat format, Value * src)
212 src = builder.CreateShl(src, constIntVec(builder, 0, 8, 16, 24));
213 std::vector<Value *> comps = extractVector(builder, src);
214 comps[0] = builder.CreateOr(comps[0], comps[1]);
215 comps[0] = builder.CreateOr(comps[0], comps[2]);
216 comps[0] = builder.CreateOr(comps[0], comps[3]);
219 src = builder.CreateAnd(src, constIntVec(builder, 0xf8, 0xfc, 0xf8, 0));
220 std::vector<Value *> comps = extractVector(builder, src);
223 comps[i] = builder.CreateTrunc(comps[i], builder.getInt16Ty());
224 comps[2] = builder.CreateLShr(comps[2], 3);
225 comps[1] = builder.CreateShl(comps[1], 3);
226 comps[0] = builder.CreateShl(comps[0], 8);
228 comps[0] = builder.CreateOr(comps[0], comps[1]);
229 comps[0] = builder.CreateOr(comps[0], comps[2]);
232 return builder.getInt32(0);
240 static Value * ScreenColorToIntVector(IRBuilder<> & builder, const GGLPixelFormat format, Value * src)
242 src = builder.CreateZExt(src, builder.getInt32Ty());
243 Value * dst = intVec(builder, src, src, src, src);
245 dst = builder.CreateLShr(dst, constIntVec(builder, 0, 8, 16, 24));
246 dst = builder.CreateAnd(dst, constIntVec(builder, 0xff, 0xff, 0xff, 0xff));
249 dst = builder.CreateAnd(dst, constIntVec(builder, 0xf800, 0x7e0, 0x1f, 0));
250 dst = builder.CreateLShr(dst, constIntVec(builder, 8, 3, 0, 0));
251 dst = builder.CreateShl(dst, constIntVec(builder, 0, 0, 3, 0));
252 dst = builder.CreateOr(dst, constIntVec(builder, 0, 0, 0, 0xff));
262 IRBuilder<> & builder, Value * src, Value * dst)
264 Type * const intType = builder.getInt32Ty();
271 // src = builder.CreateExtractElement(src, builder.getInt32(0));
272 // src = builder.CreateBitCast(src, intType); // it's already RGBA int32
276 src = builder.CreateFMul(src, constFloatVec(builder,255,255,255,255));
277 src = builder.CreateFPToSI(src, intVecType(builder));
278 src = Saturate(builder, src);
279 src = IntVectorToScreenColor(builder, format, src);
283 // src = builder.CreateBitCast(src, instr->GetIntVectorType());
289 // src = builder.CreateBitCast(src, instr->GetIntVectorType());
290 // src = builder.CreateAShr(src, constIntVec(builder,8,8,8,8));
301 // src = builder.CreateExtractElement(src, builder.getInt32(0));
302 // src = builder.CreateBitCast(src, intType); // it's already RGBA int32
305 // channels = builder.CreateInsertElement(channels, src, builder.getInt32(0));
306 // channels = builder.CreateInsertElement(channels, src, builder.getInt32(1));
307 // channels = builder.CreateInsertElement(channels, src, builder.getInt32(2));
308 // channels = builder.CreateInsertElement(channels, src, builder.getInt32(3));
309 // channels = builder.CreateLShr(channels, constIntVec(builder,0, 8, 16, 24));
310 // channels = builder.CreateAnd(channels, constIntVec(builder,0xff, 0xff, 0xff, 0xff));
314 // src = builder.CreateBitCast(src, instr->GetIntVectorType());
317 // src = builder.CreateBitCast(src, instr->GetIntVectorType());
319 // src = builder.CreateAShr(src, constIntVec(builder,8,8,8,8));
323 src = builder.CreateFMul(src, constFloatVec(builder,255,255,255,255));
324 src = builder.CreateFPToSI(src, intVecType(builder));
329 Value * const one = constIntVec(builder,255,255,255,255);
330 Value * const zero = constIntVec(builder,0,0,0,0);
331 Value * const sOne = builder.getInt32(255);
332 Value * const sZero = builder.getInt32(0);
335 Value * constant = constIntVec(builder,gglCtx->blendState.color[0],
344 Value * srcA = extractVector(builder,src)[3];
345 Value * dstA = extractVector(builder,dst)[3];
346 Value * constantA = extractVector(builder,constant)[3];
350 constantA, sOne, true, builder);
354 constantA, sOne, false, builder);
355 sf = builder.CreateInsertElement(sf, sfA, builder.getInt32(3),
361 constantA, sOne, true, builder);
365 constantA, sOne, false, builder);
366 df = builder.CreateInsertElement(df, dfA, builder.getInt32(3),
371 sf = builder.CreateAdd(sf, builder.CreateLShr(sf, constIntVec(builder,7,7,7,7)));
372 df = builder.CreateAdd(df, builder.CreateLShr(df, constIntVec(builder,7,7,7,7)));
374 src = builder.CreateMul(src, sf);
375 dst = builder.CreateMul(dst, df);
380 res = builder.CreateAdd(src, dst);
383 res = builder.CreateSub(src, dst);
386 res = builder.CreateSub(dst, src);
393 srcA = extractVector(builder,src)[3];
394 dstA = extractVector(builder,dst)[3];
398 resA = builder.CreateAdd(srcA, dstA);
401 resA = builder.CreateSub(srcA, dstA);
404 resA = builder.CreateSub(dstA, srcA);
410 res = builder.CreateInsertElement(res, resA, builder.getInt32(3),
414 res = builder.CreateAShr(res, constIntVec(builder,8,8,8,8));
415 res = Saturate(builder, res);
416 res = IntVectorToScreenColor(builder, format, res);
420 static FunctionType * ScanLineFunctionType(IRBuilder<> & builder)
423 VectorType * vectorType = floatVecType(builder);
425 Type * intType = builder.getInt32Ty();
427 PointerType * bytePointerType = PointerType::get(builder.getInt8Ty(), 0);
438 FunctionType *functionType = FunctionType::get(/*Result=*/builder.getVoidTy(),
451 IRBuilder<> builder(mod->getContext());
454 Type * intType = builder.getInt32Ty();
456 Type * byteType = builder.getInt8Ty();
464 ScanLineFunctionType(builder)));
466 BasicBlock *label_entry = BasicBlock::Create(builder.getContext(), "entry", func, 0);
467 builder.SetInsertPoint(label_entry);
468 CondBranch condBranch(builder);
479 Value * framePtr = builder.CreateAlloca(intPointerType);
480 builder.CreateStore(args++, framePtr);
481 Value * depthPtr = builder.CreateAlloca(intPointerType);
482 builder.CreateStore(args++, depthPtr);
483 Value * stencilPtr = builder.CreateAlloca(bytePointerType);
484 builder.CreateStore(args++, stencilPtr);
487 Value * countPtr = builder.CreateAlloca(intType);
488 builder.CreateStore(args++, countPtr);
492 sFace = builder.CreateLoad(builder.CreateConstInBoundsGEP1_32(stencilState, 0), "sFace");
494 sRef = builder.getInt8(gglCtx->frontStencil.ref);
496 sRef = builder.CreateLoad(builder.CreateConstInBoundsGEP1_32(stencilState, 1), "sRef");
498 sMask = builder.getInt8(gglCtx->frontStencil.mask);
500 sMask = builder.CreateLoad(builder.CreateConstInBoundsGEP1_32(stencilState, 2), "sMask");
502 sFunc = builder.getInt8(gglCtx->frontStencil.func);
504 sFunc = builder.CreateLoad(builder.CreateConstInBoundsGEP1_32(stencilState, 3), "sFunc");
513 frame = builder.CreateLoad(framePtr);
515 frame = builder.CreateLoad(framePtr);
516 frame = builder.CreateBitCast(frame, PointerType::get(builder.getInt16Ty(), 0));
518 frame = builder.CreateLoad(framePtr); // color buffer not set yet
526 depth = builder.CreateLoad(depthPtr);
530 Value * count = builder.CreateLoad(countPtr);
533 Value * cmp = builder.CreateICmpEQ(count, builder.getInt32(0));
540 stencil = builder.CreateLoad(stencilPtr);
544 sCmpPtr = builder.CreateAlloca(builder.getInt1Ty());
546 sPtr = builder.CreateAlloca(byteType);
549 s = builder.CreateLoad(stencil);
550 s = builder.CreateAnd(s, sMask);
551 builder.CreateStore(s, sPtr);
554 condBranch.ifCond(builder.CreateICmpEQ(sFace, builder.getInt8(0)));
556 StencilFunc(builder, gglCtx->frontStencil.func, s, sRef, sCmpPtr);
560 StencilFunc(builder, gglCtx->backStencil.func, s, sRef, sCmpPtr);
564 sCmp = builder.CreateLoad(sCmpPtr);
571 depthZ = builder.CreateLoad(depth, "depthZ"); // z stored in buffer
572 zPtr = builder.CreateAlloca(intType); // temp store for modifying incoming z
576 z = builder.CreateBitCast(start, intPointerType);
577 z = builder.CreateConstInBoundsGEP1_32(z, (GGL_FS_INPUT_OFFSET +
579 z = builder.CreateLoad(z, "z");
581 builder.CreateStore(z, zPtr);
583 Value * zNegative = builder.CreateICmpSLT(z, builder.getInt32(0));
586 z = builder.CreateXor(z, builder.getInt32(0x7fffffff));
587 builder.CreateStore(z, zPtr);
591 z = builder.CreateLoad(zPtr, "z");
598 zCmp = builder.CreateICmpSLT(z, depthZ);
601 zCmp = builder.CreateICmpEQ(z, depthZ);
604 zCmp = builder.CreateICmpSLE(z, depthZ);
607 zCmp = builder.CreateICmpSGT(z, depthZ);
610 zCmp = builder.CreateICmpNE(z, depthZ);
613 zCmp = builder.CreateICmpSGE(z, depthZ);
632 Value * fsOutputs = builder.CreateConstInBoundsGEP1_32(start,
637 CallInst *call = builder.CreateCall3(fsFunction,inputs, outputs, constants);
641 Value * dst = Constant::getNullValue(intVecType(builder));
643 Value * frameColor = builder.CreateLoad(frame, "frameColor");
644 dst = ScreenColorToIntVector(builder, gglCtx->bufferState.colorFormat, frameColor);
647 Value * src = builder.CreateConstInBoundsGEP1_32(fsOutputs, 0);
648 src = builder.CreateLoad(src);
650 Value * color = GenerateFSBlend(gglCtx, gglCtx->bufferState.colorFormat,/*&prog->outputRegDesc,*/ builder, src, dst);
651 builder.CreateStore(color, frame);
654 z = builder.CreateBitCast(z, intType);
655 builder.CreateStore(z, depth); // store z
659 builder.CreateStore(StencilOp(builder, sFace, gglCtx->frontStencil.dPass,
665 builder.CreateStore(StencilOp(builder, sFace, gglCtx->frontStencil.dFail,
671 builder.CreateStore(StencilOp(builder, sFace, gglCtx->frontStencil.sFail,
676 frame = builder.CreateConstInBoundsGEP1_32(frame, 1); // frame++
678 frame = builder.CreateBitCast(frame, PointerType::get(builder.getInt32Ty(), 0));
679 builder.CreateStore(frame, framePtr);
681 depth = builder.CreateConstInBoundsGEP1_32(depth, 1); // depth++
682 builder.CreateStore(depth, depthPtr);
685 stencil = builder.CreateConstInBoundsGEP1_32(stencil, 1); // stencil++
686 builder.CreateStore(stencil, stencilPtr);
690 vPtr = builder.CreateConstInBoundsGEP1_32(start, GGL_FS_INPUT_OFFSET +
692 v = builder.CreateLoad(vPtr);
693 dx = builder.CreateConstInBoundsGEP1_32(step, GGL_FS_INPUT_OFFSET +
695 dx = builder.CreateLoad(dx);
696 v = builder.CreateFAdd(v, dx);
697 builder.CreateStore(v, vPtr);
699 Type * floatType = builder.getFloatTy();
701 vPtr = builder.CreateBitCast(start, floatPointerType);
702 vPtr = builder.CreateConstInBoundsGEP1_32(vPtr,
704 v = builder.CreateLoad(vPtr);
705 dx = builder.CreateBitCast(step, floatPointerType);
706 dx = builder.CreateConstInBoundsGEP1_32(dx,
708 dx = builder.CreateLoad(dx);
709 v = builder.CreateFAdd(v, dx);
710 builder.CreateStore(v, vPtr);
714 vPtr = builder.CreateConstInBoundsGEP1_32(start, GGL_FS_INPUT_OFFSET +
716 v = builder.CreateLoad(vPtr);
717 dx = builder.CreateConstInBoundsGEP1_32(step, GGL_FS_INPUT_OFFSET +
719 dx = builder.CreateLoad(dx);
720 v = builder.CreateFAdd(v, dx);
721 builder.CreateStore(v, vPtr);
725 vPtr = builder.CreateConstInBoundsGEP1_32(start, offsetof(VertexOutput,varyings)/sizeof(Vector4) + i);
726 v = builder.CreateLoad(vPtr);
727 dx = builder.CreateConstInBoundsGEP1_32(step, GGL_FS_INPUT_OFFSET +
729 dx = builder.CreateLoad(dx);
730 v = builder.CreateFAdd(v, dx);
731 builder.CreateStore(v, vPtr);
734 count = builder.CreateSub(count, builder.getInt32(1));
735 builder.CreateStore(count, countPtr); // count--;
739 builder.CreateRetVoid();