|
|
@ -143,7 +143,7 @@ vec4 secondary_fragment_color = vec4(0.0);
|
|
|
|
|
|
|
|
|
|
|
|
out += "vec4 combiner_buffer = vec4(0.0);\n"
|
|
|
|
out += "vec4 combiner_buffer = vec4(0.0);\n"
|
|
|
|
"vec4 next_combiner_buffer = tev_combiner_buffer_color;\n"
|
|
|
|
"vec4 next_combiner_buffer = tev_combiner_buffer_color;\n"
|
|
|
|
"vec4 combiner_output = rounded_primary_color;\n";
|
|
|
|
"vec4 combiner_output = vec4(0.0);\n";
|
|
|
|
|
|
|
|
|
|
|
|
out += "vec3 color_results_1 = vec3(0.0);\n"
|
|
|
|
out += "vec3 color_results_1 = vec3(0.0);\n"
|
|
|
|
"vec3 color_results_2 = vec3(0.0);\n"
|
|
|
|
"vec3 color_results_2 = vec3(0.0);\n"
|
|
|
@ -225,96 +225,75 @@ void FragmentModule::WriteScissor() {
|
|
|
|
"gl_FragCoord.y < float(scissor_y2))) discard;\n";
|
|
|
|
"gl_FragCoord.y < float(scissor_y2))) discard;\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FragmentModule::AppendSource(Pica::TexturingRegs::TevStageConfig::Source source,
|
|
|
|
std::string FragmentModule::GetSource(Pica::TexturingRegs::TevStageConfig::Source source,
|
|
|
|
u32 tev_index) {
|
|
|
|
u32 tev_index) {
|
|
|
|
using Source = Pica::TexturingRegs::TevStageConfig::Source;
|
|
|
|
using Source = Pica::TexturingRegs::TevStageConfig::Source;
|
|
|
|
switch (source) {
|
|
|
|
switch (source) {
|
|
|
|
case Source::PrimaryColor:
|
|
|
|
case Source::PrimaryColor:
|
|
|
|
out += "rounded_primary_color";
|
|
|
|
return "rounded_primary_color";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::PrimaryFragmentColor:
|
|
|
|
case Source::PrimaryFragmentColor:
|
|
|
|
out += "primary_fragment_color";
|
|
|
|
return "primary_fragment_color";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::SecondaryFragmentColor:
|
|
|
|
case Source::SecondaryFragmentColor:
|
|
|
|
out += "secondary_fragment_color";
|
|
|
|
return "secondary_fragment_color";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::Texture0:
|
|
|
|
case Source::Texture0:
|
|
|
|
out += "sampleTexUnit0()";
|
|
|
|
return "sampleTexUnit0()";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::Texture1:
|
|
|
|
case Source::Texture1:
|
|
|
|
out += "sampleTexUnit1()";
|
|
|
|
return "sampleTexUnit1()";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::Texture2:
|
|
|
|
case Source::Texture2:
|
|
|
|
out += "sampleTexUnit2()";
|
|
|
|
return "sampleTexUnit2()";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::Texture3:
|
|
|
|
case Source::Texture3:
|
|
|
|
out += "sampleTexUnit3()";
|
|
|
|
return "sampleTexUnit3()";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::PreviousBuffer:
|
|
|
|
case Source::PreviousBuffer:
|
|
|
|
out += "combiner_buffer";
|
|
|
|
return "combiner_buffer";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::Constant:
|
|
|
|
case Source::Constant:
|
|
|
|
out += fmt::format("const_color[{}]", tev_index);
|
|
|
|
return fmt::format("const_color[{}]", tev_index);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Source::Previous:
|
|
|
|
case Source::Previous:
|
|
|
|
out += "combiner_output";
|
|
|
|
return "combiner_output";
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
out += "vec4(0.0)";
|
|
|
|
|
|
|
|
LOG_CRITICAL(Render, "Unknown source op {}", source);
|
|
|
|
LOG_CRITICAL(Render, "Unknown source op {}", source);
|
|
|
|
break;
|
|
|
|
return "vec4(0.0)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FragmentModule::AppendColorModifier(
|
|
|
|
void FragmentModule::AppendColorModifier(
|
|
|
|
Pica::TexturingRegs::TevStageConfig::ColorModifier modifier,
|
|
|
|
Pica::TexturingRegs::TevStageConfig::ColorModifier modifier,
|
|
|
|
Pica::TexturingRegs::TevStageConfig::Source source, u32 tev_index) {
|
|
|
|
Pica::TexturingRegs::TevStageConfig::Source source, u32 tev_index) {
|
|
|
|
|
|
|
|
using Source = Pica::TexturingRegs::TevStageConfig::Source;
|
|
|
|
using ColorModifier = Pica::TexturingRegs::TevStageConfig::ColorModifier;
|
|
|
|
using ColorModifier = Pica::TexturingRegs::TevStageConfig::ColorModifier;
|
|
|
|
|
|
|
|
const TexturingRegs::TevStageConfig stage = config.texture.tev_stages[tev_index];
|
|
|
|
|
|
|
|
const bool force_source3 = tev_index == 0 && source == Source::Previous;
|
|
|
|
|
|
|
|
const auto color_source =
|
|
|
|
|
|
|
|
GetSource(force_source3 ? stage.color_source3.Value() : source, tev_index);
|
|
|
|
switch (modifier) {
|
|
|
|
switch (modifier) {
|
|
|
|
case ColorModifier::SourceColor:
|
|
|
|
case ColorModifier::SourceColor:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.rgb", color_source);
|
|
|
|
out += ".rgb";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::OneMinusSourceColor:
|
|
|
|
case ColorModifier::OneMinusSourceColor:
|
|
|
|
out += "vec3(1.0) - ";
|
|
|
|
out += fmt::format("vec3(1.0) - {}.rgb", color_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".rgb";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::SourceAlpha:
|
|
|
|
case ColorModifier::SourceAlpha:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.aaa", color_source);
|
|
|
|
out += ".aaa";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::OneMinusSourceAlpha:
|
|
|
|
case ColorModifier::OneMinusSourceAlpha:
|
|
|
|
out += "vec3(1.0) - ";
|
|
|
|
out += fmt::format("vec3(1.0) - {}.aaa", color_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".aaa";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::SourceRed:
|
|
|
|
case ColorModifier::SourceRed:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.rrr", color_source);
|
|
|
|
out += ".rrr";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::OneMinusSourceRed:
|
|
|
|
case ColorModifier::OneMinusSourceRed:
|
|
|
|
out += "vec3(1.0) - ";
|
|
|
|
out += fmt::format("vec3(1.0) - {}.rrr", color_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".rrr";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::SourceGreen:
|
|
|
|
case ColorModifier::SourceGreen:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.ggg", color_source);
|
|
|
|
out += ".ggg";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::OneMinusSourceGreen:
|
|
|
|
case ColorModifier::OneMinusSourceGreen:
|
|
|
|
out += "vec3(1.0) - ";
|
|
|
|
out += fmt::format("vec3(1.0) - {}.ggg", color_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".ggg";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::SourceBlue:
|
|
|
|
case ColorModifier::SourceBlue:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.bbb", color_source);
|
|
|
|
out += ".bbb";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case ColorModifier::OneMinusSourceBlue:
|
|
|
|
case ColorModifier::OneMinusSourceBlue:
|
|
|
|
out += "vec3(1.0) - ";
|
|
|
|
out += fmt::format("vec3(1.0) - {}.bbb", color_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".bbb";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
out += "vec3(0.0)";
|
|
|
|
out += "vec3(0.0)";
|
|
|
@ -326,43 +305,36 @@ void FragmentModule::AppendColorModifier(
|
|
|
|
void FragmentModule::AppendAlphaModifier(
|
|
|
|
void FragmentModule::AppendAlphaModifier(
|
|
|
|
Pica::TexturingRegs::TevStageConfig::AlphaModifier modifier,
|
|
|
|
Pica::TexturingRegs::TevStageConfig::AlphaModifier modifier,
|
|
|
|
Pica::TexturingRegs::TevStageConfig::Source source, u32 tev_index) {
|
|
|
|
Pica::TexturingRegs::TevStageConfig::Source source, u32 tev_index) {
|
|
|
|
|
|
|
|
using Source = Pica::TexturingRegs::TevStageConfig::Source;
|
|
|
|
using AlphaModifier = Pica::TexturingRegs::TevStageConfig::AlphaModifier;
|
|
|
|
using AlphaModifier = Pica::TexturingRegs::TevStageConfig::AlphaModifier;
|
|
|
|
|
|
|
|
const TexturingRegs::TevStageConfig stage = config.texture.tev_stages[tev_index];
|
|
|
|
|
|
|
|
const bool force_source3 = tev_index == 0 && source == Source::Previous;
|
|
|
|
|
|
|
|
const auto alpha_source =
|
|
|
|
|
|
|
|
GetSource(force_source3 ? stage.alpha_source3.Value() : source, tev_index);
|
|
|
|
switch (modifier) {
|
|
|
|
switch (modifier) {
|
|
|
|
case AlphaModifier::SourceAlpha:
|
|
|
|
case AlphaModifier::SourceAlpha:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.a", alpha_source);
|
|
|
|
out += ".a";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::OneMinusSourceAlpha:
|
|
|
|
case AlphaModifier::OneMinusSourceAlpha:
|
|
|
|
out += "1.0 - ";
|
|
|
|
out += fmt::format("1.0 - {}.a", alpha_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".a";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::SourceRed:
|
|
|
|
case AlphaModifier::SourceRed:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.r", alpha_source);
|
|
|
|
out += ".r";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::OneMinusSourceRed:
|
|
|
|
case AlphaModifier::OneMinusSourceRed:
|
|
|
|
out += "1.0 - ";
|
|
|
|
out += fmt::format("1.0 - {}.r", alpha_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".r";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::SourceGreen:
|
|
|
|
case AlphaModifier::SourceGreen:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.g", alpha_source);
|
|
|
|
out += ".g";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::OneMinusSourceGreen:
|
|
|
|
case AlphaModifier::OneMinusSourceGreen:
|
|
|
|
out += "1.0 - ";
|
|
|
|
out += fmt::format("1.0 - {}.g", alpha_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".g";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::SourceBlue:
|
|
|
|
case AlphaModifier::SourceBlue:
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
out += fmt::format("{}.b", alpha_source);
|
|
|
|
out += ".b";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case AlphaModifier::OneMinusSourceBlue:
|
|
|
|
case AlphaModifier::OneMinusSourceBlue:
|
|
|
|
out += "1.0 - ";
|
|
|
|
out += fmt::format("1.0 - {}.b", alpha_source);
|
|
|
|
AppendSource(source, tev_index);
|
|
|
|
|
|
|
|
out += ".b";
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
out += "0.0";
|
|
|
|
out += "0.0";
|
|
|
@ -384,12 +356,11 @@ void FragmentModule::AppendColorCombiner(Pica::TexturingRegs::TevStageConfig::Op
|
|
|
|
case Operation::AddSigned:
|
|
|
|
case Operation::AddSigned:
|
|
|
|
return "color_results_1 + color_results_2 - vec3(0.5)";
|
|
|
|
return "color_results_1 + color_results_2 - vec3(0.5)";
|
|
|
|
case Operation::Lerp:
|
|
|
|
case Operation::Lerp:
|
|
|
|
return "color_results_1 * color_results_3 + color_results_2 * (vec3(1.0) - "
|
|
|
|
return "mix(color_results_2, color_results_1, color_results_3)";
|
|
|
|
"color_results_3)";
|
|
|
|
|
|
|
|
case Operation::Subtract:
|
|
|
|
case Operation::Subtract:
|
|
|
|
return "color_results_1 - color_results_2";
|
|
|
|
return "color_results_1 - color_results_2";
|
|
|
|
case Operation::MultiplyThenAdd:
|
|
|
|
case Operation::MultiplyThenAdd:
|
|
|
|
return "color_results_1 * color_results_2 + color_results_3";
|
|
|
|
return "fma(color_results_1, color_results_2, color_results_3)";
|
|
|
|
case Operation::AddThenMultiply:
|
|
|
|
case Operation::AddThenMultiply:
|
|
|
|
return "min(color_results_1 + color_results_2, vec3(1.0)) * color_results_3";
|
|
|
|
return "min(color_results_1 + color_results_2, vec3(1.0)) * color_results_3";
|
|
|
|
case Operation::Dot3_RGB:
|
|
|
|
case Operation::Dot3_RGB:
|
|
|
@ -416,11 +387,11 @@ void FragmentModule::AppendAlphaCombiner(Pica::TexturingRegs::TevStageConfig::Op
|
|
|
|
case Operation::AddSigned:
|
|
|
|
case Operation::AddSigned:
|
|
|
|
return "alpha_results_1 + alpha_results_2 - 0.5";
|
|
|
|
return "alpha_results_1 + alpha_results_2 - 0.5";
|
|
|
|
case Operation::Lerp:
|
|
|
|
case Operation::Lerp:
|
|
|
|
return "alpha_results_1 * alpha_results_3 + alpha_results_2 * (1.0 - alpha_results_3)";
|
|
|
|
return "mix(alpha_results_2, alpha_results_1, alpha_results_3)";
|
|
|
|
case Operation::Subtract:
|
|
|
|
case Operation::Subtract:
|
|
|
|
return "alpha_results_1 - alpha_results_2";
|
|
|
|
return "alpha_results_1 - alpha_results_2";
|
|
|
|
case Operation::MultiplyThenAdd:
|
|
|
|
case Operation::MultiplyThenAdd:
|
|
|
|
return "alpha_results_1 * alpha_results_2 + alpha_results_3";
|
|
|
|
return "fma(alpha_results_1, alpha_results_2, alpha_results_3)";
|
|
|
|
case Operation::AddThenMultiply:
|
|
|
|
case Operation::AddThenMultiply:
|
|
|
|
return "min(alpha_results_1 + alpha_results_2, 1.0) * alpha_results_3";
|
|
|
|
return "min(alpha_results_1 + alpha_results_2, 1.0) * alpha_results_3";
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|