private static void PrintMainBlock(CodeGenContext context, StructuredProgramInfo info) { context.AppendLine("void main()"); context.EnterScope(); Declarations.DeclareLocals(context, info); PrintBlock(context, info.MainBlock); context.LeaveScope(); }
private static void PrintFunction(CodeGenContext context, StructuredProgramInfo info, StructuredFunction function, string funcName = null) { context.CurrentFunction = function; context.AppendLine(GetFunctionSignature(function, funcName)); context.EnterScope(); Declarations.DeclareLocals(context, function); if (funcName == MainFunctionName) { // Some games will leave some elements of gl_Position uninitialized, // in those cases, the elements will contain undefined values according // to the spec, but on NVIDIA they seems to be always initialized to (0, 0, 0, 1), // so we do explicit initialization to avoid UB on non-NVIDIA gpus. if (context.Config.Stage == ShaderStage.Vertex) { context.AppendLine("gl_Position = vec4(0.0, 0.0, 0.0, 1.0);"); } // Ensure that unused attributes are set, otherwise the downstream // compiler may eliminate them. // (Not needed for fragment shader as it is the last stage). if (context.Config.Stage != ShaderStage.Compute && context.Config.Stage != ShaderStage.Fragment && !context.Config.GpPassthrough) { for (int attr = 0; attr < Declarations.MaxAttributes; attr++) { if (info.OAttributes.Contains(attr)) { continue; } if ((context.Config.Flags & TranslationFlags.Feedback) != 0) { context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_x = 0.0;"); context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_y = 0.0;"); context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_z = 0.0;"); context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_w = 1.0;"); } else { context.AppendLine($"{DefaultNames.OAttributePrefix}{attr} = vec4(0.0, 0.0, 0.0, 1.0);"); } } } } PrintBlock(context, function.MainBlock); context.LeaveScope(); }
private static void PrintFunction(CodeGenContext context, StructuredProgramInfo info, StructuredFunction function, string funcName = null) { context.CurrentFunction = function; context.AppendLine(GetFunctionSignature(function, funcName)); context.EnterScope(); Declarations.DeclareLocals(context, function); PrintBlock(context, function.MainBlock); context.LeaveScope(); }
private static void PrintMainBlock(CodeGenContext context, StructuredProgramInfo info) { context.AppendLine("void main()"); context.EnterScope(); Declarations.DeclareLocals(context, info); // Some games will leave some elements of gl_Position uninitialized, // in those cases, the elements will contain undefined values according // to the spec, but on NVIDIA they seems to be always initialized to (0, 0, 0, 1), // so we do explicit initialization to avoid UB on non-NVIDIA gpus. if (context.Config.Stage == ShaderStage.Vertex) { context.AppendLine("gl_Position = vec4(0.0, 0.0, 0.0, 1.0);"); } // Ensure that unused attributes are set, otherwise the downstream // compiler may eliminate them. // (Not needed for fragment shader as it is the last stage). if (context.Config.Stage != ShaderStage.Compute && context.Config.Stage != ShaderStage.Fragment) { for (int attr = 0; attr < Declarations.MaxAttributes; attr++) { if (info.OAttributes.Contains(attr)) { continue; } context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_x = 0;"); context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_y = 0;"); context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_z = 0;"); context.AppendLine($"{DefaultNames.OAttributePrefix}{attr}_w = 0;"); } } PrintBlock(context, info.MainBlock); context.LeaveScope(); }