OSDN Git Service

i965_drv_video: add support for H264 on Clarkdale/Arrandale
[android-x86/hardware-intel-common-libva.git] / i965_drv_video / shaders / h264 / ildb / saveNV12_16x4T.asm
1 /*\r
2  * Copyright © <2010>, Intel Corporation.\r
3  *\r
4  * This program is licensed under the terms and conditions of the\r
5  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at\r
6  * http://www.opensource.org/licenses/eclipse-1.0.php.\r
7  *\r
8  */\r
9 // Module name: saveNV12_16x4T.asm\r
10 //\r
11 // Transpose 16x4 to 4x16 YNV12 data and write to memory \r
12 //\r
13 //----------------------------------------------------------------\r
14 //  Symbols need to be defined before including this module\r
15 //\r
16 //      Left MB region:\r
17 //      PREV_MB_YB:             Base=rxx        ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
18 //      PREV_MB_UW:     Base=ryy        ElementSize=2 SrcRegion=REGION(8,1) Type=uw\r
19 \r
20 //      Binding table index: \r
21 //      BI_SRC_Y:               Binding table index of Y surface\r
22 //      BI_SRC_UV:              Binding table index of UV surface (NV12)\r
23 //\r
24 //      Temp buffer:\r
25 //      BUF_B:                  BUF_B Base=rxx ElementSize=1 SrcRegion=REGION(16,1) Type=ub\r
26 //      BUF_W:                  BUF_W Base=rxx ElementSize=1 SrcRegion=REGION(8,1) Type=uw\r
27 //\r
28 //\r
29 #if defined(_DEBUG) \r
30         mov             (1)             EntrySignatureC:w                       0xDDD6:w\r
31 #endif\r
32 \r
33     mov (2)     MSGSRC.0<1>:ud  ORIX_LEFT<2;2,1>:w              // Block origin\r
34     mov (1)     MSGSRC.2<1>:ud  0x000F0003:ud                   // 4x16\r
35     \r
36 // Transpose Y, save them to MRFs\r
37 \r
38 //      16x4 Y src in GRF (each pix is specified as yx)\r
39 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
40 //      |f1 e1 d1 c1 b1 a1 91 81 71 61 51 41 31 21 11 01 f0 e0 d0 c0 b0 a0 90 80 70 60 50 40 30 20 10 00|\r
41 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
42 //      |f3 e3 d3 c3 b3 a3 93 83 73 63 53 43 33 23 13 03 f2 e2 d2 c2 b2 a2 92 82 72 62 52 42 32 22 12 02|\r
43 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
44 //\r
45 //  First step          (16)    <1>     <=== <16;4,1>\r
46 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
47 //      |73 63 53 43 72 62 52 42 71 61 51 41 70 60 50 40 33 23 13 03 32 22 12 02 31 21 11 01 30 20 10 00|\r
48 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
49 //      |f3 e3 d3 c3 f2 e2 d2 c2 f1 e1 d1 c1 f0 e0 d0 c0 b3 a3 93 83 b2 a2 92 82 b1 a1 91 81 b0 a0 90 80|\r
50 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
51 \r
52         // The first step\r
53         mov (16)        BUF_B(0,0)<1>                   PREV_MB_YB(0,0)<16;4,1>\r
54         mov (16)        BUF_B(0,16)<1>                  PREV_MB_YB(0,4)<16;4,1>\r
55         mov (16)        BUF_B(1,0)<1>                   PREV_MB_YB(0,8)<16;4,1>\r
56         mov (16)        BUF_B(1,16)<1>                  PREV_MB_YB(0,12)<16;4,1>\r
57 \r
58 //\r
59 //  Second step         (16)    <1>     <=== <1;4,4>\r
60 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
61 //      |73 72 71 70 63 62 61 60 53 52 51 50 43 42 41 40 33 32 31 30 23 22 21 20 13 12 11 10 03 02 01 00|\r
62 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
63 //      |f3 f2 f1 f0 e3 e2 e1 e0 d3 d2 d1 d0 c3 c2 c1 c0 b3 b2 b1 b0 a3 a2 a1 a0 93 92 91 90 83 82 81 80|\r
64 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
65 //\r
66         // The second step\r
67 //      mov     (16)    MSGPAYLOADB(0,0)<1>             BUF_B(0,0)<32;8,4>                      // Read 2 rows, write 1 row\r
68 //      mov (16)        MSGPAYLOADB(0,16)<1>    BUF_B(0,1)<32;8,4>\r
69 //      mov (16)        MSGPAYLOADB(1,0)<1>             BUF_B(0,2)<32;8,4>\r
70 //      mov (16)        MSGPAYLOADB(1,16)<1>    BUF_B(0,3)<32;8,4>\r
71 \r
72         mov     (16)    MSGPAYLOADB(0,0)<1>             BUF_B(0,0)<1;4,4>\r
73         mov (16)        MSGPAYLOADB(0,16)<1>    BUF_B(0,16)<1;4,4>\r
74         mov (16)        MSGPAYLOADB(1,0)<1>             BUF_B(1,0)<1;4,4>\r
75         mov (16)        MSGPAYLOADB(1,16)<1>    BUF_B(1,16)<1;4,4>\r
76 \r
77 //  Transposed Y in 4x16 is ready for writting to dataport.\r
78 //\r
79     send (8)    NULLREG MSGHDR  MSGSRC<8;8,1>:ud        DAPWRITE        MSG_LEN(2)+DWBWMSGDSC+BI_DEST_Y                         // Write 2 GRFs\r
80 \r
81 \r
82 \r
83 /////////////////////////////////////////////////////////////////////////////////////////////////////\r
84 \r
85         // Transpose U/V, save them to MRFs in NV12 format\r
86     asr (1)     MSGSRC.1:ud             MSGSRC.1:ud                     1:w                                             // NV12 U+V block origin y = half of Y comp\r
87     mov (1)     MSGSRC.2<1>:ud  0x00070003:ud                                                           // NV12 U+V block width and height (4x8)\r
88 \r
89 \r
90 //      16x2 UV src in GRF (each pix is specified as yx)\r
91 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
92 //      |71 71 61 61 51 51 41 41 31 31 21 21 11 11 01 01 70 70 60 60 50 50 40 40 30 30 20 20 10 10 00 00|\r
93 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
94 //\r
95 //      First step              (8)             <1>     <=== <8;4,1>:w\r
96 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
97 //      |71 71 61 61 51 51 41 41 70 70 60 60 50 50 40 40 31 31 21 21 11 11 01 01 30 30 20 20 10 10 00 00|\r
98 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
99         mov (8) BUF_W(0,0)<1>           PREV_MB_UW(0,0)<8;4,1>\r
100         mov (8) BUF_W(0,8)<1>           PREV_MB_UW(0,4)<8;4,1>\r
101 \r
102 //      Second step             (8)             <1>     <=== <1;2,4>\r
103 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
104 //      |71 71 70 70 61 61 60 60 51 51 50 50 41 41 40 40 31 31 30 30 21 21 20 20 11 11 10 10 01 01 00 00|\r
105 //      +-----------------------+-----------------------+-----------------------+-----------------------+\r
106         mov (8) MSGPAYLOADW(0,0)<1>             BUF_W(0,0)<1;2,4>\r
107         mov (8) MSGPAYLOADW(0,8)<1>             BUF_W(0,8)<1;2,4>\r
108 \r
109 //  Transposed U+V in NV12 in 4x8 is ready for writting to dataport.\r
110  \r
111     send (8)    NULLREG MSGHDR  MSGSRC<8;8,1>:ud        DAPWRITE        MSG_LEN(1)+DWBWMSGDSC+BI_DEST_UV                // Write 1 GRF\r
112     \r
113 \r