- /* SGT t0.y, t0.xxxx, tex.wwww; # bool b = d > 1 (NOTE tex.w == 1) */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_SGT;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_Y;
- newInst.Instruction.NumSrcRegs = 2;
- newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[0].Register.Index = tmp0;
- newInst.Src[0].Register.SwizzleY = TGSI_SWIZZLE_X;
- newInst.Src[1].Register.File = TGSI_FILE_INPUT;
- newInst.Src[1].Register.Index = texInput;
- newInst.Src[1].Register.SwizzleY = TGSI_SWIZZLE_W;
- ctx->emit_instruction(ctx, &newInst);
-
- /* KIL -tmp0.yyyy; # if -tmp0.y < 0, KILL */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_KIL;
- newInst.Instruction.NumDstRegs = 0;
- newInst.Instruction.NumSrcRegs = 1;
- newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[0].Register.Index = tmp0;
- newInst.Src[0].Register.SwizzleX = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.SwizzleY = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.SwizzleZ = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.SwizzleW = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.Negate = 1;
- ctx->emit_instruction(ctx, &newInst);
-
-
- /* compute coverage factor = (1-d)/(1-k) */
-
- /* SUB t0.z, tex.w, tex.z; # m = 1 - k */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_SUB;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_Z;
- newInst.Instruction.NumSrcRegs = 2;
- newInst.Src[0].Register.File = TGSI_FILE_INPUT;
- newInst.Src[0].Register.Index = texInput;
- newInst.Src[0].Register.SwizzleZ = TGSI_SWIZZLE_W;
- newInst.Src[1].Register.File = TGSI_FILE_INPUT;
- newInst.Src[1].Register.Index = texInput;
- newInst.Src[1].Register.SwizzleZ = TGSI_SWIZZLE_Z;
- ctx->emit_instruction(ctx, &newInst);
-
- /* RCP t0.z, t0.z; # t0.z = 1 / m */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_RCP;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_Z;
- newInst.Instruction.NumSrcRegs = 1;
- newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[0].Register.Index = tmp0;
- newInst.Src[0].Register.SwizzleX = TGSI_SWIZZLE_Z;
- ctx->emit_instruction(ctx, &newInst);
-
- /* SUB t0.y, 1, t0.x; # d = 1 - d */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_SUB;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_Y;
- newInst.Instruction.NumSrcRegs = 2;
- newInst.Src[0].Register.File = TGSI_FILE_INPUT;
- newInst.Src[0].Register.Index = texInput;
- newInst.Src[0].Register.SwizzleY = TGSI_SWIZZLE_W;
- newInst.Src[1].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[1].Register.Index = tmp0;
- newInst.Src[1].Register.SwizzleY = TGSI_SWIZZLE_X;
- ctx->emit_instruction(ctx, &newInst);
-
- /* MUL t0.w, t0.y, t0.z; # coverage = d * m */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_MUL;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_W;
- newInst.Instruction.NumSrcRegs = 2;
- newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[0].Register.Index = tmp0;
- newInst.Src[0].Register.SwizzleW = TGSI_SWIZZLE_Y;
- newInst.Src[1].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[1].Register.Index = tmp0;
- newInst.Src[1].Register.SwizzleW = TGSI_SWIZZLE_Z;
- ctx->emit_instruction(ctx, &newInst);
-
- /* SLE t0.y, t0.x, tex.z; # bool b = distance <= k */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_SLE;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_Y;
- newInst.Instruction.NumSrcRegs = 2;
- newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[0].Register.Index = tmp0;
- newInst.Src[0].Register.SwizzleY = TGSI_SWIZZLE_X;
- newInst.Src[1].Register.File = TGSI_FILE_INPUT;
- newInst.Src[1].Register.Index = texInput;
- newInst.Src[1].Register.SwizzleY = TGSI_SWIZZLE_Z;
- ctx->emit_instruction(ctx, &newInst);
-
- /* CMP t0.w, -t0.y, tex.w, t0.w;
- * # if -t0.y < 0 then
- * t0.w = 1
- * else
- * t0.w = t0.w
- */
- newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_CMP;
- newInst.Instruction.NumDstRegs = 1;
- newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Dst[0].Register.Index = tmp0;
- newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_W;
- newInst.Instruction.NumSrcRegs = 3;
- newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[0].Register.Index = tmp0;
- newInst.Src[0].Register.SwizzleX = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.SwizzleY = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.SwizzleZ = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.SwizzleW = TGSI_SWIZZLE_Y;
- newInst.Src[0].Register.Negate = 1;
- newInst.Src[1].Register.File = TGSI_FILE_INPUT;
- newInst.Src[1].Register.Index = texInput;
- newInst.Src[1].Register.SwizzleX = TGSI_SWIZZLE_W;
- newInst.Src[1].Register.SwizzleY = TGSI_SWIZZLE_W;
- newInst.Src[1].Register.SwizzleZ = TGSI_SWIZZLE_W;
- newInst.Src[1].Register.SwizzleW = TGSI_SWIZZLE_W;
- newInst.Src[2].Register.File = TGSI_FILE_TEMPORARY;
- newInst.Src[2].Register.Index = tmp0;
- newInst.Src[2].Register.SwizzleX = TGSI_SWIZZLE_W;
- newInst.Src[2].Register.SwizzleY = TGSI_SWIZZLE_W;
- newInst.Src[2].Register.SwizzleZ = TGSI_SWIZZLE_W;
- newInst.Src[2].Register.SwizzleW = TGSI_SWIZZLE_W;
- ctx->emit_instruction(ctx, &newInst);
+ /* SGT t0.y, t0.xxxx, tex.wwww; # bool b = d > 1 (NOTE tex.w == 1) */
+ tgsi_transform_op2_swz_inst(ctx, TGSI_OPCODE_SGT,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_WRITEMASK_Y,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_X,
+ TGSI_FILE_INPUT, texInput, TGSI_SWIZZLE_W, false);
+
+ /* KILL_IF -tmp0.yyyy; # if -tmp0.y < 0, KILL */
+ tgsi_transform_kill_inst(ctx, TGSI_FILE_TEMPORARY, tmp0,
+ TGSI_SWIZZLE_Y, TRUE);
+
+ /* compute coverage factor = (1-d)/(1-k) */
+
+ /* SUB t0.z, tex.w, tex.z; # m = 1 - k */
+ tgsi_transform_op2_swz_inst(ctx, TGSI_OPCODE_ADD,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_WRITEMASK_Z,
+ TGSI_FILE_INPUT, texInput, TGSI_SWIZZLE_W,
+ TGSI_FILE_INPUT, texInput, TGSI_SWIZZLE_Z, true);
+
+ /* RCP t0.z, t0.z; # t0.z = 1 / m */
+ newInst = tgsi_default_full_instruction();
+ newInst.Instruction.Opcode = TGSI_OPCODE_RCP;
+ newInst.Instruction.NumDstRegs = 1;
+ newInst.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
+ newInst.Dst[0].Register.Index = tmp0;
+ newInst.Dst[0].Register.WriteMask = TGSI_WRITEMASK_Z;
+ newInst.Instruction.NumSrcRegs = 1;
+ newInst.Src[0].Register.File = TGSI_FILE_TEMPORARY;
+ newInst.Src[0].Register.Index = tmp0;
+ newInst.Src[0].Register.SwizzleX = TGSI_SWIZZLE_Z;
+ ctx->emit_instruction(ctx, &newInst);
+
+ /* SUB t0.y, 1, t0.x; # d = 1 - d */
+ tgsi_transform_op2_swz_inst(ctx, TGSI_OPCODE_ADD,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_WRITEMASK_Y,
+ TGSI_FILE_INPUT, texInput, TGSI_SWIZZLE_W,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_X, true);
+
+ /* MUL t0.w, t0.y, t0.z; # coverage = d * m */
+ tgsi_transform_op2_swz_inst(ctx, TGSI_OPCODE_MUL,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_WRITEMASK_W,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_Y,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_Z, false);
+
+ /* SLE t0.y, t0.x, tex.z; # bool b = distance <= k */
+ tgsi_transform_op2_swz_inst(ctx, TGSI_OPCODE_SLE,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_WRITEMASK_Y,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_X,
+ TGSI_FILE_INPUT, texInput, TGSI_SWIZZLE_Z, false);
+
+ /* CMP t0.w, -t0.y, tex.w, t0.w;
+ * # if -t0.y < 0 then
+ * t0.w = 1
+ * else
+ * t0.w = t0.w
+ */
+ tgsi_transform_op3_swz_inst(ctx, TGSI_OPCODE_CMP,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_WRITEMASK_W,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_Y, 1,
+ TGSI_FILE_INPUT, texInput, TGSI_SWIZZLE_W,
+ TGSI_FILE_TEMPORARY, tmp0, TGSI_SWIZZLE_W);
+}