Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. // Module name: save_Top_UV_8x2.asm
  10. //
  11. // Save UV 8x2 block (8x2U + 8x2V in NV12)
  12. //
  13. //----------------------------------------------------------------
  14. //  Symbols need to be defined before including this module
  15. //
  16. //      Source region in :ud
  17. //      SRC_UD:                 SRC_UD Base=rxx ElementSize=4 SrcRegion=REGION(8,1) Type=ud                     // 1 GRF
  18. //
  19. //      Binding table index:
  20. //      BI_DEST_UV:             Binding table index of UV surface (NV12)
  21. //
  22. //----------------------------------------------------------------
  23.  
  24. #if defined(_DEBUG)
  25.         mov             (1)             EntrySignatureC:w                       0xDDD5:w
  26. #endif
  27.         and.z.f0.1 (8) NULLREGW         DualFieldMode<0;1,0>:w          1:w
  28.  
  29.     // FieldModeCurrentMbFlag determines how to access above MB
  30.         and.z.f0.0 (1)  null:w          r[ECM_AddrReg, BitFlags]:ub             FieldModeCurrentMbFlag:w               
  31.    
  32.         // Pack U and V
  33.     mov (1)     MSGSRC.0:ud             ORIX_TOP:w                                      { NoDDClr }                     // Block origin
  34.     asr (1)     MSGSRC.1:ud             ORIY_TOP:w                      1:w             { NoDDClr, NoDDChk }    // NV12 U+V block origin y = half of Y comp
  35.     mov (1)     MSGSRC.2:ud             0x0001000F:ud                           { NoDDChk }                             // NV12 U+V block width and height (16x2)
  36.  
  37.         // Dual field mode
  38.         (f0.1) mov (8)  MSGPAYLOADD(0)<1>               PREV_MB_UD(0)
  39.     (-f0.1) mov (8) MSGPAYLOADD(0)<1>           PREV_MB_UD(1)   // for dual field mode, write last 2 rows
  40.        
  41.     // Set message descriptor
  42.  
  43.     and.nz.f0.1 (1) NULLREGW            BitFields:w   BotFieldFlag:w
  44.    
  45.         (f0.0)  if      (1)             ELSE_UV_8X2_SAVE
  46.  
  47.     // Frame picture
  48.     mov (1)     MSGDSC  MSG_LEN(1)+DWBWMSGDSC_WC+BI_DEST_UV:ud                  // Write 1 GRFs to DEST_UV
  49.  
  50.         // Add vertical offset 8 for bot MB in MBAFF mode
  51.         (f0.1) add (1)  MSGSRC.1:d              MSGSRC.1:d              8:w            
  52.  
  53. ELSE_UV_8X2_SAVE:
  54.         else    (1)             ENDIF_UV_8X2_SAVE
  55.  
  56.         asr (1) MSGSRC.1:d              ORIY_CUR:w              2:w                     // asr 1: NV12 U+V block origin y = half of Y comp
  57.                                                                                                                 // asr 1: Reduce y by half in field access mode
  58.         // Field picture
  59.     (f0.1) mov (1)      MSGDSC  MSG_LEN(1)+DWBWMSGDSC_WC+ENMSGDSCBF+BI_DEST_UV:ud  // Write 1 GRF to DEST_Y bottom field
  60.     (-f0.1) mov (1)     MSGDSC  MSG_LEN(1)+DWBWMSGDSC_WC+ENMSGDSCTF+BI_DEST_UV:ud  // Write 1 GRF to DEST_Y top field
  61.  
  62.         add (1) MSGSRC.1:d              MSGSRC.1:d              -2:w            // for last 4 rows of above MB
  63.  
  64.         endif
  65. ENDIF_UV_8X2_SAVE:
  66.  
  67.     send (8)    WritebackResponse(0)<1>         MSGHDR          MSGSRC<8;8,1>:ud        DAPWRITE        MSGDSC
  68.  
  69. // End of save_Top_UV_8x2.asm
  70.