mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Pica: Add primitive assembly stage.
This commit is contained in:
		
							parent
							
								
									c526512619
								
							
						
					
					
						commit
						9a76a2d061
					
				
					 7 changed files with 95 additions and 2 deletions
				
			
		|  | @ -1,4 +1,5 @@ | ||||||
| set(SRCS    command_processor.cpp | set(SRCS    command_processor.cpp | ||||||
|  |             primitive_assembly.cpp | ||||||
|             utils.cpp |             utils.cpp | ||||||
|             vertex_shader.cpp |             vertex_shader.cpp | ||||||
|             video_core.cpp |             video_core.cpp | ||||||
|  | @ -6,6 +7,7 @@ set(SRCS    command_processor.cpp | ||||||
| 
 | 
 | ||||||
| set(HEADERS command_processor.h | set(HEADERS command_processor.h | ||||||
|             math.h |             math.h | ||||||
|  |             primitive_assembly.h | ||||||
|             utils.h |             utils.h | ||||||
|             video_core.h |             video_core.h | ||||||
|             renderer_base.h |             renderer_base.h | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #include "command_processor.h" | #include "command_processor.h" | ||||||
| #include "math.h" | #include "math.h" | ||||||
| #include "pica.h" | #include "pica.h" | ||||||
|  | #include "primitive_assembly.h" | ||||||
| #include "vertex_shader.h" | #include "vertex_shader.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -100,7 +101,7 @@ static inline void WritePicaReg(u32 id, u32 value) { | ||||||
|                     // TODO: Add processed vertex to vertex cache!
 |                     // TODO: Add processed vertex to vertex cache!
 | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 // TODO: Submit vertex to primitive assembly
 |                 PrimitiveAssembly::SubmitVertex(output); | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -221,7 +221,18 @@ struct Regs { | ||||||
|     u32 trigger_draw; |     u32 trigger_draw; | ||||||
|     u32 trigger_draw_indexed; |     u32 trigger_draw_indexed; | ||||||
| 
 | 
 | ||||||
|     INSERT_PADDING_WORDS(0x8a); |     INSERT_PADDING_WORDS(0x2e); | ||||||
|  | 
 | ||||||
|  |     enum class TriangleTopology : u32 { | ||||||
|  |         List        = 0, | ||||||
|  |         Strip       = 1, | ||||||
|  |         Fan         = 2, | ||||||
|  |         ListIndexed = 3, // TODO: No idea if this is correct
 | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     BitField<8, 2, TriangleTopology> triangle_topology; | ||||||
|  | 
 | ||||||
|  |     INSERT_PADDING_WORDS(0x5b); | ||||||
| 
 | 
 | ||||||
|     // Offset to shader program entry point (in words)
 |     // Offset to shader program entry point (in words)
 | ||||||
|     BitField<0, 16, u32> vs_main_offset; |     BitField<0, 16, u32> vs_main_offset; | ||||||
|  | @ -334,6 +345,7 @@ struct Regs { | ||||||
|         ADD_FIELD(num_vertices); |         ADD_FIELD(num_vertices); | ||||||
|         ADD_FIELD(trigger_draw); |         ADD_FIELD(trigger_draw); | ||||||
|         ADD_FIELD(trigger_draw_indexed); |         ADD_FIELD(trigger_draw_indexed); | ||||||
|  |         ADD_FIELD(triangle_topology); | ||||||
|         ADD_FIELD(vs_main_offset); |         ADD_FIELD(vs_main_offset); | ||||||
|         ADD_FIELD(vs_input_register_map); |         ADD_FIELD(vs_input_register_map); | ||||||
|         ADD_FIELD(vs_uniform_setup); |         ADD_FIELD(vs_uniform_setup); | ||||||
|  | @ -386,6 +398,7 @@ ASSERT_REG_POSITION(index_array, 0x227); | ||||||
| ASSERT_REG_POSITION(num_vertices, 0x228); | ASSERT_REG_POSITION(num_vertices, 0x228); | ||||||
| ASSERT_REG_POSITION(trigger_draw, 0x22e); | ASSERT_REG_POSITION(trigger_draw, 0x22e); | ||||||
| ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f); | ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f); | ||||||
|  | ASSERT_REG_POSITION(triangle_topology, 0x25e); | ||||||
| ASSERT_REG_POSITION(vs_main_offset, 0x2ba); | ASSERT_REG_POSITION(vs_main_offset, 0x2ba); | ||||||
| ASSERT_REG_POSITION(vs_input_register_map, 0x2bb); | ASSERT_REG_POSITION(vs_input_register_map, 0x2bb); | ||||||
| ASSERT_REG_POSITION(vs_uniform_setup, 0x2c0); | ASSERT_REG_POSITION(vs_uniform_setup, 0x2c0); | ||||||
|  |  | ||||||
							
								
								
									
										52
									
								
								src/video_core/primitive_assembly.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/video_core/primitive_assembly.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | ||||||
|  | // Copyright 2014 Citra Emulator Project
 | ||||||
|  | // Licensed under GPLv2
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include "pica.h" | ||||||
|  | #include "primitive_assembly.h" | ||||||
|  | #include "vertex_shader.h" | ||||||
|  | 
 | ||||||
|  | namespace Pica { | ||||||
|  | 
 | ||||||
|  | namespace PrimitiveAssembly { | ||||||
|  | 
 | ||||||
|  | static OutputVertex buffer[2]; | ||||||
|  | static int buffer_index = 0; // TODO: reset this on emulation restart
 | ||||||
|  | 
 | ||||||
|  | void SubmitVertex(OutputVertex& vtx) | ||||||
|  | { | ||||||
|  |     switch (registers.triangle_topology) { | ||||||
|  |         case Regs::TriangleTopology::List: | ||||||
|  |         case Regs::TriangleTopology::ListIndexed: | ||||||
|  |             if (buffer_index < 2) { | ||||||
|  |                 buffer[buffer_index++] = vtx; | ||||||
|  |             } else { | ||||||
|  |                 buffer_index = 0; | ||||||
|  | 
 | ||||||
|  |                 // TODO
 | ||||||
|  |                 // Clipper::ProcessTriangle(buffer[0], buffer[1], vtx);
 | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  | 
 | ||||||
|  |         case Regs::TriangleTopology::Fan: | ||||||
|  |             if (buffer_index == 2) { | ||||||
|  |                 buffer_index = 0; | ||||||
|  | 
 | ||||||
|  |                 // TODO
 | ||||||
|  |                 // Clipper::ProcessTriangle(buffer[0], buffer[1], vtx);
 | ||||||
|  | 
 | ||||||
|  |                 buffer[1] = vtx; | ||||||
|  |             } else { | ||||||
|  |                 buffer[buffer_index++] = vtx; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  | 
 | ||||||
|  |         default: | ||||||
|  |             ERROR_LOG(GPU, "Unknown triangle mode %x:", (int)registers.triangle_topology.Value()); | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
							
								
								
									
										21
									
								
								src/video_core/primitive_assembly.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/video_core/primitive_assembly.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  | // Copyright 2014 Citra Emulator Project
 | ||||||
|  | // Licensed under GPLv2
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | namespace Pica { | ||||||
|  | 
 | ||||||
|  | namespace VertexShader { | ||||||
|  |     struct OutputVertex; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | namespace PrimitiveAssembly { | ||||||
|  | 
 | ||||||
|  | using VertexShader::OutputVertex; | ||||||
|  | 
 | ||||||
|  | void SubmitVertex(OutputVertex& vtx); | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
|  | @ -21,6 +21,7 @@ | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="renderer_opengl\renderer_opengl.cpp" /> |     <ClCompile Include="renderer_opengl\renderer_opengl.cpp" /> | ||||||
|     <ClCompile Include="command_processor.cpp" /> |     <ClCompile Include="command_processor.cpp" /> | ||||||
|  |     <ClCompile Include="primitive_assembly.cpp" /> | ||||||
|     <ClCompile Include="utils.cpp" /> |     <ClCompile Include="utils.cpp" /> | ||||||
|     <ClCompile Include="vertex_shader.cpp" /> |     <ClCompile Include="vertex_shader.cpp" /> | ||||||
|     <ClCompile Include="video_core.cpp" /> |     <ClCompile Include="video_core.cpp" /> | ||||||
|  | @ -30,6 +31,7 @@ | ||||||
|     <ClInclude Include="gpu_debugger.h" /> |     <ClInclude Include="gpu_debugger.h" /> | ||||||
|     <ClInclude Include="math.h" /> |     <ClInclude Include="math.h" /> | ||||||
|     <ClInclude Include="pica.h" /> |     <ClInclude Include="pica.h" /> | ||||||
|  |     <ClInclude Include="primitive_assembly.h" /> | ||||||
|     <ClInclude Include="renderer_base.h" /> |     <ClInclude Include="renderer_base.h" /> | ||||||
|     <ClInclude Include="utils.h" /> |     <ClInclude Include="utils.h" /> | ||||||
|     <ClInclude Include="vertex_shader.h" /> |     <ClInclude Include="vertex_shader.h" /> | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ | ||||||
|       <Filter>renderer_opengl</Filter> |       <Filter>renderer_opengl</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="command_processor.cpp" /> |     <ClCompile Include="command_processor.cpp" /> | ||||||
|  |     <ClCompile Include="primitive_assembly.cpp" /> | ||||||
|     <ClCompile Include="utils.cpp" /> |     <ClCompile Include="utils.cpp" /> | ||||||
|     <ClCompile Include="vertex_shader.cpp" /> |     <ClCompile Include="vertex_shader.cpp" /> | ||||||
|     <ClCompile Include="video_core.cpp" /> |     <ClCompile Include="video_core.cpp" /> | ||||||
|  | @ -22,6 +23,7 @@ | ||||||
|     <ClInclude Include="gpu_debugger.h" /> |     <ClInclude Include="gpu_debugger.h" /> | ||||||
|     <ClInclude Include="math.h" /> |     <ClInclude Include="math.h" /> | ||||||
|     <ClInclude Include="pica.h" /> |     <ClInclude Include="pica.h" /> | ||||||
|  |     <ClInclude Include="primitive_assembly.h" /> | ||||||
|     <ClInclude Include="renderer_base.h" /> |     <ClInclude Include="renderer_base.h" /> | ||||||
|     <ClInclude Include="utils.h" /> |     <ClInclude Include="utils.h" /> | ||||||
|     <ClInclude Include="vertex_shader.h" /> |     <ClInclude Include="vertex_shader.h" /> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue