8e1ed51333c14adcce0a515ae44545278e4fe844
[profile/ivi/vaapi-intel-driver.git] / src / shaders / vme / batchbuffer.asm
1 /*
2  * Copyright © 2012 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Xiang Haihao <haihao.xiang@intel.com>
25  */
26         
27 /*
28  * __START
29  */
30 __INTER_START:
31         and.z.f0.1      (1)     remainder_cmds<1>:uw            total_mbs<0,1,0>:uw     0x0003:uw {align1};
32         and.z.f0.0      (1)     total_mbs<1>:uw                 total_mbs<0,1,0>:uw     0xfffc:uw {align1};
33
34         mov             (16)    tmp_reg0<1>:ud                  0x0:ud {align1} ;
35
36         mov             (8)     media_object_ud<1>:ud           0x0:ud {align1} ;
37         mov             (1)     media_object0_ud<1>:ud          CMD_MEDIA_OBJECT {align1} ;
38         mov             (1)     media_object1_ud<1>:ud          mtype_ub<0,1,0>ub {align1};
39         mov             (1)     media_object6_width<1>:uw       width_in_mb<0,1,0>:uw {align1};
40         mov             (1)     media_object7_ud<1>:ud          transform_8x8_ub<0,1,0>ub {align1};
41
42         mul             (1)     tmp_reg0.8<1>:ud                width_in_mb<0,1,0>:uw   mb_y<0,1,0>:ub {align1};
43         add             (1)     tmp_reg0.8<1>:ud                tmp_reg0.8<0,1,0>:ud    mb_x<0,1,0>:ub {align1};
44         mul             (1)     tmp_reg0.8<1>:ud                tmp_reg0.8<0,1,0>:ud    0x2:ud {align1} ;
45         mov             (1)     tmp_reg0.20<1>:ub               thread_id_ub {align1};                  /* dispatch id */
46         
47         (f0.0)jmpi      (1)     __REMAINDER ;
48
49 __CMD_LOOP:
50         mov             (8)     msg_reg0.0<1>:ud                tmp_reg0<8,8,1>:ud {align1};
51         add             (1)     tmp_reg0.8<1>:ud                tmp_reg0.8<0,1,0>:ud       8:uw {align1} ;
52         
53         mov             (1)     media_object6_xy<1>:uw          mb_xy<1>:uw {align1} ;
54         mov             (8)     msg_reg1<1>:ud                  media_object_ud<8,8,1>:ud {align1};
55         add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub          1:uw {align1};
56         cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw   mb_x<0,1,0>:ub {align1};
57         (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
58         (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub          1:uw {align1} ;
59         
60         mov             (1)     media_object6_xy<1>:uw          mb_xy<1>:uw {align1} ;
61         mov             (8)     msg_reg2<1>:ud                  media_object_ud<8,8,1>:ud {align1};
62         add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub          1:uw {align1};
63         cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw   mb_x<0,1,0>:ub {align1};
64         (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
65         (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub          1:uw {align1} ;
66         
67         mov             (1)     media_object6_xy<1>:uw          mb_xy<1>:uw {align1} ;
68         mov             (8)     msg_reg3<1>:ud                  media_object_ud<8,8,1>:ud {align1};
69         add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub          1:uw {align1};
70         cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw   mb_x<0,1,0>:ub {align1};
71         (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
72         (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub          1:uw {align1} ;
73         
74         mov             (1)     media_object6_xy<1>:uw          mb_xy<1>:uw {align1} ;
75         mov             (8)     msg_reg4<1>:ud                  media_object_ud<8,8,1>:ud {align1};
76         add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub          1:uw {align1};
77         cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw   mb_x<0,1,0>:ub {align1};
78         (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
79         (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub          1:uw {align1} ;
80         
81 /* bind index 5, write 8 oword, msg type: 8(OWord Block Write) */
82 send (16)
83         msg_ind
84         obw_wb
85         null
86         data_port(
87                 OBW_CACHE_TYPE,
88                 OBW_MESSAGE_TYPE,
89                 OBW_CONTROL_4,
90                 OBW_BIND_IDX,
91                 OBW_WRITE_COMMIT_CATEGORY,
92                 OBW_HEADER_PRESENT
93         )
94         mlen 5
95         rlen obw_wb_length
96         {align1};
97         
98         
99         add.z.f0.0      (1)     total_mbs<1>:w                  total_mbs<0,1,0>:w      -4:w {align1};
100         (-f0.0)jmpi     (1)     __CMD_LOOP ;
101         
102 __REMAINDER:
103         (f0.1)jmpi      (1)     __DONE ;        
104
105 __REMAINDER_LOOP:
106         mov             (8)     msg_reg0.0<1>:ud                tmp_reg0<8,8,1>:ud {align1} ;
107         add             (1)     tmp_reg0.8<1>:ud                tmp_reg0.8<0,1,0>:ud    2:uw {align1} ;
108         
109         mov             (1)     media_object6_xy<1>:uw          mb_xy<1>:uw {align1} ;
110         mov             (8)     msg_reg1<1>:ud                  media_object_ud<8,8,1>:ud {align1};
111         add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub          1:uw {align1};
112         cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw   mb_x<0,1,0>:ub {align1};
113         (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
114         (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub          1:uw {align1} ;
115
116 /* bind index 5, write 2 oword, msg type: 8(OWord Block Write) */
117 send (16)
118         msg_ind
119         obw_wb
120         null
121         data_port(
122                 OBW_CACHE_TYPE,
123                 OBW_MESSAGE_TYPE,
124                 OBW_CONTROL_2,
125                 OBW_BIND_IDX,
126                 OBW_WRITE_COMMIT_CATEGORY,
127                 OBW_HEADER_PRESENT
128         )
129         mlen 2
130         rlen obw_wb_length
131         {align1};
132         
133         add.z.f0.1      (1)     remainder_cmds<1>:w             remainder_cmds<0,1,0>:w -1:w;
134         (-f0.1)jmpi     (1)     __REMAINDER_LOOP                               ;
135         
136 __DONE:
137
138         cmp.e.f0.0      (1)     null<1>:uw                      last_object<0,1,0>:uw   1:uw {align1};
139         (-f0.0)jmpi     (1)     __EXIT ;
140         
141 /* bind index 5, write 1 oword, msg type: 8(OWord Block Write) */
142         mov             (8)     msg_reg0.0<1>:ud                tmp_reg0<8,8,1>:ud {align1} ;
143         mov             (4)     msg_reg1.0<1>:ud                0x0:ud {align1} ;
144         mov             (1)     msg_reg1.4<1>:ud                MI_BATCH_BUFFER_END {align1} ;
145         
146 send (16)
147         msg_ind
148         obw_wb
149         null
150         data_port(
151                 OBW_CACHE_TYPE,
152                 OBW_MESSAGE_TYPE,
153                 OBW_CONTROL_0,
154                 OBW_BIND_IDX,
155                 OBW_WRITE_COMMIT_CATEGORY,
156                 OBW_HEADER_PRESENT
157         )
158         mlen 2
159         rlen obw_wb_length
160         {align1};
161
162 __EXIT:
163         mov             (8)     msg_reg0<1>:ud                  r0<8,8,1>:ud {align1} ;
164         send            (16)    msg_ind acc0<1>ud null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT} ;