summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Ted Green <tedgreen99@protonmail.com>2017-10-01 15:09:02 -0600
committer Ted Green <tedgreen99@protonmail.com>2017-10-01 15:39:53 -0600
commit7d17b6a56984b8ab83b89d30b3fc3129f448294e (patch)
tree38eda817457e0c7c2bcfd88107f1ef3c824c958b
parent602c57e10d8c08d1d659c4edf23873dd020cd897 (diff)
voodoo: Use table lookup for RGB565 conversion. (nw)
-rw-r--r--src/devices/video/vooddefs.h8
-rw-r--r--src/devices/video/voodoo.cpp43
-rw-r--r--src/devices/video/voodoo.h3
-rw-r--r--src/lib/util/palette.h2
4 files changed, 43 insertions, 13 deletions
diff --git a/src/devices/video/vooddefs.h b/src/devices/video/vooddefs.h
index 13cd7d1d925..27ffc81e434 100644
--- a/src/devices/video/vooddefs.h
+++ b/src/devices/video/vooddefs.h
@@ -1006,13 +1006,15 @@ do
} \
while (0)
-static inline void ATTR_FORCE_INLINE alphaBlend(uint32_t FBZMODE, uint32_t ALPHAMODE, int32_t x, const uint8_t *dither, int dpix, uint16_t *depth, rgbaint_t &preFog, rgbaint_t &srcColor)
+static inline void ATTR_FORCE_INLINE alphaBlend(uint32_t FBZMODE, uint32_t ALPHAMODE, int32_t x, const uint8_t *dither, int dpix, uint16_t *depth, rgbaint_t &preFog, rgbaint_t &srcColor, rgb_t *convTable)
{
if (ALPHAMODE_ALPHABLEND(ALPHAMODE))
{
//int dpix = dest[XX];
int dr, dg, db;
- EXTRACT_565_TO_888(dpix, dr, dg, db);
+ //EXTRACT_565_TO_888(dpix, dr, dg, db);
+ rgb_t drgb = convTable[dpix];
+ drgb.expand_rgb(dr, dg, db);
int da = FBZMODE_ENABLE_ALPHA_PLANES(FBZMODE) ? depth[x] : 0xff;
//int sr = (RR);
//int sg = (GG);
@@ -2049,7 +2051,7 @@ inline bool ATTR_FORCE_INLINE voodoo_device::depthTest(uint16_t zaColorReg, stat
preFog.set(color); \
applyFogging(vd, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \
/* perform alpha blending */ \
- alphaBlend(FBZMODE, ALPHAMODE, XX, DITHER, dest[XX], depth, preFog, color); \
+ alphaBlend(FBZMODE, ALPHAMODE, XX, DITHER, dest[XX], depth, preFog, color, vd->fbi.rgb565); \
a = color.get_a(); r = color.get_r(); g = color.get_g(); b = color.get_b(); \
/* modify the pixel for debugging purposes */ \
MODIFY_PIXEL(VV); \
diff --git a/src/devices/video/voodoo.cpp b/src/devices/video/voodoo.cpp
index 0d6a7b761a2..f0b029ebda0 100644
--- a/src/devices/video/voodoo.cpp
+++ b/src/devices/video/voodoo.cpp
@@ -471,6 +471,16 @@ void voodoo_device::init_fbi(voodoo_device* vd,fbi_state *f, void *memory, int f
vd->fbi.clut[pen] = rgb_t(pen,pen,pen);
}
+ // build static 16-bit rgb565 to rgb888 conversion table
+ for (int val = 0; val < 65536; val++)
+ {
+ int r, g, b;
+
+ /* table 10 = 16-bit RGB (5-6-5) */
+ EXTRACT_565_TO_888(val, r, g, b);
+ vd->fbi.rgb565[val] = rgb_t(0xff, r, g, b);
+ }
+
/* allocate a VBLANK timer */
f->vblank_timer = vd->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::vblank_callback),vd), vd);
f->vblank = false;
@@ -513,8 +523,7 @@ void voodoo_device::tmu_shared_state::init()
int r, g, b, a;
/* table 10 = 16-bit RGB (5-6-5) */
- EXTRACT_565_TO_888(val, r, g, b);
- rgb565[val] = rgb_t(0xff, r, g, b);
+ // Use frame buffer table
/* table 11 = 16 ARGB (1-5-5-5) */
EXTRACT_1555_TO_8888(val, a, r, g, b);
@@ -2951,9 +2960,11 @@ int32_t voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, uint32_t data, ui
{
uint16_t *dest, *depth;
uint32_t destmax, depthmax;
- int sr[2], sg[2], sb[2], sa[2], sz[2];
+ int sa[2], sz[2];
+ uint8_t sr[2], sg[2], sb[2];
int x, y, scry, mask;
int pix, destbuf;
+ rgb_t sourceColor;
/* statistics */
vd->stats.lfb_writes++;
@@ -2981,15 +2992,23 @@ int32_t voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, uint32_t data, ui
{
case 16*0 + 0: /* ARGB, 16-bit RGB 5-6-5 */
case 16*2 + 0: /* RGBA, 16-bit RGB 5-6-5 */
- EXTRACT_565_TO_888(data, sr[0], sg[0], sb[0]);
- EXTRACT_565_TO_888(data >> 16, sr[1], sg[1], sb[1]);
+ //EXTRACT_565_TO_888(data, sr[0], sg[0], sb[0]);
+ //EXTRACT_565_TO_888(data >> 16, sr[1], sg[1], sb[1]);
+ sourceColor = vd->fbi.rgb565[data & 0xffff];
+ sourceColor.expand_rgb(sr[0], sg[0], sb[0]);
+ sourceColor = vd->fbi.rgb565[data >> 16];
+ sourceColor.expand_rgb(sr[1], sg[1], sb[1]);
mask = LFB_RGB_PRESENT | (LFB_RGB_PRESENT << 4);
offset <<= 1;
break;
case 16*1 + 0: /* ABGR, 16-bit RGB 5-6-5 */
case 16*3 + 0: /* BGRA, 16-bit RGB 5-6-5 */
- EXTRACT_565_TO_888(data, sb[0], sg[0], sr[0]);
- EXTRACT_565_TO_888(data >> 16, sb[1], sg[1], sr[1]);
+ //EXTRACT_565_TO_888(data, sb[0], sg[0], sr[0]);
+ //EXTRACT_565_TO_888(data >> 16, sb[1], sg[1], sr[1]);
+ sourceColor = vd->fbi.rgb565[data & 0xffff];
+ sourceColor.expand_rgb(sb[0], sg[0], sr[0]);
+ sourceColor = vd->fbi.rgb565[data >> 16];
+ sourceColor.expand_rgb(sb[1], sg[1], sr[1]);
mask = LFB_RGB_PRESENT | (LFB_RGB_PRESENT << 4);
offset <<= 1;
break;
@@ -3081,13 +3100,17 @@ int32_t voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, uint32_t data, ui
case 16*0 + 12: /* ARGB, 32-bit depth+RGB 5-6-5 */
case 16*2 + 12: /* RGBA, 32-bit depth+RGB 5-6-5 */
sz[0] = data >> 16;
- EXTRACT_565_TO_888(data, sr[0], sg[0], sb[0]);
+ //EXTRACT_565_TO_888(data, sr[0], sg[0], sb[0]);
+ sourceColor = vd->fbi.rgb565[data & 0xffff];
+ sourceColor.expand_rgb(sr[0], sg[0], sb[0]);
mask = LFB_RGB_PRESENT | LFB_DEPTH_PRESENT_MSW;
break;
case 16*1 + 12: /* ABGR, 32-bit depth+RGB 5-6-5 */
case 16*3 + 12: /* BGRA, 32-bit depth+RGB 5-6-5 */
sz[0] = data >> 16;
- EXTRACT_565_TO_888(data, sb[0], sg[0], sr[0]);
+ //EXTRACT_565_TO_888(data, sb[0], sg[0], sr[0]);
+ sourceColor = vd->fbi.rgb565[data & 0xffff];
+ sourceColor.expand_rgb(sb[0], sg[0], sr[0]);
mask = LFB_RGB_PRESENT | LFB_DEPTH_PRESENT_MSW;
break;
@@ -5113,6 +5136,8 @@ void voodoo_device::device_start()
/* build shared TMU tables */
tmushare.init();
+ // Point the rgb565 table to the frame buffer table
+ tmushare.rgb565 = fbi.rgb565;
/* set up the TMUs */
tmu[0].init(vd_type, tmushare, &reg[0x100], tmumem[0], tmumem0 << 20);
diff --git a/src/devices/video/voodoo.h b/src/devices/video/voodoo.h
index 0856d9640f6..68afe368c22 100644
--- a/src/devices/video/voodoo.h
+++ b/src/devices/video/voodoo.h
@@ -1644,7 +1644,7 @@ protected:
rgb_t int8[256]; /* intensity 8-bit lookup table */
rgb_t ai44[256]; /* alpha, intensity 4-4 lookup table */
- rgb_t rgb565[65536]; /* RGB 5-6-5 lookup table */
+ rgb_t* rgb565; /* RGB 5-6-5 lookup table */
rgb_t argb1555[65536]; /* ARGB 1-5-5-5 lookup table */
rgb_t argb4444[65536]; /* ARGB 4-4-4-4 lookup table */
};
@@ -1723,6 +1723,7 @@ protected:
rgb_t pen[65536]; /* mapping from pixels to pens */
rgb_t clut[512]; /* clut gamma data */
uint8_t clut_dirty; /* do we need to recompute? */
+ rgb_t rgb565[65536]; /* RGB 5-6-5 lookup table */
};
diff --git a/src/lib/util/palette.h b/src/lib/util/palette.h
index 27e3fbd00c6..8febfe39764 100644
--- a/src/lib/util/palette.h
+++ b/src/lib/util/palette.h
@@ -48,6 +48,8 @@ public:
constexpr rgb15_t as_rgb15() const { return ((r() >> 3) << 10) | ((g() >> 3) << 5) | ((b() >> 3) << 0); }
constexpr uint8_t brightness() const { return (r() * 222 + g() * 707 + b() * 71) / 1000; }
constexpr uint32_t const *ptr() const { return &m_data; }
+ void expand_rgb(uint8_t &r, uint8_t &g, uint8_t &b) const { r = m_data >> 16; g = m_data >> 8; b = m_data >> 0; }
+ void expand_rgb(int &r, int &g, int &b) const { r = (m_data >> 16) & 0xff; g = (m_data >> 8) & 0xff; b = (m_data >> 0) & 0xff; }
// setters
rgb_t &set_a(uint8_t a) { m_data &= ~0xff000000; m_data |= a << 24; return *this; }