mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 22:00:05 +00:00 
			
		
		
		
	Fix geometry pipeline; attempt to fix motion controls
This commit is contained in:
		
							parent
							
								
									35c3ca995c
								
							
						
					
					
						commit
						0effb229cd
					
				
					 2 changed files with 17 additions and 7 deletions
				
			
		|  | @ -40,7 +40,9 @@ void Module::serialize(Archive& ar, const unsigned int) { | ||||||
|     ar& next_gyroscope_index; |     ar& next_gyroscope_index; | ||||||
|     ar& enable_accelerometer_count; |     ar& enable_accelerometer_count; | ||||||
|     ar& enable_gyroscope_count; |     ar& enable_gyroscope_count; | ||||||
|     ReloadInputDevices(); |     if (Archive::is_loading::value) { | ||||||
|  |         LoadInputDevices(); | ||||||
|  |     } | ||||||
|     // Pad state not needed as it's always updated
 |     // Pad state not needed as it's always updated
 | ||||||
|     // Update events are set in the constructor
 |     // Update events are set in the constructor
 | ||||||
|     // Devices are set from the implementation (and are stateless afaik)
 |     // Devices are set from the implementation (and are stateless afaik)
 | ||||||
|  |  | ||||||
|  | @ -49,7 +49,7 @@ private: | ||||||
| // TODO: what happens when the input size is not divisible by the output size?
 | // TODO: what happens when the input size is not divisible by the output size?
 | ||||||
| class GeometryPipeline_Point : public GeometryPipelineBackend { | class GeometryPipeline_Point : public GeometryPipelineBackend { | ||||||
| public: | public: | ||||||
|     GeometryPipeline_Point() : regs(g_state.regs), unit(g_state.gs_unit) { |     GeometryPipeline_Point(const Regs& regs, Shader::GSUnitState& unit) : regs(regs), unit(unit) { | ||||||
|         ASSERT(regs.pipeline.variable_primitive == 0); |         ASSERT(regs.pipeline.variable_primitive == 0); | ||||||
|         ASSERT(regs.gs.input_to_uniform == 0); |         ASSERT(regs.gs.input_to_uniform == 0); | ||||||
|         vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; |         vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; | ||||||
|  | @ -89,6 +89,8 @@ private: | ||||||
|     Common::Vec4<float24>* buffer_end; |     Common::Vec4<float24>* buffer_end; | ||||||
|     unsigned int vs_output_num; |     unsigned int vs_output_num; | ||||||
| 
 | 
 | ||||||
|  |     GeometryPipeline_Point() : regs(g_state.regs), unit(g_state.gs_unit) {} | ||||||
|  | 
 | ||||||
|     template <typename Class, class Archive> |     template <typename Class, class Archive> | ||||||
|     static void serialize_common(Class* self, Archive& ar, const unsigned int version) { |     static void serialize_common(Class* self, Archive& ar, const unsigned int version) { | ||||||
|         ar& boost::serialization::base_object<GeometryPipelineBackend>(*self); |         ar& boost::serialization::base_object<GeometryPipelineBackend>(*self); | ||||||
|  | @ -125,7 +127,8 @@ private: | ||||||
| // value in the batch. This mode is usually used for subdivision.
 | // value in the batch. This mode is usually used for subdivision.
 | ||||||
| class GeometryPipeline_VariablePrimitive : public GeometryPipelineBackend { | class GeometryPipeline_VariablePrimitive : public GeometryPipelineBackend { | ||||||
| public: | public: | ||||||
|     GeometryPipeline_VariablePrimitive() : regs(g_state.regs), setup(g_state.gs) { |     GeometryPipeline_VariablePrimitive(const Regs& regs, Shader::ShaderSetup& setup) | ||||||
|  |         : regs(regs), setup(setup) { | ||||||
|         ASSERT(regs.pipeline.variable_primitive == 1); |         ASSERT(regs.pipeline.variable_primitive == 1); | ||||||
|         ASSERT(regs.gs.input_to_uniform == 1); |         ASSERT(regs.gs.input_to_uniform == 1); | ||||||
|         vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; |         vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; | ||||||
|  | @ -183,6 +186,8 @@ private: | ||||||
|     Common::Vec4<float24>* buffer_cur; |     Common::Vec4<float24>* buffer_cur; | ||||||
|     unsigned int vs_output_num; |     unsigned int vs_output_num; | ||||||
| 
 | 
 | ||||||
|  |     GeometryPipeline_VariablePrimitive() : regs(g_state.regs), setup(g_state.gs) {} | ||||||
|  | 
 | ||||||
|     template <typename Class, class Archive> |     template <typename Class, class Archive> | ||||||
|     static void serialize_common(Class* self, Archive& ar, const unsigned int version) { |     static void serialize_common(Class* self, Archive& ar, const unsigned int version) { | ||||||
|         ar& boost::serialization::base_object<GeometryPipelineBackend>(*self); |         ar& boost::serialization::base_object<GeometryPipelineBackend>(*self); | ||||||
|  | @ -217,7 +222,8 @@ private: | ||||||
| // particle system.
 | // particle system.
 | ||||||
| class GeometryPipeline_FixedPrimitive : public GeometryPipelineBackend { | class GeometryPipeline_FixedPrimitive : public GeometryPipelineBackend { | ||||||
| public: | public: | ||||||
|     GeometryPipeline_FixedPrimitive() : regs(g_state.regs), setup(g_state.gs) { |     GeometryPipeline_FixedPrimitive(const Regs& regs, Shader::ShaderSetup& setup) | ||||||
|  |         : regs(regs), setup(setup) { | ||||||
|         ASSERT(regs.pipeline.variable_primitive == 0); |         ASSERT(regs.pipeline.variable_primitive == 0); | ||||||
|         ASSERT(regs.gs.input_to_uniform == 1); |         ASSERT(regs.gs.input_to_uniform == 1); | ||||||
|         vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; |         vs_output_num = regs.pipeline.vs_outmap_total_minus_1_a + 1; | ||||||
|  | @ -256,6 +262,8 @@ private: | ||||||
|     Common::Vec4<float24>* buffer_end; |     Common::Vec4<float24>* buffer_end; | ||||||
|     unsigned int vs_output_num; |     unsigned int vs_output_num; | ||||||
| 
 | 
 | ||||||
|  |     GeometryPipeline_FixedPrimitive() : regs(g_state.regs), setup(g_state.gs) {} | ||||||
|  | 
 | ||||||
|     template <typename Class, class Archive> |     template <typename Class, class Archive> | ||||||
|     static void serialize_common(Class* self, Archive& ar, const unsigned int version) { |     static void serialize_common(Class* self, Archive& ar, const unsigned int version) { | ||||||
|         ar& boost::serialization::base_object<GeometryPipelineBackend>(*self); |         ar& boost::serialization::base_object<GeometryPipelineBackend>(*self); | ||||||
|  | @ -329,13 +337,13 @@ void GeometryPipeline::Reconfigure() { | ||||||
| 
 | 
 | ||||||
|     switch (state.regs.pipeline.gs_config.mode) { |     switch (state.regs.pipeline.gs_config.mode) { | ||||||
|     case PipelineRegs::GSMode::Point: |     case PipelineRegs::GSMode::Point: | ||||||
|         backend = std::make_unique<GeometryPipeline_Point>(); |         backend = std::make_unique<GeometryPipeline_Point>(state.regs, state.gs_unit); | ||||||
|         break; |         break; | ||||||
|     case PipelineRegs::GSMode::VariablePrimitive: |     case PipelineRegs::GSMode::VariablePrimitive: | ||||||
|         backend = std::make_unique<GeometryPipeline_VariablePrimitive>(); |         backend = std::make_unique<GeometryPipeline_VariablePrimitive>(state.regs, state.gs); | ||||||
|         break; |         break; | ||||||
|     case PipelineRegs::GSMode::FixedPrimitive: |     case PipelineRegs::GSMode::FixedPrimitive: | ||||||
|         backend = std::make_unique<GeometryPipeline_FixedPrimitive>(); |         backend = std::make_unique<GeometryPipeline_FixedPrimitive>(state.regs, state.gs); | ||||||
|         break; |         break; | ||||||
|     default: |     default: | ||||||
|         UNREACHABLE(); |         UNREACHABLE(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue