1/* The initial payload of the thread is always g0. 2 * WM_URB (incoming URB entries) is g3 3 * X0_R is g4 4 * X1_R is g5 5 * Y0_R is g6 6 * Y1_R is g7 7 */ 8 9 /* Set up the X/Y screen coordinates of the pixels in our 4 subspans. Each 10 * subspan is a 2x2 rectangle, and the screen x/y of the upper left of each 11 * subspan are given in GRF register 1.2 through 1.5 (which, with the word 12 * addressing below, are 1.4 through 1.11). 13 * 14 * The result is WM_X*_R and WM_Y*R being: 15 * 16 * X0: {ss0.x, ss0.x+1, ss0.x, ss0.x+1, ss1.x, ss1.x+1, ss1.x, ss1.x+y} 17 * Y0: {ss0.y, ss0.y, ss0.y+1, ss0.y+1, ss1.y, ss1.y, ss1.y+1, ss1.y+1} 18 * X1: {ss2.x, ss2.x+1, ss2.x, ss2.x+1, ss3.x, ss3.x+1, ss3.x, ss3.x+y} 19 * Y1: {ss2.y, ss2.y, ss2.y+1, ss2.y+1, ss3.y, ss3.y, ss3.y+1, ss3.y+1} 20 */ 21 22 /* Set up ss0.x coordinates*/ 23mov (1) g4<1>F g1.8<0,1,0>UW { align1 }; 24add (1) g4.4<1>F g1.8<0,1,0>UW 1UB { align1 }; 25mov (1) g4.8<1>F g1.8<0,1,0>UW { align1 }; 26add (1) g4.12<1>F g1.8<0,1,0>UW 1UB { align1 }; 27 /* Set up ss0.y coordinates */ 28mov (1) g6<1>F g1.10<0,1,0>UW { align1 }; 29mov (1) g6.4<1>F g1.10<0,1,0>UW { align1 }; 30add (1) g6.8<1>F g1.10<0,1,0>UW 1UB { align1 }; 31add (1) g6.12<1>F g1.10<0,1,0>UW 1UB { align1 }; 32 /* set up ss1.x coordinates */ 33mov (1) g4.16<1>F g1.12<0,1,0>UW { align1 }; 34add (1) g4.20<1>F g1.12<0,1,0>UW 1UB { align1 }; 35mov (1) g4.24<1>F g1.12<0,1,0>UW { align1 }; 36add (1) g4.28<1>F g1.12<0,1,0>UW 1UB { align1 }; 37 /* set up ss1.y coordinates */ 38mov (1) g6.16<1>F g1.14<0,1,0>UW { align1 }; 39mov (1) g6.20<1>F g1.14<0,1,0>UW { align1 }; 40add (1) g6.24<1>F g1.14<0,1,0>UW 1UB { align1 }; 41add (1) g6.28<1>F g1.14<0,1,0>UW 1UB { align1 }; 42 /* Set up ss2.x coordinates */ 43mov (1) g5<1>F g1.16<0,1,0>UW { align1 }; 44add (1) g5.4<1>F g1.16<0,1,0>UW 1UB { align1 }; 45mov (1) g5.8<1>F g1.16<0,1,0>UW { align1 }; 46add (1) g5.12<1>F g1.16<0,1,0>UW 1UB { align1 }; 47 /* Set up ss2.y coordinates */ 48mov (1) g7<1>F g1.18<0,1,0>UW { align1 }; 49mov (1) g7.4<1>F g1.18<0,1,0>UW { align1 }; 50add (1) g7.8<1>F g1.18<0,1,0>UW 1UB { align1 }; 51add (1) g7.12<1>F g1.18<0,1,0>UW 1UB { align1 }; 52 /* Set up ss3.x coordinates */ 53mov (1) g5.16<1>F g1.20<0,1,0>UW { align1 }; 54add (1) g5.20<1>F g1.20<0,1,0>UW 1UB { align1 }; 55mov (1) g5.24<1>F g1.20<0,1,0>UW { align1 }; 56add (1) g5.28<1>F g1.20<0,1,0>UW 1UB { align1 }; 57 /* Set up ss3.y coordinates */ 58mov (1) g7.16<1>F g1.22<0,1,0>UW { align1 }; 59mov (1) g7.20<1>F g1.22<0,1,0>UW { align1 }; 60add (1) g7.24<1>F g1.22<0,1,0>UW 1UB { align1 }; 61add (1) g7.28<1>F g1.22<0,1,0>UW 1UB { align1 }; 62 63 /* Now, map these screen space coordinates into texture coordinates. */ 64 /* subtract screen-space X origin of vertex 0. */ 65add (8) g4<1>F g4<8,8,1>F -g1<0,1,0>F { align1 }; 66add (8) g5<1>F g5<8,8,1>F -g1<0,1,0>F { align1 }; 67 /* scale by texture X increment */ 68mul (8) g4<1>F g4<8,8,1>F g3<0,1,0>F { align1 }; 69mul (8) g5<1>F g5<8,8,1>F g3<0,1,0>F { align1 }; 70 /* add in texture X offset */ 71add (8) g4<1>F g4<8,8,1>F g3.12<0,1,0>F { align1 }; 72add (8) g5<1>F g5<8,8,1>F g3.12<0,1,0>F { align1 }; 73 /* subtract screen-space Y origin of vertex 0. */ 74add (8) g6<1>F g6<8,8,1>F -g1.4<0,1,0>F { align1 }; 75add (8) g7<1>F g7<8,8,1>F -g1.4<0,1,0>F { align1 }; 76 /* scale by texture Y increment */ 77mul (8) g6<1>F g6<8,8,1>F g3.20<0,1,0>F { align1 }; 78mul (8) g7<1>F g7<8,8,1>F g3.20<0,1,0>F { align1 }; 79 /* add in texture Y offset */ 80add (8) g6<1>F g6<8,8,1>F g3.28<0,1,0>F { align1 }; 81add (8) g7<1>F g7<8,8,1>F g3.28<0,1,0>F { align1 }; 82 /* sampler */ 83mov (8) m1<1>F g4<8,8,1>F { align1 }; 84mov (8) m2<1>F g5<8,8,1>F { align1 }; 85mov (8) m3<1>F g6<8,8,1>F { align1 }; 86mov (8) m4<1>F g7<8,8,1>F { align1 }; 87 88 /* 89 * g0 holds the PS thread payload, which (oddly) contains 90 * precisely what the sampler wants to see in m0 91 */ 92send (16) 0 g12<1>UW g0<8,8,1>UW sampler (1,0,F) mlen 5 rlen 8 { align1 }; 93mov (8) g19<1>UW g19<8,8,1>UW { align1 }; 94 95 /* color space conversion function: 96 * R = Clamp ( 1.164(Y-16/255) + 1.596(Cr-128/255), 0, 1) 97 * G = Clamp ( 1.164(Y-16/255) - 0.813(Cr-128/255) - 0.392(Cb-128/255), 0, 1) 98 * B = Clamp ( 1.164(Y-16/255) + 2.017(Cb-128/255), 0, 1) 99 * 100 * Y is g14, g15. 101 * Cr is g12, g13. 102 * Cb is g16, g17. 103 * 104 * R is g2, g6. 105 * G is g3, g7. 106 * B is g4, g8. 107 */ 108 /* Y = Y - 16/255 */ 109add (8) g14<1>F g14<8,8,1>F -0.0627451F { align1 }; 110 /* Cr = Cr - 128/255 */ 111add (8) g12<1>F g12<8,8,1>F -0.501961F { align1 }; 112 /* Cb = Cb - 128 / 255 */ 113add (8) g16<1>F g16<8,8,1>F -0.501961F { align1 }; 114 /* Y = Y * 1.164 */ 115mul (8) g14<1>F g14<8,8,1>F 1.164F { align1 }; 116 /* acc = 1.596 * Cr */ 117mul (8) null g12<8,8,1>F 1.596F { align1 }; 118 /* R = acc + Y */ 119mac.sat (8) m2<1>F g14<8,8,1>F 1F { align1 }; 120 /* acc = Cr * -0.813 */ 121mul (8) null g12<8,8,1>F -0.813F { align1 }; 122 /* acc += Cb * -0.392 */ 123mac (8) null g16<8,8,1>F -0.392F { align1 }; 124 /* G = acc + Y */ 125mac.sat (8) m3<1>F g14<8,8,1>F 1F { align1 }; 126 /* acc = Cb * 2.017 */ 127mul (8) null g16<8,8,1>F 2.017F { align1 }; 128 /* B = acc + Y */ 129mac.sat (8) m4<1>F g14<8,8,1>F 1F { align1 }; 130 /* and do it again */ 131add (8) g15<1>F g15<8,8,1>F -0.0627451F { align1 }; 132add (8) g13<1>F g13<8,8,1>F -0.501961F { align1 }; 133add (8) g17<1>F g17<8,8,1>F -0.501961F { align1 }; 134mul (8) g15<1>F g15<8,8,1>F 1.164F { align1 }; 135mul (8) null g13<8,8,1>F 1.596F { align1 }; 136mac.sat (8) m6<1>F g15<8,8,1>F 1F { align1 }; 137mul (8) null g13<8,8,1>F -0.813F { align1 }; 138mac (8) null g17<8,8,1>F -0.392F { align1 }; 139mac.sat (8) m7<1>F g15<8,8,1>F 1F { align1 }; 140mul (8) null g17<8,8,1>F 2.017F { align1 }; 141mac.sat (8) m8<1>F g15<8,8,1>F 1F { align1 }; 142 143 /* Pass through control information: 144 */ 145mov (8) m1<1>UD g1<8,8,1>UD { align1 mask_disable }; 146 /* Send framebuffer write message: XXX: acc0? */ 147send (16) 0 null g0<8,8,1>UW write ( 148 0, /* binding table index 0 */ 149 8, /* pixel scoreboard clear */ 150 4, /* render target write */ 151 0 /* no write commit message */ 152 ) mlen 10 rlen 0 { align1 EOT }; 153 /* padding */ 154nop; 155nop; 156nop; 157nop; 158nop; 159nop; 160nop; 161nop; 162