/* The initial payload of the thread is always g0.
 * WM_URB (incoming URB entries) is g3
 * X0_R is g4
 * X1_R is g5
 * Y0_R is g6
 * Y1_R is g7
 */

    /* Set up the X/Y screen coordinates of the pixels in our 4 subspans.  Each
     * subspan is a 2x2 rectangle, and the screen x/y of the upper left of each
     * subspan are given in GRF register 1.2 through 1.5 (which, with the word
     * addressing below, are 1.4 through 1.11).
     *
     * The result is WM_X*_R and WM_Y*R being:
     *
     * X0: {ss0.x, ss0.x+1, ss0.x,   ss0.x+1, ss1.x, ss1.x+1, ss1.x,   ss1.x+y}
     * Y0: {ss0.y, ss0.y,   ss0.y+1, ss0.y+1, ss1.y, ss1.y,   ss1.y+1, ss1.y+1}
     * X1: {ss2.x, ss2.x+1, ss2.x,   ss2.x+1, ss3.x, ss3.x+1, ss3.x,   ss3.x+y}
     * Y1: {ss2.y, ss2.y,   ss2.y+1, ss2.y+1, ss3.y, ss3.y,   ss3.y+1, ss3.y+1}
     */

    /* Set up ss0.x coordinates*/
mov (1) g4<1>F g1.8<0,1,0>UW { align1 };
add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 };
mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 };
add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 };
    /* Set up ss0.y coordinates */
mov (1) g6<1>F g1.10<0,1,0>UW { align1 };
mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 };
add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 };
add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 };
    /* set up ss1.x coordinates */
mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 };
add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 };
mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 };
add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 };
    /* set up ss1.y coordinates */
mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 };
mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 };
add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 };
add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 };
    /* Set up ss2.x coordinates */
mov (1) g5<1>F g1.16<0,1,0>UW { align1 };
add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 };
mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 };
add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 };
    /* Set up ss2.y coordinates */
mov (1) g7<1>F g1.18<0,1,0>UW { align1 };
mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 };
add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 };
add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 };
    /* Set up ss3.x coordinates */
mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 };
add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 };
mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 };
add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 };
    /* Set up ss3.y coordinates */
mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 };
mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 };
add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 };
add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 };

    /* Now, map these screen space coordinates into texture coordinates. */
    /* subtract screen-space X origin of vertex 0. */
add (8) g4<1>F g4<8,8,1>F -g1<0,1,0>F { align1 };
add (8) g5<1>F g5<8,8,1>F -g1<0,1,0>F { align1 };
    /* scale by texture X increment */
mul (8) g4<1>F g4<8,8,1>F g3<0,1,0>F { align1 };
mul (8) g5<1>F g5<8,8,1>F g3<0,1,0>F { align1 };
    /* add in texture X offset */
add (8) g4<1>F g4<8,8,1>F g3.12<0,1,0>F { align1 };
add (8) g5<1>F g5<8,8,1>F g3.12<0,1,0>F { align1 };
    /* subtract screen-space Y origin of vertex 0. */
add (8) g6<1>F g6<8,8,1>F -g1.4<0,1,0>F { align1 };
add (8) g7<1>F g7<8,8,1>F -g1.4<0,1,0>F { align1 };
    /* scale by texture Y increment */
mul (8) g6<1>F g6<8,8,1>F g3.20<0,1,0>F { align1 };
mul (8) g7<1>F g7<8,8,1>F g3.20<0,1,0>F { align1 };
    /* add in texture Y offset */
add (8) g6<1>F g6<8,8,1>F g3.28<0,1,0>F { align1 };
add (8) g7<1>F g7<8,8,1>F g3.28<0,1,0>F { align1 };
    /* sampler  */
mov (8) m1<1>F g4<8,8,1>F { align1 };
mov (8) m2<1>F g5<8,8,1>F { align1 };
mov (8) m3<1>F g6<8,8,1>F { align1 };
mov (8) m4<1>F g7<8,8,1>F { align1 };

    /*
     * g0 holds the PS thread payload, which (oddly) contains
     * precisely what the sampler wants to see in m0
     */
send  (16) 0 g12<1>UW g0<8,8,1>UW sampler (1,0,F) mlen 5 rlen 8 { align1 };
mov (8) g19<1>UW g19<8,8,1>UW { align1 };

    /* color space conversion function:
     * R = Clamp ( 1.164(Y-16/255) + 1.596(Cr-128/255), 0, 1)
     * G = Clamp ( 1.164(Y-16/255) - 0.813(Cr-128/255) - 0.392(Cb-128/255), 0, 1)
     * B = Clamp ( 1.164(Y-16/255) + 2.017(Cb-128/255), 0, 1)
     *
     * Y is g14, g15.
     * Cr is g12, g13.
     * Cb is g16, g17.
     *
     * R is g2, g6.
     * G is g3, g7.
     * B is g4, g8.
     */
	/* Y = Y - 16/255 */
add (8) g14<1>F g14<8,8,1>F -0.0627451F { align1 };
	/* Cr = Cr - 128/255 */
add (8) g12<1>F g12<8,8,1>F -0.501961F { align1 };
	/* Cb = Cb - 128 / 255 */
add (8) g16<1>F g16<8,8,1>F -0.501961F { align1 };
	/* Y = Y * 1.164 */
mul (8) g14<1>F g14<8,8,1>F 1.164F { align1 };
	/* acc = 1.596 * Cr */
mul (8) null g12<8,8,1>F 1.596F { align1 };
	/* R = acc + Y */
mac.sat (8) m2<1>F g14<8,8,1>F 1F { align1  };
	/* acc = Cr * -0.813 */
mul (8) null g12<8,8,1>F -0.813F { align1 };
	/* acc += Cb * -0.392 */
mac (8) null g16<8,8,1>F -0.392F { align1 };
	/* G = acc + Y */
mac.sat (8) m3<1>F g14<8,8,1>F 1F { align1  };
	/* acc = Cb * 2.017 */
mul (8) null g16<8,8,1>F 2.017F { align1 };
	/* B = acc + Y */
mac.sat (8) m4<1>F g14<8,8,1>F 1F { align1  };
 /* and do it again */
add (8) g15<1>F g15<8,8,1>F -0.0627451F { align1 };
add (8) g13<1>F g13<8,8,1>F -0.501961F { align1 };
add (8) g17<1>F g17<8,8,1>F -0.501961F { align1 };
mul (8) g15<1>F g15<8,8,1>F 1.164F { align1 };
mul (8) null g13<8,8,1>F 1.596F { align1 };
mac.sat (8) m6<1>F g15<8,8,1>F 1F { align1  };
mul (8) null g13<8,8,1>F -0.813F { align1 };
mac (8) null g17<8,8,1>F -0.392F { align1 };
mac.sat (8) m7<1>F g15<8,8,1>F 1F { align1  };
mul (8) null g17<8,8,1>F 2.017F { align1 };
mac.sat (8) m8<1>F g15<8,8,1>F 1F { align1  };

   /* Pass through control information:
    */
mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable };
   /* Send framebuffer write message: XXX: acc0? */
send (16) 0 null g0<8,8,1>UW write (
	0, /* binding table index 0 */
	8, /* pixel scoreboard clear */
	4, /* render target write */
	0 /* no write commit message */
	) mlen 10 rlen 0 { align1 EOT };
   /* padding */
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;