| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-11 01:48:38 -08:00
										 |  |  | #include <type_traits>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-17 16:54:31 -05:00
										 |  |  | #include "Common/CommonFuncs.h"
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-31 14:51:55 -05:00
										 |  |  | #include "VideoCommon/DataReader.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoCommon/VertexLoader.h"
 | 
					
						
							| 
									
										
										
										
											2015-05-30 00:42:45 +12:00
										 |  |  | #include "VideoCommon/VertexLoaderManager.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-17 16:54:31 -05:00
										 |  |  | #include "VideoCommon/VertexLoaderUtils.h"
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #include "VideoCommon/VertexLoader_TextCoord.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | template <int N> | 
					
						
							|  |  |  | void LOG_TEX(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							| 
									
										
										
										
											2016-01-17 16:54:31 -05:00
										 |  |  | void LOG_TEX<1>() | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // warning: mapping buffer should be disabled to use this
 | 
					
						
							|  |  |  |   // PRIM_LOG("tex: %f, ", ((float*)g_vertex_manager_write_ptr)[-1]);
 | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							| 
									
										
										
										
											2016-01-17 16:54:31 -05:00
										 |  |  | void LOG_TEX<2>() | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // warning: mapping buffer should be disabled to use this
 | 
					
						
							|  |  |  |   // PRIM_LOG("tex: %f %f, ", ((float*)g_vertex_manager_write_ptr)[-2],
 | 
					
						
							|  |  |  |   // ((float*)g_vertex_manager_write_ptr)[-1]);
 | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-19 15:18:16 -04:00
										 |  |  | static void TexCoord_Read_Dummy(VertexLoader* loader) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   loader->m_tcIndex++; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | template <typename T> | 
					
						
							| 
									
										
										
										
											2014-01-21 18:54:16 +01:00
										 |  |  | float TCScale(T val, float scale) | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return val * scale; | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <> | 
					
						
							| 
									
										
										
										
											2014-01-21 18:54:16 +01:00
										 |  |  | float TCScale(float val, float scale) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return val; | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-20 20:43:53 -06:00
										 |  |  | template <typename T, int N> | 
					
						
							| 
									
										
										
										
											2015-06-19 15:18:16 -04:00
										 |  |  | void TexCoord_ReadDirect(VertexLoader* loader) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   auto const scale = loader->m_tcScale[loader->m_tcIndex]; | 
					
						
							|  |  |  |   DataReader dst(g_vertex_manager_write_ptr, nullptr); | 
					
						
							|  |  |  |   DataReader src(g_video_buffer_read_ptr, nullptr); | 
					
						
							| 
									
										
										
										
											2014-01-21 18:54:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   for (int i = 0; i != N; ++i) | 
					
						
							|  |  |  |     dst.Write(TCScale(src.Read<T>(), scale)); | 
					
						
							| 
									
										
										
										
											2013-02-21 00:40:22 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   g_vertex_manager_write_ptr = dst.GetPointer(); | 
					
						
							|  |  |  |   g_video_buffer_read_ptr = src.GetPointer(); | 
					
						
							|  |  |  |   LOG_TEX<N>(); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:51:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   ++loader->m_tcIndex; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-20 20:43:53 -06:00
										 |  |  | template <typename I, typename T, int N> | 
					
						
							| 
									
										
										
										
											2015-06-19 15:18:16 -04:00
										 |  |  | void TexCoord_ReadIndex(VertexLoader* loader) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static_assert(std::is_unsigned<I>::value, "Only unsigned I is sane!"); | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   auto const index = DataRead<I>(); | 
					
						
							|  |  |  |   auto const data = reinterpret_cast<const T*>( | 
					
						
							|  |  |  |       VertexLoaderManager::cached_arraybases[ARRAY_TEXCOORD0 + loader->m_tcIndex] + | 
					
						
							|  |  |  |       (index * g_main_cp_state.array_strides[ARRAY_TEXCOORD0 + loader->m_tcIndex])); | 
					
						
							|  |  |  |   auto const scale = loader->m_tcScale[loader->m_tcIndex]; | 
					
						
							|  |  |  |   DataReader dst(g_vertex_manager_write_ptr, nullptr); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:51:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   for (int i = 0; i != N; ++i) | 
					
						
							|  |  |  |     dst.Write(TCScale(Common::FromBigEndian(data[i]), scale)); | 
					
						
							| 
									
										
										
										
											2013-03-19 21:51:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   g_vertex_manager_write_ptr = dst.GetPointer(); | 
					
						
							|  |  |  |   LOG_TEX<N>(); | 
					
						
							|  |  |  |   ++loader->m_tcIndex; | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-09 03:02:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | static TPipelineFunction tableReadTexCoord[4][8][2] = { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             nullptr, nullptr, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             nullptr, nullptr, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             nullptr, nullptr, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             nullptr, nullptr, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             nullptr, nullptr, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadDirect<u8, 1>, TexCoord_ReadDirect<u8, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadDirect<s8, 1>, TexCoord_ReadDirect<s8, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadDirect<u16, 1>, TexCoord_ReadDirect<u16, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadDirect<s16, 1>, TexCoord_ReadDirect<s16, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadDirect<float, 1>, TexCoord_ReadDirect<float, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u8, u8, 1>, TexCoord_ReadIndex<u8, u8, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u8, s8, 1>, TexCoord_ReadIndex<u8, s8, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u8, u16, 1>, TexCoord_ReadIndex<u8, u16, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u8, s16, 1>, TexCoord_ReadIndex<u8, s16, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u8, float, 1>, TexCoord_ReadIndex<u8, float, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u16, u8, 1>, TexCoord_ReadIndex<u16, u8, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u16, s8, 1>, TexCoord_ReadIndex<u16, s8, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u16, u16, 1>, TexCoord_ReadIndex<u16, u16, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u16, s16, 1>, TexCoord_ReadIndex<u16, s16, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             TexCoord_ReadIndex<u16, float, 1>, TexCoord_ReadIndex<u16, float, 2>, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2010-02-28 11:36:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | static int tableReadTexCoordVertexSize[4][8][2] = { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             0, 0, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             0, 0, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             0, 0, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             0, 0, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             0, 0, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 4, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 4, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             4, 8, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             2, 2, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2010-02-28 11:36:00 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | unsigned int VertexLoader_TextCoord::GetSize(u64 _type, unsigned int _format, | 
					
						
							|  |  |  |                                              unsigned int _elements) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return tableReadTexCoordVertexSize[_type][_format][_elements]; | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | TPipelineFunction VertexLoader_TextCoord::GetFunction(u64 _type, unsigned int _format, | 
					
						
							|  |  |  |                                                       unsigned int _elements) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return tableReadTexCoord[_type][_format][_elements]; | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | TPipelineFunction VertexLoader_TextCoord::GetDummyFunction() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return TexCoord_Read_Dummy; | 
					
						
							| 
									
										
										
										
											2010-04-09 15:13:42 +00:00
										 |  |  | } |