mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Cache Vertices instead of Output registers (#2165)
This patch brings +3% performance improvement on average. It removes ToVertex() as an important hotspot of the emulator.
This commit is contained in:
		
							parent
							
								
									0c9c97e5ea
								
							
						
					
					
						commit
						82210ab480
					
				
					 1 changed files with 7 additions and 6 deletions
				
			
		|  | @ -235,7 +235,8 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { | |||
|         // The size has been tuned for optimal balance between hit-rate and the cost of lookup
 | ||||
|         const size_t VERTEX_CACHE_SIZE = 32; | ||||
|         std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids; | ||||
|         std::array<Shader::OutputRegisters, VERTEX_CACHE_SIZE> vertex_cache; | ||||
|         std::array<Shader::OutputVertex, VERTEX_CACHE_SIZE> vertex_cache; | ||||
|         Shader::OutputVertex output_vertex; | ||||
| 
 | ||||
|         unsigned int vertex_cache_pos = 0; | ||||
|         vertex_cache_ids.fill(-1); | ||||
|  | @ -265,7 +266,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { | |||
| 
 | ||||
|                 for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) { | ||||
|                     if (vertex == vertex_cache_ids[i]) { | ||||
|                         output_registers = vertex_cache[i]; | ||||
|                         output_vertex = vertex_cache[i]; | ||||
|                         vertex_cache_hit = true; | ||||
|                         break; | ||||
|                     } | ||||
|  | @ -284,16 +285,16 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { | |||
|                 g_state.vs.Run(shader_unit, input, loader.GetNumTotalAttributes()); | ||||
|                 output_registers = shader_unit.output_registers; | ||||
| 
 | ||||
|                 // Retrieve vertex from register data
 | ||||
|                 output_vertex = output_registers.ToVertex(regs.vs); | ||||
| 
 | ||||
|                 if (is_indexed) { | ||||
|                     vertex_cache[vertex_cache_pos] = output_registers; | ||||
|                     vertex_cache[vertex_cache_pos] = output_vertex; | ||||
|                     vertex_cache_ids[vertex_cache_pos] = vertex; | ||||
|                     vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // Retrieve vertex from register data
 | ||||
|             Shader::OutputVertex output_vertex = output_registers.ToVertex(regs.vs); | ||||
| 
 | ||||
|             // Send to renderer
 | ||||
|             using Pica::Shader::OutputVertex; | ||||
|             auto AddTriangle = [](const OutputVertex& v0, const OutputVertex& v1, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue