Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2010-2013 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.  *    Zhao Yakui <yakui.zhao@intel.com>
  25.  */
  26.        
  27. START:
  28.         mov     (16)    pak_object_reg0.0<1>:ud 0x0:ud          {align1};
  29.         mov     (8)     obw_m0.0<1>:ud          0x0:ud          {align1};
  30.         mov     (8)     mb_cur_msg.0<1>:ud      0x0:ud          {align1};
  31.         mov     (16)    mb_temp.0<1>:ud         0x0:ud          {align1};
  32.         mov     (1)     cur_mb_x<1>:uw          mb_x<0,1,0>:ub  {align1};
  33.         mov     (1)     cur_mb_y<1>:uw          mb_y<0,1,0>:ub  {align1};
  34.         mov     (1)     end_mb_x<1>:uw  slice_end_x<0,1,0>:ub   {align1};
  35.         mov     (1)     end_mb_y<1>:uw  slice_end_y<0,1,0>:ub   {align1};
  36.         mov     (1)     end_loop_count<1>:uw    total_mbs<0,1,0>:uw     {align1};
  37.         mov     (1)     vme_len<1>:ud           2:ud            {align1};
  38.         and.z.f0.0      (1) null:uw     mb_flag<0,1,0>:ub       INTRA_SLICE:uw {align1};
  39.         (f0.0)  mov     (1) vme_len<1>:ud       24:ud           {align1};
  40.  
  41.         mov  (1) obw_m0.8<1>:UD         buffer_offset<0,1,0>:ud {align1};
  42.         mov  (1) obw_m0.20<1>:UB        thread_id_ub {align1};    /* dispatch id */
  43.  
  44.         mul  (1) mb_cur_msg.8<1>:UD       width_in_mbs<0,1,0>:UW   cur_mb_y<0,1,0>:UW {align1};
  45.         add  (1) mb_cur_msg.8<1>:UD       mb_cur_msg.8<0,1,0>:UD   cur_mb_x<0,1,0>:uw {align1};
  46.         mul  (1) mb_cur_msg.8<1>:UD       mb_cur_msg.8<0,1,0>:UD vme_len<0,1,0>:UD {align1};
  47.         mov  (1) mb_cur_msg.20<1>:UB      thread_id_ub {align1};                  /* dispatch id */
  48.         mov  (1) pak_object0_ud<1>:ud      MFC_AVC_PAK_OBJECT_DW0:ud {align1};
  49.         mov  (1) pak_object5_ud<1>:ud      MFC_AVC_PAK_OBJECT_DW5:ud {align1};
  50.         mov  (1) pak_object10_ud<1>:ud     MFC_AVC_PAK_OBJECT_DW10:ud {align1};
  51.         mov  (1) pak_object6_ud<1>:ub      qp_flag<0,1,0>:ub {align1};
  52.  
  53. pak_object_loop:
  54.         mov     (8)     mb_msg0.0<1>:ud  mb_cur_msg.0<8,8,1>:ud {align1};
  55.         mov     (1)     pak_object4_ud<1>:ud MFC_AVC_PAK_OBJECT_DW4:ud {align1};
  56.         mov     (1)     tmp_reg0.0<1>:ub  cur_mb_x<0,1,0>:ub    {align1};
  57.         mov     (1)     tmp_reg0.1<1>:ub  cur_mb_y<0,1,0>:ub    {align1};
  58.         mov     (1)     pak_object4_ud<1>:uw tmp_reg0.0<0,1,0>:uw {align1};
  59.         /* pak_object6_ud */
  60.         mov     (1)     pak_object_reg0.26<1>:uw        0x0:uw  {align1};
  61.  
  62.         cmp.e.f0.0 (1)  null:uw cur_mb_x<0,1,0>:uw end_mb_x<0,1,0>:uw   {align1};
  63.         (-f0.0) jmpi    (1) start_mb_flag;     
  64.         cmp.e.f0.0 (1)  null:uw cur_mb_y<0,1,0>:uw end_mb_y<0,1,0>:uw   {align1};
  65.         (f0.0)  mov     (1)  pak_object_reg0.26<1>:uw MFC_AVC_PAK_LAST_MB:uw {align1}
  66. start_mb_flag:
  67.         and.z.f0.0      (1) null:uw     mb_flag<0,1,0>:ub       INTRA_SLICE:uw {align1};
  68.         (f0.0)  jmpi    (1) inter_frame_start;
  69.        
  70. /* bind index 0, read 2 oword (32bytes), msg type: 0(OWord Block Read) */
  71. send (16)
  72.         mb_ind
  73.         mb_wb.0<1>:ud
  74.         null
  75.         data_port(
  76.                 OBR_CACHE_TYPE,
  77.                 OBR_MESSAGE_TYPE,
  78.                 OBR_CONTROL_2,
  79.                 MV_BIND_IDX,
  80.                 OBR_WRITE_COMMIT_CATEGORY,
  81.                 OBR_HEADER_PRESENT
  82.         )
  83.         mlen 1
  84.         rlen 1
  85.         {align1};      
  86.         jmpi (1) intra_pak_command;
  87.  
  88. nop;
  89. nop;
  90. inter_frame_start:
  91. /* bind index 0, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
  92. send (16)
  93.         mb_ind
  94.         mb_wb.0<1>:ud
  95.         null
  96.         data_port(
  97.                 OBR_CACHE_TYPE,
  98.                 OBR_MESSAGE_TYPE,
  99.                 OBR_CONTROL_4,
  100.                 MV_BIND_IDX,
  101.                 OBR_WRITE_COMMIT_CATEGORY,
  102.                 OBR_HEADER_PRESENT
  103.         )
  104.         mlen 1
  105.         rlen 2
  106.         {align1};
  107.                
  108. /* TODO: RefID is required after multi-references are added */
  109. cmp.l.f0.0 (1)          null:w  mb_intra_wb.16<0,1,0>:uw        mb_inter_wb.8<0,1,0>:uw {align1};
  110. (f0.0)   jmpi   (1)     intra_pak_command;
  111.  
  112. /* MV len and MV mode */       
  113.         and     (1)   pak_object3_ud<1>:ud mb_inter_wb.0<0,1,0>:ud MFC_AVC_INTER_MASK_DW3:ud {align1};
  114.         add     (1)   pak_object3_ud<1>:ud pak_object3_ud<0,1,0>:ud MFC_AVC_PAK_CBP:ud {align1};
  115.         and     (1)   tmp_reg0.0<1>:uw   mb_inter_wb.0<0,1,0>:uw        INTER_MASK:uw   {align1};
  116.         mov     (1)   pak_object1_ud<1>:ud      32:ud   {align1};
  117.         cmp.e.f0.0 (1) null:uw  tmp_reg0.0<0,1,0>:uw    INTER_8X8MODE:uw        {align1};
  118.         (-f0.0) add (1) pak_object3_ud<1>:ud  pak_object3_ud<0,1,0>:ud  INTER_MV8:ud {align1};
  119.         (-f0.0) jmpi (1)        inter_mv_check;
  120.         and.nz.f0.0 (1) null:ud  mb_inter_wb.4<0,1,0>:uw        SUBSHAPE_MASK:uw {align1};
  121.         (f0.0)  mov  (1)        pak_object1_ud<1>:ud    128:ud  {align1};
  122.         (f0.0)  add (1) pak_object3_ud<1>:ud  pak_object3_ud<0,1,0>:ud  INTER_MV32:ud {align1};
  123.         (f0.0)  jmpi    (1) mv_check_end;
  124.  
  125.         add (1) pak_object3_ud<1>:ud  pak_object3_ud<0,1,0>:ud  INTER_MV8:ud {align1};
  126.                
  127. inter_mv_check:
  128.         and     (1)   tmp_reg0.0<1>:uw   mb_inter_wb.0<0,1,0>:uw        INTER_MASK:uw   {align1};
  129.         cmp.e.f0.0 (1) null:uw  tmp_reg0.0<0,1,0>:uw    INTER_16X16MODE:uw      {align1};
  130.         (f0.0)  jmpi    (1) mv_check_end;
  131.        
  132. add   (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:ud     3:ud {align1};
  133. /* Read MV for MB A */
  134. /* bind index 0, read 8 oword (128bytes), msg type: 0(OWord Block Read) */
  135. send (16)
  136.         mb_ind
  137.         mb_mv0.0<1>:ud
  138.         null
  139.         data_port(
  140.                 OBR_CACHE_TYPE,
  141.                 OBR_MESSAGE_TYPE,
  142.                 OBR_CONTROL_8,
  143.                 MV_BIND_IDX,
  144.                 OBR_WRITE_COMMIT_CATEGORY,
  145.                 OBR_HEADER_PRESENT
  146.         )
  147.         mlen 1
  148.         rlen 4
  149.         {align1};
  150. /* TODO: RefID is required after multi-references are added */
  151.  
  152.         mov     (2)     mb_mv0.8<1>:ud  mb_mv1.0<2,2,1>:ud      {align1};
  153.         mov     (2)     mb_mv0.16<1>:ud mb_mv2.0<2,2,1>:ud      {align1};
  154.         mov     (2)     mb_mv0.24<1>:ud mb_mv3.0<2,2,1>:ud      {align1};
  155.  
  156.         mov             (8)     msg_reg0.0<1>:ud                mb_msg0.0<8,8,1>:ud {align1} ;
  157.         mov             (8)     msg_reg1.0<1>:ud                mb_mv0.0<8,8,1>:ud {align1} ;
  158. /* Write MV for MB A */
  159. /* bind index 0, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
  160. send (16)
  161.         msg_ind
  162.         obw_wb
  163.         null
  164.         data_port(
  165.                 OBW_CACHE_TYPE,
  166.                 OBW_MESSAGE_TYPE,
  167.                 OBW_CONTROL_2,
  168.                 MV_BIND_IDX,
  169.                 OBW_WRITE_COMMIT_CATEGORY,
  170.                 OBW_HEADER_PRESENT
  171.         )
  172.         mlen 2
  173.         rlen obw_wb_length
  174.         {align1};
  175.  
  176. mv_check_end:
  177.  
  178. /* ref list */
  179.         mov     (1)   pak_object8_ud<1>:ud fwd_ref<0,1,0>:ud    {align1};
  180.         mov     (1)   pak_object9_ud<1>:ud bwd_ref<0,1,0>:ud    {align1};
  181. /* inter_mode. pak_object7_ud */
  182.         mov     (1)   pak_object7_ud<1>:ud      0x0:ud  {align1};
  183.         mov     (1)   pak_object_reg0.28<1>:ub mb_inter_wb.5<0,1,0>:ub  {align1};
  184.         mov     (1)   pak_object_reg0.29<1>:ub mb_inter_wb.6<0,1,0>:ub  {align1};
  185.  
  186. /* mv start address */
  187.         add     (1)   tmp_reg0.4<1>:ud  mb_cur_msg.8<0,1,0>:ud  3:ud {align1};
  188.         mul     (1)   pak_object2_ud<1>:ud tmp_reg0.4<0,1,0>:ud 16:ud {align1};
  189.  
  190.         jmpi    (1)     write_pak_command;
  191.  
  192. intra_pak_command:
  193.         /* object 1/2 is set to zero */
  194.         mov     (2)   pak_object1_ud<1>:ud      0x0:ud  {align1};
  195.         /* object 7/8 intra mode */
  196.         mov     (1)   pak_object7_ud<1>:ud      mb_intra_wb.4<0,1,0>:ud {align1};
  197.         mov     (1)   pak_object8_ud<1>:ud      mb_intra_wb.8<0,1,0>:ud {align1};
  198.         /* object 9 Intra structure */
  199.         mov     (1)   pak_object9_ud<1>:ud      0x0:ud                  {align1};
  200.         mov     (1)   pak_object9_ud<1>:ub      mb_intra_wb.12<0,1,0>:ub {align1};
  201.  
  202.         and     (1)   pak_object3_ud<1>:ud mb_intra_wb.0<0,1,0>:ud MFC_AVC_INTRA_MASK_DW3:ud {align1};
  203.         add     (1)   pak_object3_ud<1>:ud pak_object3_ud<0,1,0>:ud MFC_AVC_INTRA_FLAG + MFC_AVC_PAK_CBP:ud {align1};
  204.  
  205.         mov     (1)   tmp_reg0.0<1>:ud  0:ud    {align1};
  206.         mov     (1)   tmp_reg0.1<1>:ub  mb_intra_wb.2<0,1,0>:ub {align1};
  207.         and     (1)   tmp_reg0.0<1>:uw  tmp_reg0.0<0,1,0>:uw    AVC_INTRA_MASK:uw {align1};
  208.         add     (1)   pak_object3_ud<1>:ud pak_object3_ud<0,1,0>:ud tmp_reg0.0<0,1,0>:ud {align1};
  209.  
  210. /* Write the pak command into the batchbuffer */
  211. write_pak_command:
  212.         mov             (8)     msg_reg0.0<1>:ud                obw_m0.0<8,8,1>:ud {align1} ;
  213.         mov             (8)     msg_reg1.0<1>:ud                pak_object_reg0.0<8,8,1>:ud {align1} ;
  214.  
  215. /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
  216. send (16)
  217.         msg_ind
  218.         obw_wb
  219.         null
  220.         data_port(
  221.                 OBW_CACHE_TYPE,
  222.                 OBW_MESSAGE_TYPE,
  223.                 OBW_CONTROL_2,
  224.                 MFC_BIND_IDX,
  225.                 OBW_WRITE_COMMIT_CATEGORY,
  226.                 OBW_HEADER_PRESENT
  227.         )
  228.         mlen 2
  229.         rlen obw_wb_length
  230.         {align1};
  231.  
  232.         add     (1)     msg_reg0.8<1>:ud        msg_reg0.8<0,1,0>:ud    2:ud    {align1};
  233.         mov     (8)     msg_reg1.0<1>:ud        pak_object_reg1.0<8,8,1>:ud {align1};
  234.  
  235. /* bind index 3, write 1 oword (16bytes), msg type: 8(OWord Block Write) */
  236. send (16)
  237.         msg_ind
  238.         obw_wb
  239.         null
  240.         data_port(
  241.                 OBW_CACHE_TYPE,
  242.                 OBW_MESSAGE_TYPE,
  243.                 OBW_CONTROL_0,
  244.                 MFC_BIND_IDX,
  245.                 OBW_WRITE_COMMIT_CATEGORY,
  246.                 OBW_HEADER_PRESENT
  247.         )
  248.         mlen 2
  249.         rlen obw_wb_length
  250.         {align1};
  251.  
  252.  
  253. /* Check the next mb */
  254. add     (1)     cur_loop_count<1>:uw    cur_loop_count<0,1,0>:uw        1:uw    {align1};
  255. cmp.e.f0.0      (1)     null:uw cur_loop_count<0,1,0>:uw end_loop_count<0,1,0>:uw {align1};
  256. (f0.0)  jmpi    (1)     pak_loop_end;
  257. /* the buffer offset for next block */
  258. add     (1)     obw_m0.8<1>:ud          obw_m0.8<0,1,0>:ud      3:uw    {align1};
  259. add     (1)     mb_cur_msg.8<1>:ud      mb_cur_msg.8<0,1,0>:ud  vme_len<0,1,0>:ud {align1};            
  260. add     (1)     cur_mb_x<1>:uw          cur_mb_x<0,1,0>:uw      1:uw    {align1};
  261. /* Check whether it is already equal to width in mbs */
  262. cmp.e.f0.0      (1)     null:uw         cur_mb_x<0,1,0>:uw      width_in_mbs<0,1,0>:uw  {align1};
  263. (f0.0)  add (1) cur_mb_y<1>:uw          cur_mb_y<0,1,0>:uw      1:uw    {align1};
  264. (f0.0)  mov     (1) cur_mb_x<1>:uw      0:uw            {align1};              
  265.  
  266. /* continue the pak command for next mb */
  267. jmpi    (1)     pak_object_loop;
  268. nop;
  269. nop;
  270. pak_loop_end:
  271. /* Issue message fence so that the previous write message is committed */
  272. send (16)
  273.         msg_ind
  274.         mb_wb.0<1>:ud
  275.         null
  276.         data_port(
  277.                 OBR_CACHE_TYPE,
  278.                 OBR_MESSAGE_FENCE,
  279.                 OBR_MF_COMMIT,
  280.                 MFC_BIND_IDX,
  281.                 OBR_WRITE_COMMIT_CATEGORY,
  282.                 OBR_HEADER_PRESENT
  283.         )
  284.         mlen 1
  285.         rlen 1
  286.         {align1};
  287.  
  288. __EXIT:
  289. /*
  290.  * kill thread
  291.  */        
  292. mov  (8) ts_msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
  293. send (1) ts_msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};
  294.  
  295. nop;
  296.        
  297.