mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 06:46:40 +08:00 
			
		
		
		
	Maxwell3D: read small-index draw and primitive topology override registers
This allows Galaxy and Sunshine to render for the first time.
This commit is contained in:
		
							parent
							
								
									e200161982
								
							
						
					
					
						commit
						f1521183f8
					
				| @ -208,6 +208,10 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume | |||||||
|         return ProcessCBBind(4); |         return ProcessCBBind(4); | ||||||
|     case MAXWELL3D_REG_INDEX(draw.vertex_end_gl): |     case MAXWELL3D_REG_INDEX(draw.vertex_end_gl): | ||||||
|         return DrawArrays(); |         return DrawArrays(); | ||||||
|  |     case MAXWELL3D_REG_INDEX(small_index): | ||||||
|  |         regs.index_array.count = regs.small_index.count; | ||||||
|  |         regs.index_array.first = regs.small_index.first; | ||||||
|  |         return DrawArrays(); | ||||||
|     case MAXWELL3D_REG_INDEX(clear_buffers): |     case MAXWELL3D_REG_INDEX(clear_buffers): | ||||||
|         return ProcessClearBuffers(); |         return ProcessClearBuffers(); | ||||||
|     case MAXWELL3D_REG_INDEX(query.query_get): |     case MAXWELL3D_REG_INDEX(query.query_get): | ||||||
| @ -360,6 +364,12 @@ void Maxwell3D::CallMethodFromMME(u32 method, u32 method_argument) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Maxwell3D::ProcessTopologyOverride() { | ||||||
|  |     if (regs.draw.topology != regs.topology_override) { | ||||||
|  |         regs.draw.topology.Assign(regs.topology_override); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Maxwell3D::FlushMMEInlineDraw() { | void Maxwell3D::FlushMMEInlineDraw() { | ||||||
|     LOG_TRACE(HW_GPU, "called, topology={}, count={}", regs.draw.topology.Value(), |     LOG_TRACE(HW_GPU, "called, topology={}, count={}", regs.draw.topology.Value(), | ||||||
|               regs.vertex_buffer.count); |               regs.vertex_buffer.count); | ||||||
| @ -370,6 +380,8 @@ void Maxwell3D::FlushMMEInlineDraw() { | |||||||
|     ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, |     ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, | ||||||
|                "Illegal combination of instancing parameters"); |                "Illegal combination of instancing parameters"); | ||||||
| 
 | 
 | ||||||
|  |     ProcessTopologyOverride(); | ||||||
|  | 
 | ||||||
|     const bool is_indexed = mme_draw.current_mode == MMEDrawMode::Indexed; |     const bool is_indexed = mme_draw.current_mode == MMEDrawMode::Indexed; | ||||||
|     if (ShouldExecute()) { |     if (ShouldExecute()) { | ||||||
|         rasterizer->Draw(is_indexed, true); |         rasterizer->Draw(is_indexed, true); | ||||||
| @ -529,6 +541,8 @@ void Maxwell3D::DrawArrays() { | |||||||
|     ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, |     ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, | ||||||
|                "Illegal combination of instancing parameters"); |                "Illegal combination of instancing parameters"); | ||||||
| 
 | 
 | ||||||
|  |     ProcessTopologyOverride(); | ||||||
|  | 
 | ||||||
|     if (regs.draw.instance_next) { |     if (regs.draw.instance_next) { | ||||||
|         // Increment the current instance *before* drawing.
 |         // Increment the current instance *before* drawing.
 | ||||||
|         state.current_instance += 1; |         state.current_instance += 1; | ||||||
|  | |||||||
| @ -1200,7 +1200,12 @@ public: | |||||||
|                     } |                     } | ||||||
|                 } index_array; |                 } index_array; | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS_NOINIT(0x7); |                 union { | ||||||
|  |                     BitField<0, 16, u32> first; | ||||||
|  |                     BitField<16, 16, u32> count; | ||||||
|  |                 } small_index; | ||||||
|  | 
 | ||||||
|  |                 INSERT_PADDING_WORDS_NOINIT(0x6); | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS_NOINIT(0x1F); |                 INSERT_PADDING_WORDS_NOINIT(0x1F); | ||||||
| 
 | 
 | ||||||
| @ -1244,7 +1249,11 @@ public: | |||||||
|                     BitField<11, 1, u32> depth_clamp_disabled; |                     BitField<11, 1, u32> depth_clamp_disabled; | ||||||
|                 } view_volume_clip_control; |                 } view_volume_clip_control; | ||||||
| 
 | 
 | ||||||
|                 INSERT_PADDING_WORDS_NOINIT(0x1F); |                 INSERT_PADDING_WORDS_NOINIT(0xC); | ||||||
|  | 
 | ||||||
|  |                 PrimitiveTopology topology_override; | ||||||
|  | 
 | ||||||
|  |                 INSERT_PADDING_WORDS_NOINIT(0x12); | ||||||
| 
 | 
 | ||||||
|                 u32 depth_bounds_enable; |                 u32 depth_bounds_enable; | ||||||
| 
 | 
 | ||||||
| @ -1531,6 +1540,9 @@ private: | |||||||
|     /// Handles a write to the VERTEX_END_GL register, triggering a draw.
 |     /// Handles a write to the VERTEX_END_GL register, triggering a draw.
 | ||||||
|     void DrawArrays(); |     void DrawArrays(); | ||||||
| 
 | 
 | ||||||
|  |     /// Handles use of topology overrides (e.g., to avoid using a topology assigned from a macro)
 | ||||||
|  |     void ProcessTopologyOverride(); | ||||||
|  | 
 | ||||||
|     // Handles a instance drawcall from MME
 |     // Handles a instance drawcall from MME
 | ||||||
|     void StepInstance(MMEDrawMode expected_mode, u32 count); |     void StepInstance(MMEDrawMode expected_mode, u32 count); | ||||||
| 
 | 
 | ||||||
| @ -1685,6 +1697,7 @@ ASSERT_REG_POSITION(draw, 0x585); | |||||||
| ASSERT_REG_POSITION(primitive_restart, 0x591); | ASSERT_REG_POSITION(primitive_restart, 0x591); | ||||||
| ASSERT_REG_POSITION(provoking_vertex_last, 0x5A1); | ASSERT_REG_POSITION(provoking_vertex_last, 0x5A1); | ||||||
| ASSERT_REG_POSITION(index_array, 0x5F2); | ASSERT_REG_POSITION(index_array, 0x5F2); | ||||||
|  | ASSERT_REG_POSITION(small_index, 0x5F9); | ||||||
| ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F); | ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F); | ||||||
| ASSERT_REG_POSITION(instanced_arrays, 0x620); | ASSERT_REG_POSITION(instanced_arrays, 0x620); | ||||||
| ASSERT_REG_POSITION(vp_point_size, 0x644); | ASSERT_REG_POSITION(vp_point_size, 0x644); | ||||||
| @ -1694,6 +1707,7 @@ ASSERT_REG_POSITION(cull_face, 0x648); | |||||||
| ASSERT_REG_POSITION(pixel_center_integer, 0x649); | ASSERT_REG_POSITION(pixel_center_integer, 0x649); | ||||||
| ASSERT_REG_POSITION(viewport_transform_enabled, 0x64B); | ASSERT_REG_POSITION(viewport_transform_enabled, 0x64B); | ||||||
| ASSERT_REG_POSITION(view_volume_clip_control, 0x64F); | ASSERT_REG_POSITION(view_volume_clip_control, 0x64F); | ||||||
|  | ASSERT_REG_POSITION(topology_override, 0x65C); | ||||||
| ASSERT_REG_POSITION(depth_bounds_enable, 0x66F); | ASSERT_REG_POSITION(depth_bounds_enable, 0x66F); | ||||||
| ASSERT_REG_POSITION(logic_op, 0x671); | ASSERT_REG_POSITION(logic_op, 0x671); | ||||||
| ASSERT_REG_POSITION(clear_buffers, 0x674); | ASSERT_REG_POSITION(clear_buffers, 0x674); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user