i965_drv_video: new shaders for VME on Ivybridge
[platform/upstream/libva.git] / i965_drv_video / shaders / vme / inter_frame.asm
1 /*
2  * Copyright © <2010>, Intel Corporation.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
6  * http://www.opensource.org/licenses/eclipse-1.0.php.
7  *
8  */
9 // Modual name: IntraFrame.asm
10 //
11 // Make intra predition estimation for Intra frame
12 //
13
14 //
15 //  Now, begin source code....
16 //
17
18 /*
19  * __START
20  */
21 __INTER_START:
22 mov  (16) tmp_reg0.0<1>:UD      0x0:UD {align1};
23 mov  (16) tmp_reg2.0<1>:UD      0x0:UD {align1};
24
25 /*
26  * VME message
27  */
28 /* m0 */        
29 mul  (2) tmp_reg0.8<1>:UW       orig_xy_ub<2,2,1>:UB 16:UW {align1};    /* Source =  (x, y) * 16 */
30 mul  (2) tmp_reg0.0<1>:UW       orig_xy_ub<2,2,1>:UB 16:UW {align1};    
31 add  (2) tmp_reg0.0<1>:W                tmp_reg0.0<2,2,1>:W -8:W {align1};              /* Reference = (x-8,y-8)-(x+24,y+24) */
32 mov  (1) tmp_reg0.12<1>:UD      INTER_PART_MASK + INTER_SAD_HAAR + SUB_PEL_MODE_QUARTER:UD {align1};    /* 16x16 Source, 1/4 pixel, harr */
33
34 mov  (1) tmp_reg0.20<1>:UB      thread_id_ub {align1};                  /* dispatch id */
35 mov  (1) tmp_reg0.22<1>:UW      REF_REGION_SIZE {align1};               /* Reference Width&Height, 32x32 */
36 mov  (8) vme_msg_0.0<1>:UD      tmp_reg0.0<8,8,1>:UD {align1};
37         
38 /* m1 */
39 mov  (1) tmp_reg1.4<1>:UD       MAX_NUM_MV:UD {align1};                                   /* Default value MAX 32 MVs */
40 mov  (1) tmp_reg1.8<1>:UD               SEARCH_PATH_LEN:UD {align1};
41
42 mov  (8) vme_msg_1<1>:UD        tmp_reg1.0<8,8,1>:UD {align1};
43         
44 /* m2 */        
45 mov  (8) vme_msg_2<1>:UD        0x0:UD {align1};
46
47 /* m3 */        
48 mov  (8) vme_msg_3<1>:UD        0x0:UD {align1};
49
50 /* m4 */        
51 mov  (8) vme_msg_4<1>:UD        0x0:UD {align1};
52
53 send (8)
54         vme_msg_ind
55         vme_wb
56         null
57         vme(
58                 BIND_IDX_VME,
59                 0,
60                 0,
61                 VME_MESSAGE_TYPE_INTER
62         )
63         mlen vme_msg_length
64         rlen 4
65         {align1};
66         
67 /*
68  * Oword Block Write message
69  */
70 mul  (1) tmp_reg3.8<1>:UD       w_in_mb_uw<0,1,0>:UW orig_y_ub<0,1,0>:UB {align1};
71 add  (1) tmp_reg3.8<1>:UD       tmp_reg3.8<0,1,0>:UD orig_x_ub<0,1,0>:UB {align1};
72 mul  (1) tmp_reg3.8<1>:UD       tmp_reg3.8<0,1,0>:UD 0x4:UD {align1};
73 mov  (1) tmp_reg3.20<1>:UB      thread_id_ub {align1};                  /* dispatch id */
74 mov  (8) msg_reg0.0<1>:UD       tmp_reg3.0<8,8,1>:UD {align1};
75
76 mov  (2) tmp_reg3.0<1>:UW       vme_wb1.0<2,2,1>:UB  {align1};
77 add  (2) tmp_reg3.0<1>:W                tmp_reg3.0<16,16,1>:W -32:W {align1}; 
78         
79 mov  (8) msg_reg1.0<1>:UD       tmp_reg3.0<8,8,0>:UD   {align1};
80
81 mov  (8) msg_reg2.0<1>:UD       tmp_reg3.0<8,8,0>:UD   {align1};
82
83 /* bind index 3, write 4 oword, msg type: 8(OWord Block Write) */
84 send (16)
85         msg_ind
86         obw_wb
87         null
88         data_port(
89                 OBW_CACHE_TYPE,
90                 OBW_MESSAGE_TYPE,
91                 OBW_CONTROL_3,
92                 OBW_BIND_IDX,
93                 OBW_WRITE_COMMIT_CATEGORY,
94                 OBW_HEADER_PRESENT
95         )
96         mlen 3
97         rlen obw_wb_length
98         {align1};
99         
100 /*
101  * kill thread
102  */        
103 mov  (8) msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
104 send (16) msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};