diff options
author | 2019-07-12 09:28:34 +1000 | |
---|---|---|
committer | 2019-07-12 09:28:34 +1000 | |
commit | 4e17bb120c26c4ec3ffc8407438f6d09b1da5e86 (patch) | |
tree | 20583b3ca381731b76940e28334bcfdab9719188 /src/emu | |
parent | df99ce2ec0e82020a6fee89f4ffaf7f1468fec31 (diff) | |
parent | 9214a78d705f3b83c3ea45534cf1d8355c1cb9c5 (diff) |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/rendersw.hxx | 194 |
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; |