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:
hap 2019-07-11 18:10:50 +02:00
parent 0065559bd7
commit dcc2b9ec83

View File

@ -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;