Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3769 Serge 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_RGB.asm
12
//
13
// Save packed ARGB 444 frame data block of size 16x8
14
//
15
// To save 16x8 block (64x8 byte layout for ARGB8888) we need 2 send instructions
16
//  ---------
17
//  | 1 | 2 |
18
//  ---------
19
 
20
#include "RGB16x8_Save_RGB.inc"
21
 
22
    shl (1) rMSGSRC.0<1>:d      wORIX<0;1,0>:w            2:w  { NoDDClr }             // H. block origin need to be quadrupled
23
    mov (1) rMSGSRC.1<1>:d      wORIY<0;1,0>:w                 { NoDDClr, NoDDChk }    // Block origin (1st quadrant)
24
    mov (1) rMSGSRC.2<1>:ud     nDPW_BLOCK_SIZE_ARGB:ud        { NoDDChk }             // Block width and height (32x8)
25
 
26
    mov (8) mMSGHDR<1>:ud       rMSGSRC<8;8,1>:ud
27
 
28
//Use the mask to determine which pixels shouldn't be over-written
29
    and (1)        acc0.0<1>:ud udBLOCK_MASK<0;1,0>:ud   0x00FFFFFF:ud
30
    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
31
    (f0.0)  jmpi WriteARGBToDataPort
32
 
33
    //If mask is not all 1's, then load the entire 64x8 block
34
    //so that only those bytes may be modified that need to be (using the mask)
35
 
36
    // Load first block 16x8 packed ARGB 444 ---------------------------------------
37
    or (1)         acc0.0<1>:ud udBLOCK_MASK<0;1,0>:ud   0xFF00FF00:ud   //Check first block
38
    cmp.e.f0.0 (1) dNULLREG     acc0.0<0;1,0>:ud         0xFFFFFFFF:ud
39
    (f0.0)  jmpi SkipFirstBlockMerge                                     //If full mask then skip this block
40
 
41
    send (8) udSRC_ARGB(0)<1>   mMSGHDR     udDUMMY_NULL    nDATAPORT_READ    nDPMR_MSGDSC+nDPR_MSG_SIZE_ARGB+nBI_DESTINATION_RGB:ud
42
    mov  (8) mMSGHDR<1>:ud      rMSGSRC<8;8,1>:ud
43
 
44
    //Merge the data
45
    mov (1)           f0.0:uw             ubBLOCK_MASK_V:ub    //Load the mask on flag reg
46
    (f0.0)  mov (8)   rMASK_TEMP<1>:uw    uwBLOCK_MASK_H:uw    //use sel instruction - vK
47
    (-f0.0) mov (8)   rMASK_TEMP<1>:uw    0:uw
48
 
49
    $for(0, 0; 
50
        mov (1)             f0.1:uw                   uwMASK_TEMP(0,%1)<0;1,0>
51
        (-f0.1) mov (8)     udDEST_ARGB(%2)<1>        udSRC_ARGB(%1)
52
    }
53
 
54
SkipFirstBlockMerge:
55
    // Load second block 16x8 packed ARGB 444 ---------------------------------------
56
    or (1)         acc0.0<1>:ud udBLOCK_MASK<0;1,0>:ud   0xFF0000FF:ud   //Check second block
57
    cmp.e.f0.0 (1) dNULLREG     acc0.0<0;1,0>:ud         0xFFFFFFFF:ud
58
    (f0.0)  jmpi WriteARGBToDataPort                                     //If full mask then skip this block
59
 
60
    add  (1) mMSGHDR.0<1>:d     rMSGSRC.0<0;1,0>:d       32:d     // Point to 2nd part
61
    send (8) udSRC_ARGB(0)<1>   mMSGHDR    udDUMMY_NULL  nDATAPORT_READ    nDPMR_MSGDSC+nDPR_MSG_SIZE_ARGB+nBI_DESTINATION_RGB:ud
62
    mov  (8) mMSGHDR<1>:ud      rMSGSRC<8;8,1>:ud                 // Point to 1st part again
63
 
64
    //Merge the data
65
    mov (1)           f0.0:uw             ubBLOCK_MASK_V:ub    //Load the mask on flag reg
66
    (f0.0)  shr (8)   rMASK_TEMP<1>:uw    uwBLOCK_MASK_H:uw    8:uw    //load the mask for second block
67
    (-f0.0) mov (8)   rMASK_TEMP<1>:uw    0:uw
68
 
69
    $for(0, 1; 
70
        mov (1)             f0.1:uw                   uwMASK_TEMP(0,%1)<0;1,0>
71
        (-f0.1) mov (8)     udDEST_ARGB(%2)<1>        udSRC_ARGB(%1)
72
    }
73
 
74
WriteARGBToDataPort:
75
    // Move packed data to MRF and output
76
    $for(0; 
77
        mov (8) mudMSGPAYLOAD(%1)<1>       udDEST_ARGB(%1*2)
78
    }
79
    send (8)    dNULLREG    mMSGHDR   udDUMMY_NULL    nDATAPORT_WRITE    nDPMW_MSGDSC+nDPW_MSG_SIZE_ARGB+nBI_DESTINATION_RGB:ud
80
 
81
    mov  (8)    mMSGHDR<1>:ud         rMSGSRC<8;8,1>:ud
82
    add  (1)    mMSGHDR.0<1>:d        rMSGSRC.0<0;1,0>:d       32:d   // Point to 2nd part
83
    $for(0; 
84
        mov (8) mudMSGPAYLOAD(%1)<1>       udDEST_ARGB(%1*2+1)
85
    }
86
    send (8)    dNULLREG    mMSGHDR   udDUMMY_NULL    nDATAPORT_WRITE    nDPMW_MSGDSC+nDPW_MSG_SIZE_ARGB+nBI_DESTINATION_RGB:ud
87
 
88
// End of RGB16x8_Save_RGB