| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Copyright 2013 Dolphin Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2011-01-10 13:14:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #ifndef _DATAREADER_H
 | 
					
						
							|  |  |  | #define _DATAREADER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 13:45:48 +01:00
										 |  |  | #include "VertexManagerBase.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | extern u8* g_pVideoData; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-10 13:14:56 +00:00
										 |  |  | #if _M_SSE >= 0x301 && !(defined __GNUC__ && !defined __SSSE3__)
 | 
					
						
							|  |  |  | #include <tmmintrin.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline void DataSkip(u32 skip) | 
					
						
							| 
									
										
										
										
											2009-08-09 11:03:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	g_pVideoData += skip; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | // probably unnecessary
 | 
					
						
							|  |  |  | template <int count> | 
					
						
							|  |  |  | __forceinline void DataSkip() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	g_pVideoData += count; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <typename T> | 
					
						
							|  |  |  | __forceinline T DataPeek(int _uOffset) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	auto const result = Common::FromBigEndian(*reinterpret_cast<T*>(g_pVideoData + _uOffset)); | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TODO: kill these
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u8 DataPeek8(int _uOffset) | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataPeek<u8>(_uOffset); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u16 DataPeek16(int _uOffset) | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataPeek<u16>(_uOffset); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u32 DataPeek32(int _uOffset)	 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataPeek<u32>(_uOffset); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | template <typename T> | 
					
						
							|  |  |  | __forceinline T DataRead() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	auto const result = DataPeek<T>(0); | 
					
						
							|  |  |  | 	DataSkip<sizeof(T)>(); | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TODO: kill these
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u8 DataReadU8() | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataRead<u8>(); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline s8 DataReadS8() | 
					
						
							| 
									
										
										
										
											2009-09-13 21:18:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataRead<s8>(); | 
					
						
							| 
									
										
										
										
											2009-09-13 21:18:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u16 DataReadU16() | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataRead<u16>(); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u32 DataReadU32() | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-20 20:21:25 -06:00
										 |  |  | 	return DataRead<u32>(); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-10 13:14:56 +00:00
										 |  |  | typedef void (*DataReadU32xNfunc)(u32 *buf); | 
					
						
							|  |  |  | extern DataReadU32xNfunc DataReadU32xFuncs[16]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if _M_SSE >= 0x301
 | 
					
						
							| 
									
										
										
										
											2011-01-11 07:25:36 +00:00
										 |  |  | const __m128i bs_mask = _mm_set_epi32(0x0C0D0E0FL, 0x08090A0BL, 0x04050607L, 0x00010203L); | 
					
						
							| 
									
										
										
										
											2011-01-10 13:14:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | template<unsigned int N> | 
					
						
							|  |  |  | void DataReadU32xN_SSSE3(u32 *bufx16) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-11 04:54:35 +00:00
										 |  |  | 	memcpy(bufx16, g_pVideoData, sizeof(u32) * N); | 
					
						
							|  |  |  | 	__m128i* buf = (__m128i *)bufx16; | 
					
						
							| 
									
										
										
										
											2011-01-11 07:25:36 +00:00
										 |  |  | 	if (N>12) { _mm_store_si128(buf, _mm_shuffle_epi8(_mm_load_si128(buf), bs_mask)); buf++; } | 
					
						
							|  |  |  | 	if (N>8)  { _mm_store_si128(buf, _mm_shuffle_epi8(_mm_load_si128(buf), bs_mask)); buf++; } | 
					
						
							|  |  |  | 	if (N>4)  { _mm_store_si128(buf, _mm_shuffle_epi8(_mm_load_si128(buf), bs_mask)); buf++; } | 
					
						
							|  |  |  | 	_mm_store_si128(buf, _mm_shuffle_epi8(_mm_load_si128(buf), bs_mask)); | 
					
						
							| 
									
										
										
										
											2011-01-10 13:14:56 +00:00
										 |  |  | 	g_pVideoData += (sizeof(u32) * N); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-30 19:17:08 +00:00
										 |  |  | template<unsigned int N> | 
					
						
							|  |  |  | void DataReadU32xN(u32 *bufx16) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	memcpy(bufx16, g_pVideoData, sizeof(u32) * N); | 
					
						
							|  |  |  | 	if (N >= 1) bufx16[0] = Common::swap32(bufx16[0]); | 
					
						
							|  |  |  | 	if (N >= 2) bufx16[1] = Common::swap32(bufx16[1]); | 
					
						
							|  |  |  | 	if (N >= 3) bufx16[2] = Common::swap32(bufx16[2]); | 
					
						
							|  |  |  | 	if (N >= 4) bufx16[3] = Common::swap32(bufx16[3]); | 
					
						
							|  |  |  | 	if (N >= 5) bufx16[4] = Common::swap32(bufx16[4]); | 
					
						
							|  |  |  | 	if (N >= 6) bufx16[5] = Common::swap32(bufx16[5]); | 
					
						
							|  |  |  | 	if (N >= 7) bufx16[6] = Common::swap32(bufx16[6]); | 
					
						
							|  |  |  | 	if (N >= 8) bufx16[7] = Common::swap32(bufx16[7]); | 
					
						
							|  |  |  | 	if (N >= 9) bufx16[8] = Common::swap32(bufx16[8]); | 
					
						
							|  |  |  | 	if (N >= 10) bufx16[9] = Common::swap32(bufx16[9]); | 
					
						
							|  |  |  | 	if (N >= 11) bufx16[10] = Common::swap32(bufx16[10]); | 
					
						
							|  |  |  | 	if (N >= 12) bufx16[11] = Common::swap32(bufx16[11]); | 
					
						
							|  |  |  | 	if (N >= 13) bufx16[12] = Common::swap32(bufx16[12]); | 
					
						
							|  |  |  | 	if (N >= 14) bufx16[13] = Common::swap32(bufx16[13]); | 
					
						
							|  |  |  | 	if (N >= 15) bufx16[14] = Common::swap32(bufx16[14]); | 
					
						
							|  |  |  | 	if (N >= 16) bufx16[15] = Common::swap32(bufx16[15]); | 
					
						
							|  |  |  | 	g_pVideoData += (sizeof(u32) * N); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u32 DataReadU32Unswapped() | 
					
						
							| 
									
										
										
										
											2009-02-15 13:08:21 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	u32 tmp = *(u32*)g_pVideoData; | 
					
						
							|  |  |  | 	g_pVideoData += 4; | 
					
						
							|  |  |  | 	return tmp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 05:31:51 +00:00
										 |  |  | __forceinline u8* DataGetPosition() | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return g_pVideoData; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 13:45:48 +01:00
										 |  |  | template <typename T> | 
					
						
							|  |  |  | __forceinline void DataWrite(T data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	*(T*)VertexManager::s_pCurBufferPointer = data; | 
					
						
							|  |  |  | 	VertexManager::s_pCurBufferPointer += sizeof(T); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #endif
 |