diff options
author | notaz | 2011-01-02 00:59:02 +0200 |
---|---|---|
committer | notaz | 2011-01-02 00:59:02 +0200 |
commit | 86aad47b0418b1715a4d223adf8f59aa92619d15 (patch) | |
tree | 176d9e9272cc3ad33a8278fdec0d9030586dc012 /plugins/gpu_unai/gpu_blit.h | |
parent | 201c21e2ad6be25a4b843d1434eabb432ce72884 (diff) | |
download | pcsx_rearmed-86aad47b0418b1715a4d223adf8f59aa92619d15.tar.gz pcsx_rearmed-86aad47b0418b1715a4d223adf8f59aa92619d15.tar.bz2 pcsx_rearmed-86aad47b0418b1715a4d223adf8f59aa92619d15.zip |
import gpu_unai from PCSX4ALL project
Diffstat (limited to 'plugins/gpu_unai/gpu_blit.h')
-rw-r--r-- | plugins/gpu_unai/gpu_blit.h | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/plugins/gpu_unai/gpu_blit.h b/plugins/gpu_unai/gpu_blit.h new file mode 100644 index 0000000..35cd056 --- /dev/null +++ b/plugins/gpu_unai/gpu_blit.h @@ -0,0 +1,405 @@ +/*************************************************************************** +* Copyright (C) 2010 PCSX4ALL Team * +* Copyright (C) 2010 Unai * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the * +* Free Software Foundation, Inc., * +* 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * +***************************************************************************/ + +#ifndef _INNER_BLIT_H_ +#define _INNER_BLIT_H_ + +#ifndef USE_BGR15 +#define RGB24(R,G,B) (((((R)&0xF8)<<8)|(((G)&0xFC)<<3)|(((B)&0xF8)>>3))) +#define RGB16X2(C) (((C)&(0x1f001f<<10))>>10) | (((C)&(0x1f001f<<5))<<1) | (((C)&(0x1f001f<<0))<<11) +#define RGB16(C) (((C)&(0x1f<<10))>>10) | (((C)&(0x1f<<5))<<1) | (((C)&(0x1f<<0))<<11) +#else +#define RGB24(R,G,B) ((((R)&0xF8)>>3)|(((G)&0xF8)<<2)|(((B)&0xF8)<<7)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GPU Blitting code with rescale and interlace support. + +INLINE void GPU_BlitWW(const void* src, u16* dst16, u32 isRGB24) +{ + u32 uCount; + if(isRGB24 == 0) + { + #ifndef USE_BGR15 + uCount = 20; + const u32* src32 = (const u32*) src; + u32* dst32 = (u32*)(void*) dst16; + do{ + dst32[0] = RGB16X2(src32[0]); + dst32[1] = RGB16X2(src32[1]); + dst32[2] = RGB16X2(src32[2]); + dst32[3] = RGB16X2(src32[3]); + dst32[4] = RGB16X2(src32[4]); + dst32[5] = RGB16X2(src32[5]); + dst32[6] = RGB16X2(src32[6]); + dst32[7] = RGB16X2(src32[7]); + dst32 += 8; + src32 += 8; + }while(--uCount); + #else + memcpy(dst16,src,640); + #endif + } + else + { + uCount = 20; + const u8* src8 = (const u8*)src; + do{ + dst16[ 0] = RGB24(src8[ 0], src8[ 1], src8[ 2] ); + dst16[ 1] = RGB24(src8[ 3], src8[ 4], src8[ 5] ); + dst16[ 2] = RGB24(src8[ 6], src8[ 7], src8[ 8] ); + dst16[ 3] = RGB24(src8[ 9], src8[10], src8[11] ); + dst16[ 4] = RGB24(src8[12], src8[13], src8[14] ); + dst16[ 5] = RGB24(src8[15], src8[16], src8[17] ); + dst16[ 6] = RGB24(src8[18], src8[19], src8[20] ); + dst16[ 7] = RGB24(src8[21], src8[22], src8[23] ); + + dst16[ 8] = RGB24(src8[24], src8[25], src8[26] ); + dst16[ 9] = RGB24(src8[27], src8[28], src8[29] ); + dst16[10] = RGB24(src8[30], src8[31], src8[32] ); + dst16[11] = RGB24(src8[33], src8[34], src8[35] ); + dst16[12] = RGB24(src8[36], src8[37], src8[38] ); + dst16[13] = RGB24(src8[39], src8[40], src8[41] ); + dst16[14] = RGB24(src8[42], src8[43], src8[44] ); + dst16[15] = RGB24(src8[45], src8[46], src8[47] ); + dst16 += 16; + src8 += 48; + }while(--uCount); + } +} + +INLINE void GPU_BlitWWSWWSWS(const void* src, u16* dst16, u32 isRGB24) +{ + u32 uCount; + if(isRGB24 == 0) + { + #ifndef USE_BGR15 + uCount = 32; + const u16* src16 = (const u16*) src; + do{ + dst16[ 0] = RGB16(src16[0]); + dst16[ 1] = RGB16(src16[1]); + dst16[ 2] = RGB16(src16[3]); + dst16[ 3] = RGB16(src16[4]); + dst16[ 4] = RGB16(src16[6]); + dst16[ 5] = RGB16(src16[8]); + dst16[ 6] = RGB16(src16[9]); + dst16[ 7] = RGB16(src16[11]); + dst16[ 8] = RGB16(src16[12]); + dst16[ 9] = RGB16(src16[14]); + dst16 += 10; + src16 += 16; + }while(--uCount); + #else + uCount = 64; + const u16* src16 = (const u16*) src; + do{ + *dst16++ = *src16++; + *dst16++ = *src16; + src16+=2; + *dst16++ = *src16++; + *dst16++ = *src16; + src16+=2; + *dst16++ = *src16; + src16+=2; + }while(--uCount); + #endif + } + else + { + uCount = 32; + const u8* src8 = (const u8*)src; + do{ + dst16[ 0] = RGB24(src8[ 0], src8[ 1], src8[ 2] ); + dst16[ 1] = RGB24(src8[ 3], src8[ 4], src8[ 5] ); + dst16[ 2] = RGB24(src8[ 9], src8[10], src8[11] ); + dst16[ 3] = RGB24(src8[12], src8[13], src8[14] ); + dst16[ 4] = RGB24(src8[18], src8[19], src8[20] ); + + dst16[ 5] = RGB24(src8[24], src8[25], src8[26] ); + dst16[ 6] = RGB24(src8[27], src8[28], src8[29] ); + dst16[ 7] = RGB24(src8[33], src8[34], src8[35] ); + dst16[ 8] = RGB24(src8[36], src8[37], src8[38] ); + dst16[ 9] = RGB24(src8[42], src8[43], src8[44] ); + + dst16 += 10; + src8 += 48; + }while(--uCount); + } +} + +INLINE void GPU_BlitWWWWWS(const void* src, u16* dst16, u32 isRGB24) +{ + u32 uCount; + if(isRGB24 == 0) + { + #ifndef USE_BGR15 + uCount = 32; + const u16* src16 = (const u16*) src; + do{ + dst16[ 0] = RGB16(src16[0]); + dst16[ 1] = RGB16(src16[1]); + dst16[ 2] = RGB16(src16[2]); + dst16[ 3] = RGB16(src16[3]); + dst16[ 4] = RGB16(src16[4]); + dst16[ 5] = RGB16(src16[6]); + dst16[ 6] = RGB16(src16[7]); + dst16[ 7] = RGB16(src16[8]); + dst16[ 8] = RGB16(src16[9]); + dst16[ 9] = RGB16(src16[10]); + dst16 += 10; + src16 += 12; + }while(--uCount); + #else + uCount = 64; + const u16* src16 = (const u16*) src; + do{ + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16; + src16+=2; + }while(--uCount); + #endif + } + else + { + uCount = 32; + const u8* src8 = (const u8*)src; + do{ + dst16[0] = RGB24(src8[ 0], src8[ 1], src8[ 2] ); + dst16[1] = RGB24(src8[ 3], src8[ 4], src8[ 5] ); + dst16[2] = RGB24(src8[ 6], src8[ 7], src8[ 8] ); + dst16[3] = RGB24(src8[ 9], src8[10], src8[11] ); + dst16[4] = RGB24(src8[12], src8[13], src8[14] ); + dst16[5] = RGB24(src8[18], src8[19], src8[20] ); + dst16[6] = RGB24(src8[21], src8[22], src8[23] ); + dst16[7] = RGB24(src8[24], src8[25], src8[26] ); + dst16[8] = RGB24(src8[27], src8[28], src8[29] ); + dst16[9] = RGB24(src8[30], src8[31], src8[32] ); + dst16 += 10; + src8 += 36; + }while(--uCount); + } +} + +INLINE void GPU_BlitWWWWWWWWS(const void* src, u16* dst16, u32 isRGB24, u32 uClip_src) +{ + u32 uCount; + if(isRGB24 == 0) + { + #ifndef USE_BGR15 + uCount = 20; + const u16* src16 = ((const u16*) src) + uClip_src; + do{ + dst16[ 0] = RGB16(src16[0]); + dst16[ 1] = RGB16(src16[1]); + dst16[ 2] = RGB16(src16[2]); + dst16[ 3] = RGB16(src16[3]); + dst16[ 4] = RGB16(src16[4]); + dst16[ 5] = RGB16(src16[5]); + dst16[ 6] = RGB16(src16[6]); + dst16[ 7] = RGB16(src16[7]); + + dst16[ 8] = RGB16(src16[9]); + dst16[ 9] = RGB16(src16[10]); + dst16[10] = RGB16(src16[11]); + dst16[11] = RGB16(src16[12]); + dst16[12] = RGB16(src16[13]); + dst16[13] = RGB16(src16[14]); + dst16[14] = RGB16(src16[15]); + dst16[15] = RGB16(src16[16]); + dst16 += 16; + src16 += 18; + }while(--uCount); + #else + uCount = 40; + const u16* src16 = ((const u16*) src) + uClip_src; + do{ + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16; + src16+=2; + }while(--uCount); + #endif + } + else + { + uCount = 20; + const u8* src8 = (const u8*)src + (uClip_src<<1) + uClip_src; + do{ + dst16[ 0] = RGB24(src8[ 0], src8[ 1], src8[ 2] ); + dst16[ 1] = RGB24(src8[ 3], src8[ 4], src8[ 5] ); + dst16[ 2] = RGB24(src8[ 6], src8[ 7], src8[ 8] ); + dst16[ 3] = RGB24(src8[ 9], src8[10], src8[11] ); + dst16[ 4] = RGB24(src8[12], src8[13], src8[14] ); + dst16[ 5] = RGB24(src8[15], src8[16], src8[17] ); + dst16[ 6] = RGB24(src8[18], src8[19], src8[20] ); + dst16[ 7] = RGB24(src8[21], src8[22], src8[23] ); + + dst16[ 8] = RGB24(src8[27], src8[28], src8[29] ); + dst16[ 9] = RGB24(src8[30], src8[31], src8[32] ); + dst16[10] = RGB24(src8[33], src8[34], src8[35] ); + dst16[11] = RGB24(src8[36], src8[37], src8[38] ); + dst16[12] = RGB24(src8[39], src8[40], src8[41] ); + dst16[13] = RGB24(src8[42], src8[43], src8[44] ); + dst16[14] = RGB24(src8[45], src8[46], src8[47] ); + dst16[15] = RGB24(src8[48], src8[49], src8[50] ); + dst16 += 16; + src8 += 54; + }while(--uCount); + } +} + +INLINE void GPU_BlitWWDWW(const void* src, u16* dst16, u32 isRGB24) +{ + u32 uCount; + if(isRGB24 == 0) + { + #ifndef USE_BGR15 + uCount = 32; + const u16* src16 = (const u16*) src; + do{ + dst16[ 0] = RGB16(src16[0]); + dst16[ 1] = RGB16(src16[1]); + dst16[ 2] = dst16[1]; + dst16[ 3] = RGB16(src16[2]); + dst16[ 4] = RGB16(src16[3]); + dst16[ 5] = RGB16(src16[4]); + dst16[ 6] = RGB16(src16[5]); + dst16[ 7] = dst16[6]; + dst16[ 8] = RGB16(src16[6]); + dst16[ 9] = RGB16(src16[7]); + dst16 += 10; + src16 += 8; + }while(--uCount); + #else + uCount = 64; + const u16* src16 = (const u16*) src; + do{ + *dst16++ = *src16++; + *dst16++ = *src16; + *dst16++ = *src16++; + *dst16++ = *src16++; + *dst16++ = *src16++; + }while(--uCount); + #endif + } + else + { + uCount = 32; + const u8* src8 = (const u8*)src; + do{ + dst16[ 0] = RGB24(src8[0], src8[ 1], src8[ 2] ); + dst16[ 1] = RGB24(src8[3], src8[ 4], src8[ 5] ); + dst16[ 2] = dst16[1]; + dst16[ 3] = RGB24(src8[6], src8[ 7], src8[ 8] ); + dst16[ 4] = RGB24(src8[9], src8[10], src8[11] ); + + dst16[ 5] = RGB24(src8[12], src8[13], src8[14] ); + dst16[ 6] = RGB24(src8[15], src8[16], src8[17] ); + dst16[ 7] = dst16[6]; + dst16[ 8] = RGB24(src8[18], src8[19], src8[20] ); + dst16[ 9] = RGB24(src8[21], src8[22], src8[23] ); + dst16 += 10; + src8 += 24; + }while(--uCount); + } +} + + +INLINE void GPU_BlitWS(const void* src, u16* dst16, u32 isRGB24) +{ + u32 uCount; + if(isRGB24 == 0) + { + #ifndef USE_BGR15 + uCount = 20; + const u16* src16 = (const u16*) src; + do{ + dst16[ 0] = RGB16(src16[0]); + dst16[ 1] = RGB16(src16[2]); + dst16[ 2] = RGB16(src16[4]); + dst16[ 3] = RGB16(src16[6]); + + dst16[ 4] = RGB16(src16[8]); + dst16[ 5] = RGB16(src16[10]); + dst16[ 6] = RGB16(src16[12]); + dst16[ 7] = RGB16(src16[14]); + + dst16[ 8] = RGB16(src16[16]); + dst16[ 9] = RGB16(src16[18]); + dst16[10] = RGB16(src16[20]); + dst16[11] = RGB16(src16[22]); + + dst16[12] = RGB16(src16[24]); + dst16[13] = RGB16(src16[26]); + dst16[14] = RGB16(src16[28]); + dst16[15] = RGB16(src16[30]); + + dst16 += 16; + src16 += 32; + }while(--uCount); + #else + uCount = 320; + const u16* src16 = (const u16*) src; + do{ + *dst16++ = *src16; src16+=2; + }while(--uCount); + #endif + } + else + { + uCount = 20; + const u8* src8 = (const u8*) src; + do{ + dst16[ 0] = RGB24(src8[ 0], src8[ 1], src8[ 2] ); + dst16[ 1] = RGB24(src8[ 6], src8[ 7], src8[ 8] ); + dst16[ 2] = RGB24(src8[12], src8[13], src8[14] ); + dst16[ 3] = RGB24(src8[18], src8[19], src8[20] ); + + dst16[ 4] = RGB24(src8[24], src8[25], src8[26] ); + dst16[ 5] = RGB24(src8[30], src8[31], src8[32] ); + dst16[ 6] = RGB24(src8[36], src8[37], src8[38] ); + dst16[ 7] = RGB24(src8[42], src8[43], src8[44] ); + + dst16[ 8] = RGB24(src8[48], src8[49], src8[50] ); + dst16[ 9] = RGB24(src8[54], src8[55], src8[56] ); + dst16[10] = RGB24(src8[60], src8[61], src8[62] ); + dst16[11] = RGB24(src8[66], src8[67], src8[68] ); + + dst16[12] = RGB24(src8[72], src8[73], src8[74] ); + dst16[13] = RGB24(src8[78], src8[79], src8[80] ); + dst16[14] = RGB24(src8[84], src8[85], src8[86] ); + dst16[15] = RGB24(src8[90], src8[91], src8[92] ); + + dst16 += 16; + src8 += 96; + }while(--uCount); + } +} + +#endif //_INNER_BLIT_H_ |