mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
rendersw: fix fatalerror with PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY). rename draw_quad_argb32_multiply to draw_quad_rgb32_multiply since it actually doesn't multiply per pixel alpha (nw)
This commit is contained in:
parent
0065559bd7
commit
dcc2b9ec83
@ -1296,6 +1296,124 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// draw_quad_rgb32_multiply - perform
|
||||||
|
// rasterization using RGB multiply
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
static void draw_quad_rgb32_multiply(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
|
||||||
|
{
|
||||||
|
const rgb_t *palbase = prim.texture.palette;
|
||||||
|
s32 dudx = setup.dudx;
|
||||||
|
s32 dvdx = setup.dvdx;
|
||||||
|
s32 endx = setup.endx;
|
||||||
|
|
||||||
|
// simply can't do this without reading from the dest
|
||||||
|
if (_NoDestRead)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// fast case: no coloring, no alpha
|
||||||
|
if (prim.color.r >= 1.0f && prim.color.g >= 1.0f && prim.color.b >= 1.0f && is_opaque(prim.color.a))
|
||||||
|
{
|
||||||
|
// loop over rows
|
||||||
|
for (s32 y = setup.starty; y < setup.endy; y++)
|
||||||
|
{
|
||||||
|
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
||||||
|
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
||||||
|
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
||||||
|
|
||||||
|
// no lookup case
|
||||||
|
if (palbase == nullptr)
|
||||||
|
{
|
||||||
|
// loop over cols
|
||||||
|
for (s32 x = setup.startx; x < endx; x++)
|
||||||
|
{
|
||||||
|
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||||
|
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||||
|
u32 r = (source32_r(pix) * dest_r(dpix)) >> (8 - _SrcShiftR);
|
||||||
|
u32 g = (source32_g(pix) * dest_g(dpix)) >> (8 - _SrcShiftG);
|
||||||
|
u32 b = (source32_b(pix) * dest_b(dpix)) >> (8 - _SrcShiftB);
|
||||||
|
|
||||||
|
*dest++ = dest_assemble_rgb(r, g, b);
|
||||||
|
curu += dudx;
|
||||||
|
curv += dvdx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// loop over cols
|
||||||
|
for (s32 x = setup.startx; x < endx; x++)
|
||||||
|
{
|
||||||
|
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||||
|
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||||
|
u32 r = (palbase[(pix >> 16) & 0xff] * dest_r(dpix)) >> 8;
|
||||||
|
u32 g = (palbase[(pix >> 8) & 0xff] * dest_g(dpix)) >> 8;
|
||||||
|
u32 b = (palbase[(pix >> 0) & 0xff] * dest_b(dpix)) >> 8;
|
||||||
|
|
||||||
|
*dest++ = dest_assemble_rgb(r, g, b);
|
||||||
|
curu += dudx;
|
||||||
|
curv += dvdx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// alpha and/or coloring case
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u32 sr = u32(256.0f * prim.color.r * prim.color.a);
|
||||||
|
u32 sg = u32(256.0f * prim.color.g * prim.color.a);
|
||||||
|
u32 sb = u32(256.0f * prim.color.b * prim.color.a);
|
||||||
|
|
||||||
|
// clamp R,G,B to 0-256 range
|
||||||
|
if (sr > 0x100) { if (s32(sr) < 0) sr = 0; else sr = 0x100; }
|
||||||
|
if (sg > 0x100) { if (s32(sg) < 0) sg = 0; else sg = 0x100; }
|
||||||
|
if (sb > 0x100) { if (s32(sb) < 0) sb = 0; else sb = 0x100; }
|
||||||
|
|
||||||
|
// loop over rows
|
||||||
|
for (s32 y = setup.starty; y < setup.endy; y++)
|
||||||
|
{
|
||||||
|
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
||||||
|
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
||||||
|
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
||||||
|
|
||||||
|
// no lookup case
|
||||||
|
if (palbase == nullptr)
|
||||||
|
{
|
||||||
|
// loop over cols
|
||||||
|
for (s32 x = setup.startx; x < endx; x++)
|
||||||
|
{
|
||||||
|
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||||
|
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||||
|
u32 r = (source32_r(pix) * sr * dest_r(dpix)) >> (16 - _SrcShiftR);
|
||||||
|
u32 g = (source32_g(pix) * sg * dest_g(dpix)) >> (16 - _SrcShiftG);
|
||||||
|
u32 b = (source32_b(pix) * sb * dest_b(dpix)) >> (16 - _SrcShiftB);
|
||||||
|
|
||||||
|
*dest++ = dest_assemble_rgb(r, g, b);
|
||||||
|
curu += dudx;
|
||||||
|
curv += dvdx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// loop over cols
|
||||||
|
for (s32 x = setup.startx; x < endx; x++)
|
||||||
|
{
|
||||||
|
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
||||||
|
u32 dpix = _NoDestRead ? 0 : *dest;
|
||||||
|
u32 r = (palbase[(pix >> 16) & 0xff] * sr * dest_r(dpix)) >> 16;
|
||||||
|
u32 g = (palbase[(pix >> 8) & 0xff] * sg * dest_g(dpix)) >> 16;
|
||||||
|
u32 b = (palbase[(pix >> 0) & 0xff] * sb * dest_b(dpix)) >> 16;
|
||||||
|
|
||||||
|
*dest++ = dest_assemble_rgb(r, g, b);
|
||||||
|
curu += dudx;
|
||||||
|
curv += dvdx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// 32-BIT ARGB QUAD RASTERIZERS
|
// 32-BIT ARGB QUAD RASTERIZERS
|
||||||
@ -1447,125 +1565,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
|
||||||
// draw_quad_argb32_multiply - perform
|
|
||||||
// rasterization using RGB multiply
|
|
||||||
//-------------------------------------------------
|
|
||||||
|
|
||||||
static void draw_quad_argb32_multiply(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
|
|
||||||
{
|
|
||||||
const rgb_t *palbase = prim.texture.palette;
|
|
||||||
s32 dudx = setup.dudx;
|
|
||||||
s32 dvdx = setup.dvdx;
|
|
||||||
s32 endx = setup.endx;
|
|
||||||
|
|
||||||
// simply can't do this without reading from the dest
|
|
||||||
if (_NoDestRead)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// fast case: no coloring, no alpha
|
|
||||||
if (prim.color.r >= 1.0f && prim.color.g >= 1.0f && prim.color.b >= 1.0f && is_opaque(prim.color.a))
|
|
||||||
{
|
|
||||||
// loop over rows
|
|
||||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
|
||||||
{
|
|
||||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
|
||||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
|
||||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
|
||||||
|
|
||||||
// no lookup case
|
|
||||||
if (palbase == nullptr)
|
|
||||||
{
|
|
||||||
// loop over cols
|
|
||||||
for (s32 x = setup.startx; x < endx; x++)
|
|
||||||
{
|
|
||||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
|
||||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
|
||||||
u32 r = (source32_r(pix) * dest_r(dpix)) >> (8 - _SrcShiftR);
|
|
||||||
u32 g = (source32_g(pix) * dest_g(dpix)) >> (8 - _SrcShiftG);
|
|
||||||
u32 b = (source32_b(pix) * dest_b(dpix)) >> (8 - _SrcShiftB);
|
|
||||||
|
|
||||||
*dest++ = dest_assemble_rgb(r, g, b);
|
|
||||||
curu += dudx;
|
|
||||||
curv += dvdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// loop over cols
|
|
||||||
for (s32 x = setup.startx; x < endx; x++)
|
|
||||||
{
|
|
||||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
|
||||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
|
||||||
u32 r = (palbase[(pix >> 16) & 0xff] * dest_r(dpix)) >> 8;
|
|
||||||
u32 g = (palbase[(pix >> 8) & 0xff] * dest_g(dpix)) >> 8;
|
|
||||||
u32 b = (palbase[(pix >> 0) & 0xff] * dest_b(dpix)) >> 8;
|
|
||||||
|
|
||||||
*dest++ = dest_assemble_rgb(r, g, b);
|
|
||||||
curu += dudx;
|
|
||||||
curv += dvdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// alpha and/or coloring case
|
|
||||||
else
|
|
||||||
{
|
|
||||||
u32 sr = u32(256.0f * prim.color.r * prim.color.a);
|
|
||||||
u32 sg = u32(256.0f * prim.color.g * prim.color.a);
|
|
||||||
u32 sb = u32(256.0f * prim.color.b * prim.color.a);
|
|
||||||
|
|
||||||
// clamp R,G,B and inverse A to 0-256 range
|
|
||||||
if (sr > 0x100) { if (s32(sr) < 0) sr = 0; else sr = 0x100; }
|
|
||||||
if (sg > 0x100) { if (s32(sg) < 0) sg = 0; else sg = 0x100; }
|
|
||||||
if (sb > 0x100) { if (s32(sb) < 0) sb = 0; else sb = 0x100; }
|
|
||||||
|
|
||||||
// loop over rows
|
|
||||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
|
||||||
{
|
|
||||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
|
||||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
|
||||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
|
||||||
|
|
||||||
// no lookup case
|
|
||||||
if (palbase == nullptr)
|
|
||||||
{
|
|
||||||
// loop over cols
|
|
||||||
for (s32 x = setup.startx; x < endx; x++)
|
|
||||||
{
|
|
||||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
|
||||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
|
||||||
u32 r = (source32_r(pix) * sr * dest_r(dpix)) >> (16 - _SrcShiftR);
|
|
||||||
u32 g = (source32_g(pix) * sg * dest_g(dpix)) >> (16 - _SrcShiftG);
|
|
||||||
u32 b = (source32_b(pix) * sb * dest_b(dpix)) >> (16 - _SrcShiftB);
|
|
||||||
|
|
||||||
*dest++ = dest_assemble_rgb(r, g, b);
|
|
||||||
curu += dudx;
|
|
||||||
curv += dvdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// loop over cols
|
|
||||||
for (s32 x = setup.startx; x < endx; x++)
|
|
||||||
{
|
|
||||||
u32 pix = get_texel_argb32(prim.texture, curu, curv);
|
|
||||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
|
||||||
u32 r = (palbase[(pix >> 16) & 0xff] * sr * dest_r(dpix)) >> 16;
|
|
||||||
u32 g = (palbase[(pix >> 8) & 0xff] * sg * dest_g(dpix)) >> 16;
|
|
||||||
u32 b = (palbase[(pix >> 0) & 0xff] * sb * dest_b(dpix)) >> 16;
|
|
||||||
|
|
||||||
*dest++ = dest_assemble_rgb(r, g, b);
|
|
||||||
curu += dudx;
|
|
||||||
curv += dvdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// draw_quad_argb32_add - perform
|
// draw_quad_argb32_add - perform
|
||||||
// rasterization by using RGB add
|
// rasterization by using RGB add
|
||||||
@ -1803,6 +1802,11 @@ private:
|
|||||||
draw_quad_rgb32(prim, dstdata, pitch, setup);
|
draw_quad_rgb32(prim, dstdata, pitch, setup);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY):
|
||||||
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY):
|
||||||
|
draw_quad_rgb32_multiply(prim, dstdata, pitch, setup);
|
||||||
|
break;
|
||||||
|
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD):
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD):
|
||||||
draw_quad_rgb32_add(prim, dstdata, pitch, setup);
|
draw_quad_rgb32_add(prim, dstdata, pitch, setup);
|
||||||
break;
|
break;
|
||||||
@ -1811,10 +1815,6 @@ private:
|
|||||||
draw_quad_argb32_alpha(prim, dstdata, pitch, setup);
|
draw_quad_argb32_alpha(prim, dstdata, pitch, setup);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY):
|
|
||||||
draw_quad_argb32_multiply(prim, dstdata, pitch, setup);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD):
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD):
|
||||||
draw_quad_argb32_add(prim, dstdata, pitch, setup);
|
draw_quad_argb32_add(prim, dstdata, pitch, setup);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user