mirror of
https://github.com/holub/mame
synced 2025-06-05 04:16:28 +03:00
voodoo: Use table lookup for RGB565 conversion. (nw)
This commit is contained in:
parent
602c57e10d
commit
7d17b6a569
@ -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); \
|
||||
|
@ -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, ®[0x100], tmumem[0], tmumem0 << 20);
|
||||
|
@ -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 */
|
||||
};
|
||||
|
||||
|
||||
|
@ -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; }
|
||||
|
Loading…
Reference in New Issue
Block a user