| 
									
										
										
										
											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-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-10 19:06:19 -04:00
										 |  |  | #include "Common/MathUtil.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-30 18:07:57 +10:00
										 |  |  | #include "VideoCommon/RenderState.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  | #include "VideoCommon/ShaderCache.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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 = | 
					
						
							| 
									
										
										
										
											2018-05-10 19:06:19 -04:00
										 |  |  |       MathUtil::NextPowerOf2(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.
 | 
					
						
							| 
									
										
										
										
											2018-05-10 19:06:19 -04:00
										 |  |  |   static constexpr u32 MAXIBUFFERSIZE = MathUtil::NextPowerOf2(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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 18:07:57 +10:00
										 |  |  |   PrimitiveType GetCurrentPrimitiveType() const { return m_current_primitive_type; } | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-18 03:14:30 -05:00
										 |  |  |   virtual std::unique_ptr<NativeVertexFormat> | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-03 14:36:51 -08:00
										 |  |  |   std::pair<size_t, size_t> ResetFlushAspectRatioCount(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  |   // State setters, called from register update functions.
 | 
					
						
							|  |  |  |   void SetRasterizationStateChanged() { m_rasterization_state_changed = true; } | 
					
						
							|  |  |  |   void SetDepthStateChanged() { m_depth_state_changed = true; } | 
					
						
							|  |  |  |   void SetBlendingStateChanged() { m_blending_state_changed = true; } | 
					
						
							|  |  |  |   void InvalidatePipelineObject() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     m_current_pipeline_object = nullptr; | 
					
						
							|  |  |  |     m_pipeline_config_changed = true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual void vDoState(PointerWrap& p) {} | 
					
						
							|  |  |  |   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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 19:21:06 +10:00
										 |  |  |   VideoCommon::GXPipelineUid m_current_pipeline_config; | 
					
						
							|  |  |  |   VideoCommon::GXUberPipelineUid m_current_uber_pipeline_config; | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  |   const AbstractPipeline* m_current_pipeline_object = nullptr; | 
					
						
							| 
									
										
										
										
											2017-04-30 18:07:57 +10:00
										 |  |  |   PrimitiveType m_current_primitive_type = PrimitiveType::Points; | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  |   bool m_pipeline_config_changed = true; | 
					
						
							|  |  |  |   bool m_rasterization_state_changed = true; | 
					
						
							|  |  |  |   bool m_depth_state_changed = true; | 
					
						
							|  |  |  |   bool m_blending_state_changed = true; | 
					
						
							|  |  |  |   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; | 
					
						
							| 
									
										
										
										
											2017-03-03 14:36:51 -08:00
										 |  |  |   size_t m_flush_count_4_3 = 0; | 
					
						
							|  |  |  |   size_t m_flush_count_anamorphic = 0; | 
					
						
							| 
									
										
										
										
											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() {} | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  |   void UpdatePipelineConfig(); | 
					
						
							|  |  |  |   void UpdatePipelineObject(); | 
					
						
							| 
									
										
										
										
											2010-10-03 08:20:24 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-20 21:49:49 -05:00
										 |  |  | extern std::unique_ptr<VertexManagerBase> g_vertex_manager; |