From 80c7bb7cc1cfcb95a7f4c229fcf4f5bdf8ed1170 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Tue, 28 Jan 2020 10:20:59 +0000 Subject: [PATCH] Improve PMAKE on big endian machines and fix some bugs. Includes fix from #364. (jmarsh) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4310 --- src/gui/render_templates.h | 52 ++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/src/gui/render_templates.h b/src/gui/render_templates.h index 30643937..688b03a4 100644 --- a/src/gui/render_templates.h +++ b/src/gui/render_templates.h @@ -94,37 +94,67 @@ #if SBPP == 15 #define SC scalerSourceCache.b16 +#ifdef WORDS_BIGENDIAN +#if DBPP == 15 // GGGBBBBBxRRRRRGG -> xRRRRRGGGGGBBBBB +#define PMAKE(_VAL) (((_VAL>>8)&0x00FF)|((_VAL<<8)&0xFF00)) +#elif DBPP == 16 // gggBBBBBxRRRRRGg -> RRRRRGggggGBBBBB +#define PMAKE(_VAL) (((_VAL>>8)&0x001F)|((_VAL>>7)&0x01C0)|((_VAL<<9)&0xFE00)|((_VAL<<4)&0x0020)) +#elif DBPP == 32 // GggBBBbbxRRRrrGG -> 00000000RRRrrRRRGGGggGGGBBBbbBBB +#define PMAKE(_VAL) (((_VAL<<17)&0x00F80000)|((_VAL<<12)&0x00070000)|((_VAL<<14)&0x0000C000)|((_VAL>>2)&0x00003800)|((_VAL<<9)&0x00000600)|((_VAL>>7)&0x00000100)|((_VAL>>5)&0x000000F8)|((_VAL>>10)&0x00000007)) +#endif +#else #if DBPP == 15 #define PMAKE(_VAL) (_VAL) -#elif DBPP == 16 -#define PMAKE(_VAL) (((_VAL) & 31) | ((_VAL) & ~31) << 1) -#elif DBPP == 32 -#define PMAKE(_VAL) (((_VAL&(31<<10))<<9)|((_VAL&(31<<5))<<6)|((_VAL&31)<<3)) +#elif DBPP == 16 // xRRRRRGggggBBBBB -> RRRRRGggggGBBBBB +#define PMAKE(_VAL) ((_VAL & 31)|((_VAL & ~31)<<1)|((_VAL&0x0200)>>4)) +#elif DBPP == 32 // xRRRrrGGGggBBBbb -> RRRrrRRRGGGggGGGBBBbbBBB +#define PMAKE(_VAL) (((_VAL&(31<<10))<<9)|((_VAL&(31<<5))<<6)|((_VAL&31)<<3)|((_VAL&(7<<12))<<4)|((_VAL&(7<<7))<<1)|((_VAL&(7<<2))>>2)) +#endif #endif #define SRCTYPE Bit16u #endif #if SBPP == 16 #define SC scalerSourceCache.b16 -#if DBPP == 15 -#define PMAKE(_VAL) (((_VAL&~31)>>1)|(_VAL&31)) +#ifdef WORDS_BIGENDIAN +#if DBPP == 15 // GGgBBBBBRRRRRGGG -> 0RRRRRGGGGGBBBBB +#define PMAKE(_VAL) (((_VAL>>8)&0x001F)|((_VAL>>9)&0x0060)|((_VAL<<7)&0x7F80)) +#elif DBPP == 16 // GGGBBBBBRRRRRGGG -> RRRRRGGGGGGBBBBB +#define PMAKE(_VAL) (((_VAL>>8)&0x00FF)|((_VAL<<8)&0xFF00)) +#elif DBPP == 32 // gggBBBbbRRRrrGGg -> RRRrrRRRGGggggGGBBBbbBBB +#define PMAKE(_VAL) (((_VAL<<16)&0x00F80000)|((_VAL<<11)&0x00070000)|((_VAL<<13)&0x0000E000)|((_VAL>>3)&0x00001C00)|((_VAL<<7)&0x00000300)|((_VAL>>5)&0x000000F8)|((_VAL>>10)&0x00000007)) +#endif +#else +#if DBPP == 15 // RRRRRGGGGGgBBBBB -> 0RRRRRGGGGGBBBBB +#define PMAKE(_VAL) (((_VAL&~63)>>1)|(_VAL&31)) #elif DBPP == 16 #define PMAKE(_VAL) (_VAL) -#elif DBPP == 32 -#define PMAKE(_VAL) (((_VAL&(31<<11))<<8)|((_VAL&(63<<5))<<5)|((_VAL&31)<<3)) +#elif DBPP == 32 // RRRrrGGggggBBBbb -> RRRrrRRRGGggggGGBBBbbBBB +#define PMAKE(_VAL) (((_VAL&(31<<11))<<8)|((_VAL&(63<<5))<<5)|((_VAL&0xE01F)<<3)|((_VAL&(3<<9))>>1)|((_VAL&(7<<2))>>2)) +#endif #endif #define SRCTYPE Bit16u #endif #if SBPP == 32 #define SC scalerSourceCache.b32 -#if DBPP == 15 +#ifdef WORDS_BIGENDIAN +#if DBPP == 15 // BBBBBbbbGGGGGgggRRRRRrrrxxxxxxxx -> 0RRRRRGGGGGBBBBB +#define PMAKE(_VAL) (PTYPE)(((_VAL>>27)&0x001F)|((_VAL>>14)&0x03E0)|((_VAL>>1)&0x7C00)) +#elif DBPP == 16 // BBBBBbbbGGGGGGggRRRRRrrrxxxxxxxx -> RRRRRGGGGGGBBBBB +#define PMAKE(_VAL) (PTYPE)(((_VAL>>27)&0x001F)|((_VAL>>13)&0x07E0)|(_VAL&0xF800)) +#elif DBPP == 32 // BBBBBBBBGGGGGGGGRRRRRRRRxxxxxxxx -> RRRRRRRRGGGGGGGGBBBBBBBB +#define PMAKE(_VAL) (((_VAL>>24)&0x000000FF)|((_VAL>>8)&0x0000FF00)|((_VAL<<8)&0x00FF0000)) +#endif +#else +#if DBPP == 15 // RRRRRrrrGGGGGgggBBBBBbbb -> 0RRRRRGGGGGBBBBB #define PMAKE(_VAL) (PTYPE)(((_VAL&(31<<19))>>9)|((_VAL&(31<<11))>>6)|((_VAL&(31<<3))>>3)) -#elif DBPP == 16 -#define PMAKE(_VAL) (PTYPE)(((_VAL&(31<<19))>>8)|((_VAL&(63<<10))>>4)|((_VAL&(31<<3))>>3)) +#elif DBPP == 16 // RRRRRrrrGGGGGGggBBBBBbbb -> RRRRRGGGGGGBBBBB +#define PMAKE(_VAL) (PTYPE)(((_VAL&(31<<19))>>8)|((_VAL&(63<<10))>>5)|((_VAL&(31<<3))>>3)) #elif DBPP == 32 #define PMAKE(_VAL) (_VAL) #endif +#endif #define SRCTYPE Bit32u #endif