diff options
| author | iwubcode <iwubcode@users.noreply.github.com> | 2025-03-15 17:29:13 -0500 |
|---|---|---|
| committer | iwubcode <iwubcode@users.noreply.github.com> | 2025-03-22 15:22:00 -0500 |
| commit | 8e253518e6f8b918dffe7361faf897c16eabc6d3 (patch) | |
| tree | 7d53662ef01ceb75cf8d8b556284733d110e93cf /Source/Core/VideoCommon/LightingShaderGen.cpp | |
| parent | 0afbeae70c94b72318035c300ef085d4753f7462 (diff) | |
VideoCommon: move to a 'process_fragment()' function to simplify custom shaders and provide a direct override of the tev stage logic
Diffstat (limited to 'Source/Core/VideoCommon/LightingShaderGen.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/LightingShaderGen.cpp | 115 |
1 files changed, 38 insertions, 77 deletions
diff --git a/Source/Core/VideoCommon/LightingShaderGen.cpp b/Source/Core/VideoCommon/LightingShaderGen.cpp index 130fb6f46d..be9d10c78a 100644 --- a/Source/Core/VideoCommon/LightingShaderGen.cpp +++ b/Source/Core/VideoCommon/LightingShaderGen.cpp @@ -179,47 +179,9 @@ void GetLightingShaderUid(LightingUidData& uid_data) } } -void GenerateCustomLightingHeaderDetails(ShaderCode* out, u32 enablelighting, u32 light_mask) -{ - u32 light_count = 0; - for (u32 j = 0; j < NUM_XF_COLOR_CHANNELS; j++) - { - if ((enablelighting & (1 << j)) != 0) // Color lights - { - for (int i = 0; i < 8; ++i) - { - if ((light_mask & (1 << (i + 8 * j))) != 0) - { - light_count++; - } - } - } - if ((enablelighting & (1 << (j + 2))) != 0) // Alpha lights - { - for (int i = 0; i < 8; ++i) - { - if ((light_mask & (1 << (i + 8 * (j + 2)))) != 0) - { - light_count++; - } - } - } - } - if (light_count > 0) - { - out->Write("\tCustomShaderLightData[{}] light;\n", light_count); - } - else - { - // Cheat so shaders compile - out->Write("\tCustomShaderLightData[1] light;\n", light_count); - } - out->Write("\tint light_count;\n"); -} - -static void GenerateLighting(ShaderCode* out, const LightingUidData& uid_data, int index, - int litchan_index, u32 channel_index, u32 custom_light_index, - bool alpha) +static void GenerateCustomLightingImpl(ShaderCode* out, const LightingUidData& uid_data, int index, + int litchan_index, u32 channel_index, u32 custom_light_index, + bool alpha) { const auto attnfunc = static_cast<AttenuationFunc>((uid_data.attnfunc >> (2 * litchan_index)) & 0x3); @@ -228,60 +190,59 @@ static void GenerateLighting(ShaderCode* out, const LightingUidData& uid_data, i const std::string name = fmt::format("lights_chan{}_{}", channel_index, light_type); out->Write("\t{{\n"); - out->Write("\t\tcustom_data.{}[{}].direction = " LIGHT_DIR ".xyz;\n", name, custom_light_index, + out->Write("\t\tfrag_input.{}[{}].direction = " LIGHT_DIR ".xyz;\n", name, custom_light_index, LIGHT_DIR_PARAMS(index)); - out->Write("\t\tcustom_data.{}[{}].position = " LIGHT_POS ".xyz;\n", name, custom_light_index, + out->Write("\t\tfrag_input.{}[{}].position = " LIGHT_POS ".xyz;\n", name, custom_light_index, LIGHT_POS_PARAMS(index)); - out->Write("\t\tcustom_data.{}[{}].cosatt = " LIGHT_COSATT ";\n", name, custom_light_index, + out->Write("\t\tfrag_input.{}[{}].cosatt = " LIGHT_COSATT ";\n", name, custom_light_index, LIGHT_COSATT_PARAMS(index)); - out->Write("\t\tcustom_data.{}[{}].distatt = " LIGHT_DISTATT ";\n", name, custom_light_index, + out->Write("\t\tfrag_input.{}[{}].distatt = " LIGHT_DISTATT ";\n", name, custom_light_index, LIGHT_DISTATT_PARAMS(index)); - out->Write("\t\tcustom_data.{}[{}].attenuation_type = {};\n", name, custom_light_index, + out->Write("\t\tfrag_input.{}[{}].attenuation_type = {};\n", name, custom_light_index, static_cast<u32>(attnfunc)); if (alpha) { - out->Write("\t\tcustom_data.{}[{}].color = float3(" LIGHT_COL + out->Write("\t\tfrag_input.{}[{}].color = float3(" LIGHT_COL ") / float3(255.0, 255.0, 255.0);\n", name, custom_light_index, LIGHT_COL_PARAMS(index, alpha ? "a" : "rgb")); } else { - out->Write("\t\tcustom_data.{}[{}].color = " LIGHT_COL " / float3(255.0, 255.0, 255.0);\n", - name, custom_light_index, LIGHT_COL_PARAMS(index, alpha ? "a" : "rgb")); + out->Write("\t\tfrag_input.{}[{}].color = " LIGHT_COL " / float3(255.0, 255.0, 255.0);\n", name, + custom_light_index, LIGHT_COL_PARAMS(index, alpha ? "a" : "rgb")); } out->Write("\t}}\n"); } -void GenerateCustomLightingImplementation(ShaderCode* out, const LightingUidData& uid_data, - std::string_view in_color_name) +void GenerateCustomLighting(ShaderCode* out, const LightingUidData& uid_data) { for (u32 i = 0; i < 8; i++) { for (u32 channel_index = 0; channel_index < NUM_XF_COLOR_CHANNELS; channel_index++) { - out->Write("\tcustom_data.lights_chan{}_color[{}].direction = float3(0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_color[{}].direction = float3(0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_color[{}].position = float3(0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_color[{}].position = float3(0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_color[{}].color = float3(0, 0, 0);\n", channel_index, + out->Write("\tfrag_input.lights_chan{}_color[{}].color = float3(0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_color[{}].cosatt = float4(0, 0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_color[{}].cosatt = float4(0, 0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_color[{}].distatt = float4(0, 0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_color[{}].distatt = float4(0, 0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_color[{}].attenuation_type = 0;\n", channel_index, i); + out->Write("\tfrag_input.lights_chan{}_color[{}].attenuation_type = 0;\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_alpha[{}].direction = float3(0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_alpha[{}].direction = float3(0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_alpha[{}].position = float3(0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_alpha[{}].position = float3(0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_alpha[{}].color = float3(0, 0, 0);\n", channel_index, + out->Write("\tfrag_input.lights_chan{}_alpha[{}].color = float3(0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_alpha[{}].cosatt = float4(0, 0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_alpha[{}].cosatt = float4(0, 0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_alpha[{}].distatt = float4(0, 0, 0, 0);\n", + out->Write("\tfrag_input.lights_chan{}_alpha[{}].distatt = float4(0, 0, 0, 0);\n", channel_index, i); - out->Write("\tcustom_data.lights_chan{}_alpha[{}].attenuation_type = 0;\n", channel_index, i); + out->Write("\tfrag_input.lights_chan{}_alpha[{}].attenuation_type = 0;\n", channel_index, i); } } @@ -289,20 +250,20 @@ void GenerateCustomLightingImplementation(ShaderCode* out, const LightingUidData { const bool colormatsource = !!(uid_data.matsource & (1 << j)); if (colormatsource) // from vertex - out->Write("custom_data.base_material[{}] = {}{};\n", j, in_color_name, j); + out->Write("frag_input.base_material[{}] = frag_input.color_{};\n", j, j); else // from color - out->Write("custom_data.base_material[{}] = {}[{}] / 255.0;\n", j, I_MATERIALS, j + 2); + out->Write("frag_input.base_material[{}] = {}[{}] / 255.0;\n", j, I_MATERIALS, j + 2); if ((uid_data.enablelighting & (1 << j)) != 0) { if ((uid_data.ambsource & (1 << j)) != 0) // from vertex - out->Write("custom_data.ambient_lighting[{}] = {}{};\n", j, in_color_name, j); + out->Write("frag_input.ambient_lighting[{}] = frag_input.color_{};\n", j, j); else // from color - out->Write("custom_data.ambient_lighting[{}] = {}[{}] / 255.0;\n", j, I_MATERIALS, j); + out->Write("frag_input.ambient_lighting[{}] = {}[{}] / 255.0;\n", j, I_MATERIALS, j); } else { - out->Write("custom_data.ambient_lighting[{}] = float4(1, 1, 1, 1);\n", j); + out->Write("frag_input.ambient_lighting[{}] = float4(1, 1, 1, 1);\n", j); } // check if alpha is different @@ -310,21 +271,21 @@ void GenerateCustomLightingImplementation(ShaderCode* out, const LightingUidData if (alphamatsource != colormatsource) { if (alphamatsource) // from vertex - out->Write("custom_data.base_material[{}].w = {}{}.w;\n", j, in_color_name, j); + out->Write("frag_input.base_material[{}].w = frag_input.color_{}.w;\n", j, j); else // from color - out->Write("custom_data.base_material[{}].w = {}[{}].w / 255.0;\n", j, I_MATERIALS, j + 2); + out->Write("frag_input.base_material[{}].w = {}[{}].w / 255.0;\n", j, I_MATERIALS, j + 2); } if ((uid_data.enablelighting & (1 << (j + 2))) != 0) { if ((uid_data.ambsource & (1 << (j + 2))) != 0) // from vertex - out->Write("custom_data.ambient_lighting[{}].w = {}{}.w;\n", j, in_color_name, j); + out->Write("frag_input.ambient_lighting[{}].w = frag_input.color_{}.w;\n", j, j); else // from color - out->Write("custom_data.ambient_lighting[{}].w = {}[{}].w / 255.0;\n", j, I_MATERIALS, j); + out->Write("frag_input.ambient_lighting[{}].w = {}[{}].w / 255.0;\n", j, I_MATERIALS, j); } else { - out->Write("custom_data.ambient_lighting[{}].w = 1;\n", j); + out->Write("frag_input.ambient_lighting[{}].w = 1;\n", j); } u32 light_count = 0; @@ -334,12 +295,12 @@ void GenerateCustomLightingImplementation(ShaderCode* out, const LightingUidData { if ((uid_data.light_mask & (1 << (i + 8 * j))) != 0) { - GenerateLighting(out, uid_data, i, j, j, light_count, false); + GenerateCustomLightingImpl(out, uid_data, i, j, j, light_count, false); light_count++; } } } - out->Write("\tcustom_data.light_chan{}_color_count = {};\n", j, light_count); + out->Write("\tfrag_input.light_chan{}_color_count = {};\n", j, light_count); light_count = 0; if ((uid_data.enablelighting & (1 << (j + 2))) != 0) // Alpha lights @@ -348,11 +309,11 @@ void GenerateCustomLightingImplementation(ShaderCode* out, const LightingUidData { if ((uid_data.light_mask & (1 << (i + 8 * (j + 2)))) != 0) { - GenerateLighting(out, uid_data, i, j + 2, j, light_count, true); + GenerateCustomLightingImpl(out, uid_data, i, j + 2, j, light_count, true); light_count++; } } } - out->Write("\tcustom_data.light_chan{}_alpha_count = {};\n", j, light_count); + out->Write("\tfrag_input.light_chan{}_alpha_count = {};\n", j, light_count); } } |
