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. // Module name: RGB16x8_Save_RGB16.asm
  12. //
  13. // Save packed RGB565 frame data block of size 16x8
  14. //
  15. // To save 16x8 block (32x8 byte layout for RGB565) we need 1 send instruction
  16. //  -----
  17. //  | 1 |
  18. //  -----
  19.  
  20. #include "RGB16x8_Save_RGB16.inc"
  21.  
  22. //convert 32 bit RGB to 16 bit RGB
  23.     // Truncate A8R8G8B8 to A6R5G6B5 within byte.
  24.     // That is keeping 5 MSB of R and B, and 6 MSB of G.
  25.  
  26.     $for (0, 0; <nY_NUM_OF_ROWS; 1, 2) {
  27.         shr     uwCSC_TEMP(%1,0)<1>    ubDEST_ARGB(%2,0)<32;8,4>   3:w                // B >> 3
  28.  
  29.         shl (16) uwTEMP_RGB16(0)<1>    uwDEST_ARGB(%2,1)<16;8,2>   8:w                // R << 8
  30.         and (16) uwTEMP_RGB16(0)<1>    uwTEMP_RGB16(0)             0xF800:uw
  31.         or  (16) uwCSC_TEMP(%1,0)<1>   uwCSC_TEMP(%1,0)<16;16,1>   uwTEMP_RGB16(0)
  32.  
  33.         shr (16) uwTEMP_RGB16(0)<1>    uwDEST_ARGB(%2,0)<16;8,2>   5:w                // G >> 5
  34.         and (16) uwTEMP_RGB16(0)<1>    uwTEMP_RGB16(0)             0x07E0:uw
  35.         or  (16) uwCSC_TEMP(%1,0)<1>   uwCSC_TEMP(%1,0)<16;16,1>   uwTEMP_RGB16(0)
  36.     }
  37.  
  38.     mov (2) rMSGSRC.0<1>:d      wORIX<2;2,1>:w                      // Block origin (1st quadrant)
  39.     shl (1) rMSGSRC.0<1>:d      wORIX<0;1,0>:w              1:w     // H. block origin need to be doubled for byte offset
  40.     mov (1) rMSGSRC.2<1>:ud     nDPW_BLOCK_SIZE_RGB16:ud            // Block width and height (32x8)
  41.     mov (8) mMSGHDR<1>:ud       rMSGSRC<8;8,1>:ud
  42.  
  43. //Use the mask to determine which pixels shouldn't be over-written
  44.    and (1)        acc0.0<1>:ud udBLOCK_MASK<0;1,0>:ud   0x00FFFFFF:ud
  45.    cmp.ge.f0.0(1) dNULLREG     acc0.0<0;1,0>:ud         0x00FFFFFF:ud   //Check if all pixels in the block need to be modified
  46.    (f0.0)  jmpi WriteRGB16ToDataPort
  47.  
  48.    //If mask is not all 1's, then load the entire 32x8 block
  49.     //so that only those bytes may be modified that need to be (using the mask)
  50.  
  51.     // Load 32x8 packed RGB565 -----------------------------------------------------
  52.     send (8) udSRC_RGB16(0)<1>  mMSGHDR     udDUMMY_NULL    nDATAPORT_READ    nDPMR_MSGDSC+nDPR_MSG_SIZE_RGB16+nBI_DESTINATION_RGB:ud
  53.     mov (8) mMSGHDR<1>:ud       rMSGSRC<8;8,1>:ud
  54.  
  55.     //Merge the data
  56.     mov (1)           f0.0:uw             ubBLOCK_MASK_V:ub    //Load the mask on flag reg
  57.     (f0.0)  mov (8)   rMASK_TEMP<1>:uw    uwBLOCK_MASK_H:uw    //use sel instruction - vK
  58.     (-f0.0) mov (8)   rMASK_TEMP<1>:uw    0:uw
  59.  
  60.     $for(0; <nY_NUM_OF_ROWS; 1) {
  61.         mov (1)             f0.1:uw                   uwMASK_TEMP(0,%1)<0;1,0>
  62.         (-f0.1) mov (16)    uwCSC_TEMP(%1)<1>         uwSRC_RGB16(%1)
  63.     }
  64.  
  65. WriteRGB16ToDataPort:
  66.     // Move packed data to MRF and output
  67.     $for(0; <nY_NUM_OF_ROWS; 1) {
  68.         mov (8) mudMSGPAYLOAD(%1)<1>       udCSC_TEMP(%1)
  69.     }
  70.     send (8)    dNULLREG    mMSGHDR   udDUMMY_NULL    nDATAPORT_WRITE    nDPMW_MSGDSC+nDPW_MSG_SIZE_RGB16+nBI_DESTINATION_RGB:ud
  71.  
  72. // End of RGB16x8_Save_RGB16
  73.