summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/video/rgbgen.c22
-rw-r--r--src/emu/video/rgbgen.h20
-rw-r--r--src/emu/video/rgbsse.c32
-rw-r--r--src/emu/video/rgbsse.h39
-rw-r--r--src/emu/video/rgbvmx.c29
-rw-r--r--src/emu/video/rgbvmx.h29
-rw-r--r--src/emu/video/vooddefs.h4
7 files changed, 91 insertions, 84 deletions
diff --git a/src/emu/video/rgbgen.c b/src/emu/video/rgbgen.c
index ea5a7ef32ed..934219108f2 100644
--- a/src/emu/video/rgbgen.c
+++ b/src/emu/video/rgbgen.c
@@ -109,26 +109,4 @@ void rgbaint_t::scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& oth
if ((UINT16)m_b > 255) { m_b = (m_b < 0) ? 0 : 255; }
}
-
-/*-------------------------------------------------
- bilinear_filter - bilinear filter between
- four pixel values; this code is derived from
- code provided by Michael Herf
--------------------------------------------------*/
-
-UINT32 rgbaint_t::bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v)
-{
- UINT32 ag0, ag1, rb0, rb1;
-
- rb0 = (rgb00 & 0x00ff00ff) + ((((rgb01 & 0x00ff00ff) - (rgb00 & 0x00ff00ff)) * u) >> 8);
- rb1 = (rgb10 & 0x00ff00ff) + ((((rgb11 & 0x00ff00ff) - (rgb10 & 0x00ff00ff)) * u) >> 8);
- ag0 = (rgb00 & 0xff00ff00) + ((((rgb01 & 0xff00ff00) - (rgb00 & 0xff00ff00)) * u) >> 8);
- ag1 = (rgb10 & 0xff00ff00) + ((((rgb11 & 0xff00ff00) - (rgb10 & 0xff00ff00)) * u) >> 8);
-
- rb0 = (rb0 & 0x00ff00ff) + ((((rb1 & 0x00ff00ff) - (rb0 & 0x00ff00ff)) * v) >> 8);
- ag0 = (ag0 & 0xff00ff00) + ((((ag1 & 0xff00ff00) - (ag0 & 0xff00ff00)) * v) >> 8);
-
- return (ag0 & 0xff00ff00) | (rb0 & 0x00ff00ff);
-}
-
#endif // !defined(__ALTIVEC__)
diff --git a/src/emu/video/rgbgen.h b/src/emu/video/rgbgen.h
index 6bb2edb78d6..45d62c8c083 100644
--- a/src/emu/video/rgbgen.h
+++ b/src/emu/video/rgbgen.h
@@ -20,6 +20,7 @@ class rgbaint_t
{
public:
inline rgbaint_t() { }
+ inline rgbaint_t(UINT32 rgba) { set(rgba); }
inline rgbaint_t(UINT32 a, UINT32 r, UINT32 g, UINT32 b) { set(a, r, g, b); }
inline rgbaint_t(rgb_t& rgba) { set(rgba); }
@@ -454,7 +455,24 @@ public:
return *this;
}
- static UINT32 bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v);
+ static UINT32 bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v)
+ {
+ UINT32 rb0 = (rgb00 & 0x00ff00ff) + ((((rgb01 & 0x00ff00ff) - (rgb00 & 0x00ff00ff)) * u) >> 8);
+ UINT32 rb1 = (rgb10 & 0x00ff00ff) + ((((rgb11 & 0x00ff00ff) - (rgb10 & 0x00ff00ff)) * u) >> 8);
+
+ rgb00 >>= 8;
+ rgb01 >>= 8;
+ rgb10 >>= 8;
+ rgb11 >>= 8;
+
+ UINT32 ag0 = (rgb00 & 0x00ff00ff) + ((((rgb01 & 0x00ff00ff) - (rgb00 & 0x00ff00ff)) * u) >> 8);
+ UINT32 ag1 = (rgb10 & 0x00ff00ff) + ((((rgb11 & 0x00ff00ff) - (rgb10 & 0x00ff00ff)) * u) >> 8);
+
+ rb0 = (rb0 & 0x00ff00ff) + ((((rb1 & 0x00ff00ff) - (rb0 & 0x00ff00ff)) * v) >> 8);
+ ag0 = (ag0 & 0x00ff00ff) + ((((ag1 & 0x00ff00ff) - (ag0 & 0x00ff00ff)) * v) >> 8);
+
+ return ((ag0 << 8) & 0xff00ff00) | (rb0 & 0x00ff00ff);
+ }
protected:
UINT32 m_a;
diff --git a/src/emu/video/rgbsse.c b/src/emu/video/rgbsse.c
index 2340c0a6925..b4e3701a187 100644
--- a/src/emu/video/rgbsse.c
+++ b/src/emu/video/rgbsse.c
@@ -14,7 +14,7 @@
#include "emu.h"
#include <emmintrin.h>
-#include "rgbutil.h"
+#include "rgbsse.h"
/***************************************************************************
HIGHER LEVEL OPERATIONS
@@ -32,6 +32,7 @@ void rgbaint_t::scale_and_clamp(const rgbaint_t& scale)
mul(scale);
shr(8);
min(255);
+ max(0);
}
void rgbaint_t::scale_imm_and_clamp(const INT32 scale)
@@ -39,11 +40,11 @@ void rgbaint_t::scale_imm_and_clamp(const INT32 scale)
mul_imm(scale);
shr(8);
min(255);
+ max(0);
}
void rgbaint_t::scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& other, const rgbaint_t& scale2)
{
- mul(scale);
rgbaint_t color2(other);
color2.mul(scale2);
@@ -51,6 +52,7 @@ void rgbaint_t::scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& oth
add(color2);
shr(8);
min(255);
+ max(0);
}
void rgbaint_t::scale_imm_add_and_clamp(const INT32 scale, const rgbaint_t& other)
@@ -59,6 +61,7 @@ void rgbaint_t::scale_imm_add_and_clamp(const INT32 scale, const rgbaint_t& othe
add(other);
shr(8);
min(255);
+ max(0);
}
void rgbaint_t::scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& other)
@@ -67,30 +70,7 @@ void rgbaint_t::scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& oth
add(other);
shr(8);
min(255);
-}
-
-UINT32 rgbaint_t::bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v)
-{
- __m128i color00 = _mm_cvtsi32_si128(rgb00);
- __m128i color01 = _mm_cvtsi32_si128(rgb01);
- __m128i color10 = _mm_cvtsi32_si128(rgb10);
- __m128i color11 = _mm_cvtsi32_si128(rgb11);
-
- /* interleave color01 and color00 at the byte level */
- color01 = _mm_unpacklo_epi8(color01, color00);
- color11 = _mm_unpacklo_epi8(color11, color10);
- color01 = _mm_unpacklo_epi8(color01, _mm_setzero_si128());
- color11 = _mm_unpacklo_epi8(color11, _mm_setzero_si128());
- color01 = _mm_madd_epi16(color01, *(__m128i *)&rgbsse_statics.scale_table[u][0]);
- color11 = _mm_madd_epi16(color11, *(__m128i *)&rgbsse_statics.scale_table[u][0]);
- color01 = _mm_slli_epi32(color01, 15);
- color11 = _mm_srli_epi32(color11, 1);
- color01 = _mm_max_epi16(color01, color11);
- color01 = _mm_madd_epi16(color01, *(__m128i *)&rgbsse_statics.scale_table[v][0]);
- color01 = _mm_srli_epi32(color01, 15);
- color01 = _mm_packs_epi32(color01, color01);
- color01 = _mm_packus_epi16(color01, color01);
- return _mm_cvtsi128_si32(color01);
+ max(0);
}
#endif // defined(__SSE2__) || defined(_MSC_VER)
diff --git a/src/emu/video/rgbsse.h b/src/emu/video/rgbsse.h
index f5fdabfbed7..47716fd19e6 100644
--- a/src/emu/video/rgbsse.h
+++ b/src/emu/video/rgbsse.h
@@ -49,8 +49,12 @@ public:
inline rgb_t to_rgba()
{
- __m128i anded = _mm_and_si128(m_value, _mm_set1_epi32(0x000000ff));
- return _mm_cvtsi128_si32(_mm_packus_epi16(_mm_packs_epi32(anded, anded), _mm_setzero_si128()));
+ return _mm_cvtsi128_si32(_mm_packus_epi16(_mm_packs_epi32(m_value, _mm_setzero_si128()), _mm_setzero_si128()));
+ }
+
+ inline UINT32 to_argb8()
+ {
+ return _mm_cvtsi128_si32(_mm_packus_epi16(_mm_packs_epi32(m_value, _mm_setzero_si128()), _mm_setzero_si128()));
}
inline rgb_t to_rgba_clamp()
@@ -296,6 +300,13 @@ public:
m_value = _mm_or_si128(_mm_and_si128(val, mask), _mm_and_si128(m_value, _mm_xor_si128(mask, _mm_set1_epi32(0xffffffff))));
}
+ inline void max(const UINT32 value)
+ {
+ __m128i val = _mm_set1_epi32(value);
+ __m128i mask = _mm_cmplt_epi32(m_value, val);
+ m_value = _mm_or_si128(_mm_and_si128(val, mask), _mm_and_si128(m_value, _mm_xor_si128(mask, _mm_set1_epi32(0xffffffff))));
+ }
+
void blend(const rgbaint_t& other, UINT8 factor);
void scale_and_clamp(const rgbaint_t& scale);
@@ -398,7 +409,29 @@ public:
m_value = _mm_insert_epi16(m_value, _mm_extract_epi16(alpha.m_value, 6), 6);
}
- static UINT32 bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v);
+ static UINT32 bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v)
+ {
+ __m128i color00 = _mm_cvtsi32_si128(rgb00);
+ __m128i color01 = _mm_cvtsi32_si128(rgb01);
+ __m128i color10 = _mm_cvtsi32_si128(rgb10);
+ __m128i color11 = _mm_cvtsi32_si128(rgb11);
+
+ /* interleave color01 and color00 at the byte level */
+ color01 = _mm_unpacklo_epi8(color01, color00);
+ color11 = _mm_unpacklo_epi8(color11, color10);
+ color01 = _mm_unpacklo_epi8(color01, _mm_setzero_si128());
+ color11 = _mm_unpacklo_epi8(color11, _mm_setzero_si128());
+ color01 = _mm_madd_epi16(color01, *(__m128i *)&rgbsse_statics.scale_table[u][0]);
+ color11 = _mm_madd_epi16(color11, *(__m128i *)&rgbsse_statics.scale_table[u][0]);
+ color01 = _mm_slli_epi32(color01, 15);
+ color11 = _mm_srli_epi32(color11, 1);
+ color01 = _mm_max_epi16(color01, color11);
+ color01 = _mm_madd_epi16(color01, *(__m128i *)&rgbsse_statics.scale_table[v][0]);
+ color01 = _mm_srli_epi32(color01, 15);
+ color01 = _mm_packs_epi32(color01, _mm_setzero_si128());
+ color01 = _mm_packus_epi16(color01, _mm_setzero_si128());
+ return _mm_cvtsi128_si32(color01);
+ }
protected:
__m128i m_value;
diff --git a/src/emu/video/rgbvmx.c b/src/emu/video/rgbvmx.c
index ced9ea6f995..146632aa2de 100644
--- a/src/emu/video/rgbvmx.c
+++ b/src/emu/video/rgbvmx.c
@@ -209,33 +209,4 @@ void rgbaint_t::scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& oth
min(255);
}
-UINT32 rgbaint_t::bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v)
-{
- const VECS32 zero = vec_splat_s32(0);
-
- VECS32 color00 = vec_perm((VECS32)vec_lde(0, &rgb00), zero, vec_lvsl(0, &rgb00));
- VECS32 color01 = vec_perm((VECS32)vec_lde(0, &rgb01), zero, vec_lvsl(0, &rgb01));
- VECS32 color10 = vec_perm((VECS32)vec_lde(0, &rgb10), zero, vec_lvsl(0, &rgb10));
- VECS32 color11 = vec_perm((VECS32)vec_lde(0, &rgb11), zero, vec_lvsl(0, &rgb11));
-
- /* interleave color01 and color00 at the byte level */
- color01 = vec_mergeh((VECU8)color01, (VECU8)color00);
- color11 = vec_mergeh((VECU8)color11, (VECU8)color10);
- color01 = vec_mergeh((VECU8)zero, (VECU8)color01);
- color11 = vec_mergeh((VECU8)zero, (VECU8)color11);
- color01 = vec_msum((VECS16)color01, scale_table[u], zero);
- color11 = vec_msum((VECS16)color11, scale_table[u], zero);
- color01 = vec_sl(color01, vec_splat_u32(15));
- color11 = vec_sr(color11, vec_splat_u32(1));
- color01 = vec_max((VECS16)color01, (VECS16)color11);
- color01 = vec_msum((VECS16)color01, scale_table[v], zero);
- color01 = vec_sr(color01, vec_splat_u32(15));
- color01 = vec_packs(color01, color01);
- color01 = vec_packsu((VECS16)color01, (VECS16)color01);
-
- UINT32 result;
- vec_ste((VECU32)color01, 0, &result);
- return result;
-}
-
#endif // defined(__ALTIVEC__)
diff --git a/src/emu/video/rgbvmx.h b/src/emu/video/rgbvmx.h
index 24a6e3a748e..5f1cb71acdb 100644
--- a/src/emu/video/rgbvmx.h
+++ b/src/emu/video/rgbvmx.h
@@ -457,7 +457,34 @@ public:
m_value = vec_perm(m_value, alpha.m_value, alpha_perm);
}
- static UINT32 bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v);
+ static UINT32 bilinear_filter(UINT32 rgb00, UINT32 rgb01, UINT32 rgb10, UINT32 rgb11, UINT8 u, UINT8 v)
+ {
+ const VECS32 zero = vec_splat_s32(0);
+
+ VECS32 color00 = vec_perm((VECS32)vec_lde(0, &rgb00), zero, vec_lvsl(0, &rgb00));
+ VECS32 color01 = vec_perm((VECS32)vec_lde(0, &rgb01), zero, vec_lvsl(0, &rgb01));
+ VECS32 color10 = vec_perm((VECS32)vec_lde(0, &rgb10), zero, vec_lvsl(0, &rgb10));
+ VECS32 color11 = vec_perm((VECS32)vec_lde(0, &rgb11), zero, vec_lvsl(0, &rgb11));
+
+ /* interleave color01 and color00 at the byte level */
+ color01 = vec_mergeh((VECU8)color01, (VECU8)color00);
+ color11 = vec_mergeh((VECU8)color11, (VECU8)color10);
+ color01 = vec_mergeh((VECU8)zero, (VECU8)color01);
+ color11 = vec_mergeh((VECU8)zero, (VECU8)color11);
+ color01 = vec_msum((VECS16)color01, scale_table[u], zero);
+ color11 = vec_msum((VECS16)color11, scale_table[u], zero);
+ color01 = vec_sl(color01, vec_splat_u32(15));
+ color11 = vec_sr(color11, vec_splat_u32(1));
+ color01 = vec_max((VECS16)color01, (VECS16)color11);
+ color01 = vec_msum((VECS16)color01, scale_table[v], zero);
+ color01 = vec_sr(color01, vec_splat_u32(15));
+ color01 = vec_packs(color01, color01);
+ color01 = vec_packsu((VECS16)color01, (VECS16)color01);
+
+ UINT32 result;
+ vec_ste((VECU32)color01, 0, &result);
+ return result;
+ }
protected:
typedef vector unsigned char VECU8;
diff --git a/src/emu/video/vooddefs.h b/src/emu/video/vooddefs.h
index 352d68497d4..a45640143d1 100644
--- a/src/emu/video/vooddefs.h
+++ b/src/emu/video/vooddefs.h
@@ -24,7 +24,7 @@ enum
};
// Use old macro style or newer SSE2 optimized functions
-#define USE_OLD_RASTER 1
+#define USE_OLD_RASTER 0
/* maximum number of TMUs */
#define MAX_TMU 2
@@ -2219,7 +2219,7 @@ INLINE UINT32 clampARGB(INT32 iterr, INT32 iterg, INT32 iterb, INT32 itera, UINT
temp.set(colorint);
temp.cmpeq_imm(0x100);
// result.rgb.r = 0xff;
-
+ colorint.or_reg(temp);
return colorint.to_rgba();
}
else