190 lines
7.2 KiB
Plaintext
190 lines
7.2 KiB
Plaintext
/*
|
|
* Copyright © 2006 Intel Corporation
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the next
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
* Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
* IN THE SOFTWARE.
|
|
*
|
|
* Authors:
|
|
* Keith Packard <keithp@keithp.com>
|
|
* Eric Anholt <eric@anholt.net>
|
|
*
|
|
*/
|
|
|
|
/* 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 acc0<1>UW 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;
|