summaryrefslogtreecommitdiffstats
path: root/src/emu
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2019-07-12 09:28:34 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2019-07-12 09:28:34 +1000
commit4e17bb120c26c4ec3ffc8407438f6d09b1da5e86 (patch)
tree20583b3ca381731b76940e28334bcfdab9719188 /src/emu
parentdf99ce2ec0e82020a6fee89f4ffaf7f1468fec31 (diff)
parent9214a78d705f3b83c3ea45534cf1d8355c1cb9c5 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/rendersw.hxx194
1 files changed, 97 insertions, 97 deletions
diff --git a/src/emu/rendersw.hxx b/src/emu/rendersw.hxx
index 8dbf28b35b3..b1a032258d1 100644
--- a/src/emu/rendersw.hxx
+++ b/src/emu/rendersw.hxx
@@ -1296,23 +1296,22 @@ private:
}
-
- //**************************************************************************
- // 32-BIT ARGB QUAD RASTERIZERS
- //**************************************************************************
-
//-------------------------------------------------
- // draw_quad_argb32_alpha - perform
- // rasterization using standard alpha blending
+ // draw_quad_rgb32_multiply - perform
+ // rasterization using RGB multiply
//-------------------------------------------------
- static void draw_quad_argb32_alpha(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
+ 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))
{
@@ -1330,42 +1329,28 @@ private:
for (s32 x = setup.startx; x < endx; x++)
{
u32 pix = get_texel_argb32(prim.texture, curu, curv);
- u32 ta = pix >> 24;
- if (ta != 0)
- {
- u32 dpix = _NoDestRead ? 0 : *dest;
- u32 invta = 0x100 - ta;
- u32 r = (source32_r(pix) * ta + dest_r(dpix) * invta) >> 8;
- u32 g = (source32_g(pix) * ta + dest_g(dpix) * invta) >> 8;
- u32 b = (source32_b(pix) * ta + dest_b(dpix) * invta) >> 8;
+ 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);
- }
- dest++;
+ *dest++ = dest_assemble_rgb(r, g, b);
curu += dudx;
curv += dvdx;
}
}
-
- // lookup case
else
{
// loop over cols
for (s32 x = setup.startx; x < endx; x++)
{
u32 pix = get_texel_argb32(prim.texture, curu, curv);
- u32 ta = pix >> 24;
- if (ta != 0)
- {
- u32 dpix = _NoDestRead ? 0 : *dest;
- u32 invta = 0x100 - ta;
- u32 r = ((palbase[(pix >> 16) & 0xff] >> _SrcShiftR) * ta + dest_r(dpix) * invta) >> 8;
- u32 g = ((palbase[(pix >> 8) & 0xff] >> _SrcShiftG) * ta + dest_g(dpix) * invta) >> 8;
- u32 b = ((palbase[(pix >> 0) & 0xff] >> _SrcShiftB) * ta + dest_b(dpix) * invta) >> 8;
+ 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);
- }
- dest++;
+ *dest++ = dest_assemble_rgb(r, g, b);
curu += dudx;
curv += dvdx;
}
@@ -1376,16 +1361,14 @@ private:
// alpha and/or coloring case
else
{
- u32 sr = u32(256.0f * prim.color.r);
- u32 sg = u32(256.0f * prim.color.g);
- u32 sb = u32(256.0f * prim.color.b);
- u32 sa = u32(256.0f * prim.color.a);
+ 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
+ // 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; }
- if (sa > 0x100) { if (s32(sa) < 0) sa = 0; else sa = 0x100; }
// loop over rows
for (s32 y = setup.starty; y < setup.endy; y++)
@@ -1401,43 +1384,28 @@ private:
for (s32 x = setup.startx; x < endx; x++)
{
u32 pix = get_texel_argb32(prim.texture, curu, curv);
- u32 ta = (pix >> 24) * sa;
- if (ta != 0)
- {
- u32 dpix = _NoDestRead ? 0 : *dest;
- u32 invsta = (0x10000 - ta) << 8;
- u32 r = (source32_r(pix) * sr * ta + dest_r(dpix) * invsta) >> 24;
- u32 g = (source32_g(pix) * sg * ta + dest_g(dpix) * invsta) >> 24;
- u32 b = (source32_b(pix) * sb * ta + dest_b(dpix) * invsta) >> 24;
+ 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);
- }
- dest++;
+ *dest++ = dest_assemble_rgb(r, g, b);
curu += dudx;
curv += dvdx;
}
}
-
-
- // lookup case
else
{
// loop over cols
for (s32 x = setup.startx; x < endx; x++)
{
u32 pix = get_texel_argb32(prim.texture, curu, curv);
- u32 ta = (pix >> 24) * sa;
- if (ta != 0)
- {
- u32 dpix = _NoDestRead ? 0 : *dest;
- u32 invsta = (0x10000 - ta) << 8;
- u32 r = ((palbase[(pix >> 16) & 0xff] >> _SrcShiftR) * sr * ta + dest_r(dpix) * invsta) >> 24;
- u32 g = ((palbase[(pix >> 8) & 0xff] >> _SrcShiftG) * sg * ta + dest_g(dpix) * invsta) >> 24;
- u32 b = ((palbase[(pix >> 0) & 0xff] >> _SrcShiftB) * sb * ta + dest_b(dpix) * invsta) >> 24;
+ 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);
- }
- dest++;
+ *dest++ = dest_assemble_rgb(r, g, b);
curu += dudx;
curv += dvdx;
}
@@ -1447,22 +1415,22 @@ private:
}
+ //**************************************************************************
+ // 32-BIT ARGB QUAD RASTERIZERS
+ //**************************************************************************
+
//-------------------------------------------------
- // draw_quad_argb32_multiply - perform
- // rasterization using RGB multiply
+ // draw_quad_argb32_alpha - perform
+ // rasterization using standard alpha blending
//-------------------------------------------------
- static void draw_quad_argb32_multiply(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
+ static void draw_quad_argb32_alpha(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))
{
@@ -1480,28 +1448,42 @@ private:
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);
+ u32 ta = pix >> 24;
+ if (ta != 0)
+ {
+ u32 dpix = _NoDestRead ? 0 : *dest;
+ u32 invta = 0x100 - ta;
+ u32 r = (source32_r(pix) * ta + dest_r(dpix) * invta) >> 8;
+ u32 g = (source32_g(pix) * ta + dest_g(dpix) * invta) >> 8;
+ u32 b = (source32_b(pix) * ta + dest_b(dpix) * invta) >> 8;
- *dest++ = dest_assemble_rgb(r, g, b);
+ *dest = dest_assemble_rgb(r, g, b);
+ }
+ dest++;
curu += dudx;
curv += dvdx;
}
}
+
+ // lookup case
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;
+ u32 ta = pix >> 24;
+ if (ta != 0)
+ {
+ u32 dpix = _NoDestRead ? 0 : *dest;
+ u32 invta = 0x100 - ta;
+ u32 r = ((palbase[(pix >> 16) & 0xff] >> _SrcShiftR) * ta + dest_r(dpix) * invta) >> 8;
+ u32 g = ((palbase[(pix >> 8) & 0xff] >> _SrcShiftG) * ta + dest_g(dpix) * invta) >> 8;
+ u32 b = ((palbase[(pix >> 0) & 0xff] >> _SrcShiftB) * ta + dest_b(dpix) * invta) >> 8;
- *dest++ = dest_assemble_rgb(r, g, b);
+ *dest = dest_assemble_rgb(r, g, b);
+ }
+ dest++;
curu += dudx;
curv += dvdx;
}
@@ -1512,14 +1494,16 @@ private:
// 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);
+ u32 sr = u32(256.0f * prim.color.r);
+ u32 sg = u32(256.0f * prim.color.g);
+ u32 sb = u32(256.0f * prim.color.b);
+ u32 sa = u32(256.0f * 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; }
+ if (sa > 0x100) { if (s32(sa) < 0) sa = 0; else sa = 0x100; }
// loop over rows
for (s32 y = setup.starty; y < setup.endy; y++)
@@ -1535,28 +1519,43 @@ private:
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);
+ u32 ta = (pix >> 24) * sa;
+ if (ta != 0)
+ {
+ u32 dpix = _NoDestRead ? 0 : *dest;
+ u32 invsta = (0x10000 - ta) << 8;
+ u32 r = (source32_r(pix) * sr * ta + dest_r(dpix) * invsta) >> 24;
+ u32 g = (source32_g(pix) * sg * ta + dest_g(dpix) * invsta) >> 24;
+ u32 b = (source32_b(pix) * sb * ta + dest_b(dpix) * invsta) >> 24;
- *dest++ = dest_assemble_rgb(r, g, b);
+ *dest = dest_assemble_rgb(r, g, b);
+ }
+ dest++;
curu += dudx;
curv += dvdx;
}
}
+
+
+ // lookup case
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;
+ u32 ta = (pix >> 24) * sa;
+ if (ta != 0)
+ {
+ u32 dpix = _NoDestRead ? 0 : *dest;
+ u32 invsta = (0x10000 - ta) << 8;
+ u32 r = ((palbase[(pix >> 16) & 0xff] >> _SrcShiftR) * sr * ta + dest_r(dpix) * invsta) >> 24;
+ u32 g = ((palbase[(pix >> 8) & 0xff] >> _SrcShiftG) * sg * ta + dest_g(dpix) * invsta) >> 24;
+ u32 b = ((palbase[(pix >> 0) & 0xff] >> _SrcShiftB) * sb * ta + dest_b(dpix) * invsta) >> 24;
- *dest++ = dest_assemble_rgb(r, g, b);
+ *dest = dest_assemble_rgb(r, g, b);
+ }
+ dest++;
curu += dudx;
curv += dvdx;
}
@@ -1803,6 +1802,11 @@ private:
draw_quad_rgb32(prim, dstdata, pitch, setup);
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):
draw_quad_rgb32_add(prim, dstdata, pitch, setup);
break;
@@ -1811,10 +1815,6 @@ private:
draw_quad_argb32_alpha(prim, dstdata, pitch, setup);
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):
draw_quad_argb32_add(prim, dstdata, pitch, setup);
break;