Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. __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.        
  179.