Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * All Video Processing kernels
  3.  * Copyright © <2010>, Intel Corporation.
  4.  *
  5.  * This program is licensed under the terms and conditions of the
  6.  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
  7.  * http://www.opensource.org/licenses/eclipse-1.0.php.
  8.  *
  9.  */
  10.  
  11.  
  12. #include "PL4x8_Save_NV11.inc"
  13.  
  14.     mov  (8) mMSGHDR<1>:ud      rMSGSRC<8;8,1>:ud
  15.  
  16. #if !defined(SAVE_UV_ONLY)
  17. // Save current planar frame Y block data (16x8) -------------------------------
  18.  
  19.     mov  (2) mMSGHDR.0<1>:d     wORIX<2;2,1>:w          // Block origin
  20.     mov  (1) mMSGHDR.2<1>:ud    nDPW_BLOCK_SIZE_Y:ud    // Block width and height (16x8)
  21.  
  22. ///* Yoni - masking is not relevant for ILK?!?
  23. //
  24. //        //Use the mask to determine which pixels shouldn't be over-written
  25. //        cmp.ge.f0.0     (1)             NULLREG         BLOCK_MASK_D:ud         0x00FFFFFF:ud   //Check if all pixels in the block need to be modified
  26. //        (f0.0)  jmpi WritePlanarToDataPort
  27. //
  28. //        //If mask is not all 1's, then load the entire 16x8 block
  29. //        //so that only those bytes may be modified that need to be (using the mask)
  30. //    send (8)    SRC_YD(0)<1>    MSGHDR  MSGSRC<8;8,1>:ud        DWBRMSGDSC+0x00040000+BI_DEST_Y:ud         //16x8
  31. //        
  32. //    asr  (2)    MSGSRC.0<1>:ud  ORIX<2;2,1>:w   1:w     // U/V block origin should be half of Y's
  33. //    mov  (1)    MSGSRC.2<1>:ud  0x00030007:ud           // Block width and height (8x4)
  34. //    send (8)    SRC_UD(0)<1>    MSGHDR  MSGSRC<8;8,1>:ud        DWBRMSGDSC+0x00010000+BI_DEST_U:ud
  35. //    send (8)    SRC_VD(0)<1>    MSGHDR  MSGSRC<8;8,1>:ud        DWBRMSGDSC+0x00010000+BI_DEST_V:ud
  36. //        
  37. //    //Restore the origin information
  38. //    mov (2)     MSGSRC.0<1>:ud  ORIX<2;2,1>:w           // Block origin
  39. //    mov (1)     MSGSRC.2<1>:ud  0x0007000F:ud           // Block width and height (16x8)
  40. //
  41. //        //expand U and V to be aligned on word boundary
  42. //        mov     (16)    SRC_UW(1)<1>            SRC_U(0,16)
  43. //        mov     (16)    SRC_UW(0)<1>            SRC_U(0, 0)
  44. //        mov (16)        SRC_VW(1)<1>            SRC_V(0,16)
  45. //        mov (16)        SRC_VW(0)<1>            SRC_V(0, 0)
  46. //        
  47. //        //Merge the data
  48. //        mov  (1)        f0.1:uw                 BLOCK_MASK_V:uw                 //Load the mask on flag reg
  49. //        (f0.1)  mov     (8)     TEMP0<1>:uw     BLOCK_MASK_H:uw
  50. //        (-f0.1) mov     (8)     TEMP0<1>:uw     0:uw
  51. //                
  52. //        // Destination is Word aligned
  53. //                $for(0; <Y_ROW_SIZE; 2) {
  54. //                        mov     (1)     f0.1:uw         TEMP(0,%1)<0;1,0>
  55. //                        (-f0.1) mov  (16)       DEST_Y(0, %1*32)<2>             SRC_Y(0, %1*16)
  56. //                        (-f0.1) mov  (16)       DEST_U(0, %1*8)<1>              SRC_U(0, %1*8)  //only works for Word aligned Byte data
  57. //                        (-f0.1) mov  (16)       DEST_V(0, %1*8)<1>              SRC_V(0, %1*8)  //only works for Word aligned Byte data
  58. //
  59. //                        mov     (1)     f0.1:uw         TEMP(0,1+%1)<0;1,0>
  60. //                        (-f0.1) mov  (16)       DEST_Y(0, 1+%1*32)<2>   SRC_Y(0, 1+%1*16)
  61. //
  62. //                }
  63. //
  64. //*/ Yoni - masking is not relevant for ILK?!?
  65.        
  66. WritePlanarToDataPort:
  67.     $for(0,0; <nY_NUM_OF_ROWS; 2,1) {
  68.             mov (16) mubMSGPAYLOAD(%2,0)<1>     ub2DEST_Y(%1)REGION(16,2)
  69.             mov (16) mubMSGPAYLOAD(%2,16)<1>    ub2DEST_Y(%1+1)REGION(16,2)
  70.     }
  71.     send (8)    dNULLREG    mMSGHDR   udDUMMY_NULL    nDATAPORT_WRITE    nDPMW_MSGDSC+nDPW_MSG_SIZE_Y+nBI_DESTINATION_Y:ud
  72. #endif
  73.  
  74. // Save U/V data block in planar format (4x8) ----------------------------------
  75.     mov (2)  rMSGSRC.0<1>:d    wORIX<2;2,1>:w             // Block origin
  76.     asr (1)  rMSGSRC.0<1>:d    rMSGSRC.0<0;1,0>:d    1:w  // U/V block origin should be half of Y's
  77.     mov (8)  mMSGHDR<1>:ud     rMSGSRC<8;8,1>:ud
  78.  
  79.     $for(0,0; <nY_NUM_OF_ROWS;4,1) {
  80.         mov (16) mubMSGPAYLOAD(%2,0)<2>     ub2DEST_U(%2)REGION(16,2)
  81.         mov (16) mubMSGPAYLOAD(%2,1)<2>     ub2DEST_V(%2)REGION(16,2)
  82.     }
  83.     send (8)    dNULLREG    mMSGHDR    udDUMMY_NULL    nDATAPORT_WRITE    nDPMW_MSGDSC+nDPW_MSG_SIZE_UV+nBI_DESTINATION_UV:ud
  84.  
  85. // End of PL4x8_Save_NV11
  86.  
  87.