diff --git a/osu.Framework/Graphics/OpenGL/Shaders/GLShaderPart.cs b/osu.Framework/Graphics/OpenGL/Shaders/GLShaderPart.cs index 66bcfef1b3..d8fd2110a7 100644 --- a/osu.Framework/Graphics/OpenGL/Shaders/GLShaderPart.cs +++ b/osu.Framework/Graphics/OpenGL/Shaders/GLShaderPart.cs @@ -6,6 +6,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Text; using System.Text.RegularExpressions; using osu.Framework.Graphics.Rendering; using osu.Framework.Graphics.Shaders; @@ -71,18 +72,24 @@ private string loadFile(byte[]? bytes, bool mainFile) if (bytes == null) return string.Empty; + var builder = new StringBuilder(); + + if (mainFile) + { + builder.AppendLine(loadFile(store.GetRawData("Internal/sh_Compatibility.h"), false)); + builder.AppendLine(loadFile(store.GetRawData("Internal/sh_GlobalUniforms.h"), false)); + } + using (MemoryStream ms = new MemoryStream(bytes)) using (StreamReader sr = new StreamReader(ms)) { - string code = string.Empty; - while (sr.Peek() != -1) { string? line = sr.ReadLine(); if (string.IsNullOrEmpty(line)) { - code += line + '\n'; + builder.AppendLine(line); continue; } @@ -109,29 +116,26 @@ private string loadFile(byte[]? bytes, bool mainFile) // if (File.Exists(includeName)) // rawData = File.ReadAllBytes(includeName); //#endif - code += loadFile(store.GetRawData(includeName), false) + '\n'; + builder.AppendLine(loadFile(store.GetRawData(includeName), false)); } else - code += line + '\n'; + builder.AppendLine(line); } - if (mainFile) + string code = builder.ToString(); + + if (!mainFile) return code; + + if (Type == ShaderType.VertexShader) { - string internalIncludes = loadFile(store.GetRawData("Internal/sh_Compatibility.h"), false) + "\n"; - internalIncludes += loadFile(store.GetRawData("Internal/sh_GlobalUniforms.h"), false) + "\n"; - code = internalIncludes + code; + string backbufferCode = loadFile(store.GetRawData("Internal/sh_Vertex_Output.h"), false); - if (Type == ShaderType.VertexShader) + if (!string.IsNullOrEmpty(backbufferCode)) { - string backbufferCode = loadFile(store.GetRawData("Internal/sh_Vertex_Output.h"), false); - - if (!string.IsNullOrEmpty(backbufferCode)) - { - const string real_main_name = "__internal_real_main"; + const string real_main_name = "__internal_real_main"; - backbufferCode = backbufferCode.Replace("{{ real_main }}", real_main_name); - code = Regex.Replace(code, @"void main\((.*)\)", $"void {real_main_name}()") + backbufferCode + '\n'; - } + backbufferCode = backbufferCode.Replace("{{ real_main }}", real_main_name); + code = Regex.Replace(code, @"void main\((.*)\)", $"void {real_main_name}()") + backbufferCode + '\n'; } } diff --git a/osu.Framework/Graphics/Veldrid/Shaders/VeldridShaderPart.cs b/osu.Framework/Graphics/Veldrid/Shaders/VeldridShaderPart.cs index db3f686ab5..6cabf12ee3 100644 --- a/osu.Framework/Graphics/Veldrid/Shaders/VeldridShaderPart.cs +++ b/osu.Framework/Graphics/Veldrid/Shaders/VeldridShaderPart.cs @@ -72,18 +72,24 @@ private string loadFile(byte[]? bytes, bool mainFile) if (bytes == null) return string.Empty; + var builder = new StringBuilder(); + + if (mainFile) + { + builder.AppendLine(loadFile(store.GetRawData("Internal/sh_Compatibility.h"), false)); + builder.AppendLine(loadFile(store.GetRawData("Internal/sh_GlobalUniforms.h"), false)); + } + using (MemoryStream ms = new MemoryStream(bytes)) using (StreamReader sr = new StreamReader(ms)) { - string result = string.Empty; - while (sr.Peek() != -1) { string? line = sr.ReadLine(); if (string.IsNullOrEmpty(line)) { - result += line + '\n'; + builder.AppendLine(line); continue; } @@ -105,35 +111,33 @@ private string loadFile(byte[]? bytes, bool mainFile) { string includeName = includeMatch.Groups[1].Value.Trim(); - result += loadFile(store.GetRawData(includeName), false) + '\n'; + builder.AppendLine(loadFile(store.GetRawData(includeName), false)); } else - result += line + '\n'; + builder.AppendLine(line); } - if (mainFile) - { - string internalIncludes = loadFile(store.GetRawData("Internal/sh_Compatibility.h"), false) + "\n"; - internalIncludes += loadFile(store.GetRawData("Internal/sh_GlobalUniforms.h"), false) + "\n"; - result = internalIncludes + result; + string output = builder.ToString(); - Inputs.AddRange( - shader_input_pattern.Matches(result).Select(m => new VeldridShaderAttribute(int.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture), m.Groups[2].Value)).ToList()); - Outputs.AddRange( - shader_output_pattern.Matches(result).Select(m => new VeldridShaderAttribute(int.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture), m.Groups[2].Value)).ToList()); + if (!mainFile) + return output; - string outputCode = loadFile(store.GetRawData($"Internal/sh_{Type}_Output.h"), false); + Inputs.AddRange( + shader_input_pattern.Matches(output).Select(m => new VeldridShaderAttribute(int.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture), m.Groups[2].Value))); + Outputs.AddRange( + shader_output_pattern.Matches(output).Select(m => new VeldridShaderAttribute(int.Parse(m.Groups[1].Value, CultureInfo.InvariantCulture), m.Groups[2].Value))); - if (!string.IsNullOrEmpty(outputCode)) - { - const string real_main_name = "__internal_real_main"; + string outputCode = loadFile(store.GetRawData($"Internal/sh_{Type}_Output.h"), false); - outputCode = outputCode.Replace("{{ real_main }}", real_main_name); - result = Regex.Replace(result, @"void main\((.*)\)", $"void {real_main_name}()") + outputCode + '\n'; - } + if (!string.IsNullOrEmpty(outputCode)) + { + const string real_main_name = "__internal_real_main"; + + outputCode = outputCode.Replace("{{ real_main }}", real_main_name); + output = Regex.Replace(output, @"void main\((.*)\)", $"void {real_main_name}()") + outputCode + '\n'; } - return result; + return output; } }