| 
									
										
										
										
											2015-05-24 06:32:32 +02:00
										 |  |  | // Copyright 2010 Dolphin Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2+
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-20 21:49:49 -05:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2013-02-26 22:47:50 -06:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2015-12-20 21:49:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-21 02:01:38 -04:00
										 |  |  | #include "Common/CommonFuncs.h"
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2013-02-26 22:47:50 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-31 14:51:55 -05:00
										 |  |  | class DataReader; | 
					
						
							| 
									
										
										
										
											2010-11-26 09:25:08 +00:00
										 |  |  | class NativeVertexFormat; | 
					
						
							| 
									
										
										
										
											2012-01-04 00:42:22 -08:00
										 |  |  | class PointerWrap; | 
					
						
							| 
									
										
										
										
											2016-01-17 16:54:31 -05:00
										 |  |  | struct PortableVertexDeclaration; | 
					
						
							| 
									
										
										
										
											2010-11-26 09:25:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | enum PrimitiveType | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PRIMITIVE_POINTS, | 
					
						
							|  |  |  |   PRIMITIVE_LINES, | 
					
						
							|  |  |  |   PRIMITIVE_TRIANGLES, | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-13 02:55:25 -07:00
										 |  |  | struct Slope | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   float dfdx; | 
					
						
							|  |  |  |   float dfdy; | 
					
						
							|  |  |  |   float f0; | 
					
						
							|  |  |  |   bool dirty; | 
					
						
							| 
									
										
										
										
											2015-01-13 02:55:25 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-01 22:54:41 +01:00
										 |  |  | class VertexManagerBase | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-21 23:12:53 -06:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-10-01 03:37:17 -04:00
										 |  |  |   // 3 pos
 | 
					
						
							|  |  |  |   static constexpr u32 SMALLEST_POSSIBLE_VERTEX = sizeof(float) * 3; | 
					
						
							|  |  |  |   // 3 pos, 3*3 normal, 2*u32 color, 8*4 tex, 1 posMat
 | 
					
						
							|  |  |  |   static constexpr u32 LARGEST_POSSIBLE_VERTEX = sizeof(float) * 45 + sizeof(u32) * 2; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-01 03:37:17 -04:00
										 |  |  |   static constexpr u32 MAX_PRIMITIVES_PER_COMMAND = 65535; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-10-01 03:37:17 -04:00
										 |  |  |   static constexpr u32 MAXVBUFFERSIZE = | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |       ROUND_UP_POW2(MAX_PRIMITIVES_PER_COMMAND * LARGEST_POSSIBLE_VERTEX); | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // We may convert triangle-fans to triangle-lists, almost 3x as many indices.
 | 
					
						
							| 
									
										
										
										
											2016-10-01 03:37:17 -04:00
										 |  |  |   static constexpr u32 MAXIBUFFERSIZE = ROUND_UP_POW2(MAX_PRIMITIVES_PER_COMMAND * 3); | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   VertexManagerBase(); | 
					
						
							|  |  |  |   // needs to be virtual for DX11's dtor
 | 
					
						
							|  |  |  |   virtual ~VertexManagerBase(); | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   DataReader PrepareForAdditionalData(int primitive, u32 count, u32 stride, bool cullall); | 
					
						
							|  |  |  |   void FlushData(u32 count, u32 stride); | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   void Flush(); | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual NativeVertexFormat* | 
					
						
							|  |  |  |   CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl) = 0; | 
					
						
							| 
									
										
										
										
											2010-11-26 09:25:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   void DoState(PointerWrap& p); | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual void vDoState(PointerWrap& p) {} | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   PrimitiveType m_current_primitive_type = PrimitiveType::PRIMITIVE_POINTS; | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual void ResetBuffer(u32 stride) = 0; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   u8* m_cur_buffer_pointer = nullptr; | 
					
						
							|  |  |  |   u8* m_base_buffer_pointer = nullptr; | 
					
						
							|  |  |  |   u8* m_end_buffer_pointer = nullptr; | 
					
						
							| 
									
										
										
										
											2014-12-09 08:35:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   u32 GetRemainingSize() const; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static u32 GetRemainingIndices(int primitive); | 
					
						
							| 
									
										
										
										
											2014-12-09 08:35:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   Slope m_zslope = {}; | 
					
						
							|  |  |  |   void CalculateZSlope(NativeVertexFormat* format); | 
					
						
							| 
									
										
										
										
											2015-01-13 02:55:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   bool m_cull_all = false; | 
					
						
							| 
									
										
										
										
											2015-01-24 14:37:20 +13:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 13:11:38 +01:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-08-21 23:02:37 -04:00
										 |  |  |   bool m_is_flushed = true; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-28 01:37:41 +01:00
										 |  |  |   virtual void vFlush() = 0; | 
					
						
							| 
									
										
										
										
											2014-12-09 08:35:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual void CreateDeviceObjects() {} | 
					
						
							|  |  |  |   virtual void DestroyDeviceObjects() {} | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-20 21:49:49 -05:00
										 |  |  | extern std::unique_ptr<VertexManagerBase> g_vertex_manager; |