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,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 @@ -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 // rasterization by using RGB add @@ -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;