mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #1261 from yuriks/tev-buffer-delay
PICA: Properly emulate 1-stage delay in the combiner buffer
This commit is contained in:
		
						commit
						644d1e7ca3
					
				
					 2 changed files with 19 additions and 12 deletions
				
			
		|  | @ -498,7 +498,8 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0, | |||
|             // with some basic arithmetic. Alpha combiners can be configured separately but work
 | ||||
|             // analogously.
 | ||||
|             Math::Vec4<u8> combiner_output; | ||||
|             Math::Vec4<u8> combiner_buffer = { | ||||
|             Math::Vec4<u8> combiner_buffer = {0, 0, 0, 0}; | ||||
|             Math::Vec4<u8> next_combiner_buffer = { | ||||
|                 regs.tev_combiner_buffer_color.r, regs.tev_combiner_buffer_color.g, | ||||
|                 regs.tev_combiner_buffer_color.b, regs.tev_combiner_buffer_color.a | ||||
|             }; | ||||
|  | @ -747,14 +748,16 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0, | |||
|                 combiner_output[2] = std::min((unsigned)255, color_output.b() * tev_stage.GetColorMultiplier()); | ||||
|                 combiner_output[3] = std::min((unsigned)255, alpha_output * tev_stage.GetAlphaMultiplier()); | ||||
| 
 | ||||
|                 combiner_buffer = next_combiner_buffer; | ||||
| 
 | ||||
|                 if (regs.tev_combiner_buffer_input.TevStageUpdatesCombinerBufferColor(tev_stage_index)) { | ||||
|                     combiner_buffer.r() = combiner_output.r(); | ||||
|                     combiner_buffer.g() = combiner_output.g(); | ||||
|                     combiner_buffer.b() = combiner_output.b(); | ||||
|                     next_combiner_buffer.r() = combiner_output.r(); | ||||
|                     next_combiner_buffer.g() = combiner_output.g(); | ||||
|                     next_combiner_buffer.b() = combiner_output.b(); | ||||
|                 } | ||||
| 
 | ||||
|                 if (regs.tev_combiner_buffer_input.TevStageUpdatesCombinerBufferAlpha(tev_stage_index)) { | ||||
|                     combiner_buffer.a() = combiner_output.a(); | ||||
|                     next_combiner_buffer.a() = combiner_output.a(); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -311,11 +311,13 @@ static void WriteTevStage(std::string& out, const PicaShaderConfig& config, unsi | |||
|             "clamp(alpha_output_" + index_name + " * " + std::to_string(stage.GetAlphaMultiplier()) + ".0, 0.0, 1.0));\n"; | ||||
|     } | ||||
| 
 | ||||
|     out += "combiner_buffer = next_combiner_buffer;\n"; | ||||
| 
 | ||||
|     if (config.TevStageUpdatesCombinerBufferColor(index)) | ||||
|         out += "combiner_buffer.rgb = last_tex_env_out.rgb;\n"; | ||||
|         out += "next_combiner_buffer.rgb = last_tex_env_out.rgb;\n"; | ||||
| 
 | ||||
|     if (config.TevStageUpdatesCombinerBufferAlpha(index)) | ||||
|         out += "combiner_buffer.a = last_tex_env_out.a;\n"; | ||||
|         out += "next_combiner_buffer.a = last_tex_env_out.a;\n"; | ||||
| } | ||||
| 
 | ||||
| std::string GenerateFragmentShader(const PicaShaderConfig& config) { | ||||
|  | @ -334,12 +336,10 @@ layout (std140) uniform shader_data { | |||
|     int alphatest_ref; | ||||
| }; | ||||
| 
 | ||||
| )"; | ||||
| uniform sampler2D tex[3]; | ||||
| 
 | ||||
|     out += "uniform sampler2D tex[3];\n"; | ||||
|     out += "void main() {\n"; | ||||
|     out += "vec4 combiner_buffer = tev_combiner_buffer_color;\n"; | ||||
|     out += "vec4 last_tex_env_out = vec4(0.0);\n"; | ||||
| void main() { | ||||
| )"; | ||||
| 
 | ||||
|     // Do not do any sort of processing if it's obvious we're not going to pass the alpha test
 | ||||
|     if (config.alpha_test_func == Regs::CompareFunc::Never) { | ||||
|  | @ -347,6 +347,10 @@ layout (std140) uniform shader_data { | |||
|         return out; | ||||
|     } | ||||
| 
 | ||||
|     out += "vec4 combiner_buffer = vec4(0.0);\n"; | ||||
|     out += "vec4 next_combiner_buffer = tev_combiner_buffer_color;\n"; | ||||
|     out += "vec4 last_tex_env_out = vec4(0.0);\n"; | ||||
| 
 | ||||
|     for (size_t index = 0; index < config.tev_stages.size(); ++index) | ||||
|         WriteTevStage(out, config, (unsigned)index); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue