Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5361 serge 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 
25
 */
26
 
27
__PAK_OBJECT:
28
        mul             (1)     tmp_offset.0<1>:ud              width_in_mb<0,1,0>:uw           mb_y<0,1,0>:ub {align1};
29
        add             (1)     tmp_offset.0<1>:ud              tmp_offset.0<0,1,0>:ud          mb_x<0,1,0>:ub {align1};
30
        /*
31
         * The layout of VME output
32
         * ++++++++++++++++++++++++++++++++++++++++++++++
33
         * |    MV(128bytes)  |   other info (32bytes)  |
34
         * ++++++++++++++++++++++++++++++++++++++++++++++
35
         */
36
        mul             (1)     tmp_vme_output.8<1>:ud          tmp_offset.0<0,1,0>:ud          INTER_VME_OUTPUT_IN_OWS:ud {align1} ;   /* point to output buffer */
37
        add             (1)     tmp_vme_output.8<1>:ud          tmp_vme_output.8<0,1,0>:ud      INTER_VME_OUTPUT_MV_IN_OWS:uw {align1}; /* point to other info */
38
 
39
__PAK_OBJECT_LOOP:
40
        /*
41
         * Read other info
42
         */
43
        mov             (8)     msg_reg0.0<1>:ud                tmp_vme_output<8,8,1>:ud {align1} ;
44
 
45
send (16)
46
        msg_ind
47
        ob_read_wb
48
        null
49
        data_port(
50
                OB_CACHE_TYPE,
51
                OB_READ,
52
                OB_CONTROL_2,
53
                BIND_IDX_VME_OUTPUT,
54
                OB_WRITE_COMMIT_CATEGORY,
55
                OB_HEADER_PRESENT
56
        )
57
        mlen 1
58
        rlen ob_read_wb_len_vme_inter
59
        {align1};
60
 
61
 
62
        /*
63
         * Fill the command
64
         */
65
        mov             (16)    pak_object_ud<1>:ud             0x0:ud {align1} ;
66
 
67
        and.z.f0.1      (1)     null<1>:uw                      flags<0,1,0>:uw                 FLAG_MASK_LAST_OBJECT {align1};
68
 
69
        and.z.f0.0      (1)     null<1>:ud                      ob_read_wb0.0<0,1,0>:ud         INTRAMBFLAG_MASK:ud {align1} ;
70
 
71
        (-f0.0)jmpi     (1)     __FILL_INTRA_PAK_COMMAND ;
72
 
73
__FILL_INTER_PAK_COMMAND:
74
        /* DW0 */
75
        mov             (1)     pak_object0_ud<1>:ud            MFC_AVC_PAK_OBJECT_INTER_DW0 ;
76
 
77
        /* DW2 */
78
        mul             (1)     pak_object2_ud<1>:ud            tmp_offset.0<0,1,0>:ud          INTER_VME_OUTPUT_IN_BYTES:ud {align1} ;
79
 
80
        /* DW5 */
81
        mov             (1)     pak_object5_ud<1>:ud            MFC_AVC_PAK_OBJECT_INTRA_DW5 ;
82
 
83
        /* DW1 must be 32 for 8 MVs and 128 for 32 MVs !!! */
84
        mov             (1)     pak_object1_ud<1>:ud            ob_read_wb0.8<0,1,0>:ud {align1} ;
85
 
86
        /* DW3 */
87
        mov             (1)     pak_object3_ud<1>:ud            ob_read_wb0.0<0,1,0>:ud {align1} ;
88
 
89
        /* DW4 */
90
        add             (1)     pak_object4_ud<1>:ud            mb_xy<0,1,0>:uw                 MFC_AVC_PAK_OBJECT_INTER_DW4 {align1} ;
91
        add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub                  1:uw {align1};
92
        cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw           mb_x<0,1,0>:ub {align1};
93
        (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
94
        (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub                  1:uw {align1} ;
95
 
96
        /* DW6 */
97
        mov             (1)     pak_object6_ud<1>:ud            0x0:ud {align1} ;
98
        (-f0.1)mov      (1)     pak_object6_ud<1>:ud            MFC_AVC_PAK_OBJECT_INTER_DW6 {align1} ;
99
        cmp.e.f0.0      (1)     null<1>:uw                      total_mbs<0,1,0>:uw             1:uw {align1};
100
        (-f0.0)mov      (1)     pak_object6_ud<1>:ud            0x0:ud {align1} ;
101
        add             (1)     pak_object6_ud<1>:ud            pak_object6_ud<0,1,0>:ud        qp<0,1,0>:ub {align1} ;
102
 
103
        /* DW7 */
104
        mov             (1)     pak_object7_ud<1>:ud            ob_read_wb0.4<0,1,0>:ud {align1} ;
105
 
106
        /* DW8 */
107
        mov             (1)     pak_object8_ud<1>:ud            ref_idx0<0,1,0>:ud {align1} ;
108
 
109
        /* DW9 */
110
        mov             (1)     pak_object9_ud<1>:ud            ref_idx1<0,1,0>:ud {align1} ;
111
 
112
        jmpi            (1)     __OUTPUT_PAK_COMMAND ;
113
 
114
__FILL_INTRA_PAK_COMMAND:
115
        /* DW0 */
116
        mov             (1)     pak_object0_ud<1>:ud            MFC_AVC_PAK_OBJECT_INTRA_DW0 ;
117
 
118
        /* DW5 */
119
        mov             (1)     pak_object5_ud<1>:ud            MFC_AVC_PAK_OBJECT_INTRA_DW5 ;
120
 
121
        /* DW4 */
122
        add             (1)     pak_object4_ud<1>:ud            mb_xy<0,1,0>:uw                 MFC_AVC_PAK_OBJECT_INTRA_DW4 {align1} ;
123
        add             (1)     mb_x<1>:ub                      mb_x<0,1,0>:ub                  1:uw {align1};
124
        cmp.e.f0.0      (1)     null<1>:uw                      width_in_mb<0,1,0>:uw           mb_x<0,1,0>:ub {align1};
125
        (f0.0)mov       (1)     mb_x<1>:ub                      0:uw {align1} ;
126
        (f0.0)add       (1)     mb_y<1>:ub                      mb_y<0,1,0>:ub                  1:uw {align1} ;
127
 
128
        /* DW6 */
129
        mov             (1)     pak_object6_ud<1>:ud            0x0:ud {align1} ;
130
        (-f0.1)mov      (1)     pak_object6_ud<1>:ud            MFC_AVC_PAK_OBJECT_INTRA_DW6 {align1} ;
131
        cmp.e.f0.0      (1)     null<1>:uw                      total_mbs<0,1,0>:uw             1:uw {align1};
132
        (-f0.0)mov      (1)     pak_object6_ud<1>:ud            0x0:ud {align1} ;
133
        add             (1)     pak_object6_ud<1>:ud            pak_object6_ud<0,1,0>:ud        qp<0,1,0>:ub {align1} ;
134
 
135
        /* DW3 */
136
        and             (1)     pak_object3_ud<1>:ud            ob_read_wb0.0<0,1,0>:ud         0xFFFF {align1} ;
137
        add             (1)     pak_object3_ud<1>:ud            pak_object3_ud<0,1,0>:ud        MFC_AVC_PAK_OBJECT_INTRA_DW3 {align1} ;
138
 
139
        /* DW7 */
140
        mov             (1)     pak_object7_ud<1>:ud            ob_read_wb0.4<0,1,0>:ud {align1} ;
141
 
142
        /* DW8 */
143
        mov             (1)     pak_object8_ud<1>:ud            ob_read_wb0.8<0,1,0>:ud {align1} ;
144
 
145
        /* DW9 */
146
        and             (1)     pak_object9_ud<1>:ud            ob_read_wb0.12<0,1,0>:ud        0xFC:ud {align1} ;
147
 
148
__OUTPUT_PAK_COMMAND:
149
        mov             (8)     msg_reg0.0<1>:ud                tmp_mfc_batchbuffer<8,8,1>:ud {align1} ;
150
        mov             (8)     msg_reg1.0<1>:ud                pak_object_ud<8,8,1>:ud {align1} ;
151
        mov             (8)     msg_reg2.0<1>:ud                pak_object8_ud<8,8,1>:ud {align1} ;
152
 
153
        /* point to the next other info block */
154
        add             (1)     tmp_vme_output.8<1>:ud          tmp_vme_output.8<0,1,0>:ud      INTER_VME_OUTPUT_IN_OWS:ud {align1} ;
155
 
156
send (16)
157
        msg_ind
158
        ob_write_wb
159
        null
160
        data_port(
161
                OB_CACHE_TYPE,
162
                OB_WRITE,
163
                OB_CONTROL_3,
164
                BIND_IDX_MFC_BATCHBUFFER,
165
                OB_WRITE_COMMIT_CATEGORY,
166
                OB_HEADER_PRESENT
167
        )
168
        mlen 3
169
        rlen ob_write_wb_length
170
        {align1};
171
 
172
        /* the new offset */
173
        add             (1)     tmp_mfc_batchbuffer.8<1>:ud     tmp_mfc_batchbuffer.8<0,1,0>:ud 4:ud {align1} ;
174
        add             (1)     tmp_offset.0<1>:ud              tmp_offset.0<0,1,0>:ud          1:ud {align1};
175
 
176
        add.z.f0.0      (1)	total_mbs<1>:w                  total_mbs<0,1,0>:w              -1:w {align1};
177
        (-f0.0)jmpi     (1)     __PAK_OBJECT_LOOP ;
178