diff options
author | 2015-06-23 20:58:21 +0200 | |
---|---|---|
committer | 2015-06-23 21:02:59 +0200 | |
commit | 1bef19e984cffcc052b0b3b9b57a6ecddde43e37 (patch) | |
tree | 8f44826909bc99102261fa80f857095d58a51cff /src/emu/video/rgbsse.h | |
parent | 0dcf906e4a9f3442e035a8d6f0d5efeb8f7ed513 (diff) |
rdp-sse (nw) Proper fix for bilinear_filter
Diffstat (limited to 'src/emu/video/rgbsse.h')
-rw-r--r-- | src/emu/video/rgbsse.h | 39 |
1 files changed, 36 insertions, 3 deletions
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; |