private static void DeclareOutputAttribute(CodeGenContext context, int attr) { string suffix = AttributeInfo.IsArrayAttributeGlsl(context.Config.Stage, isOutAttr: true) ? "[]" : string.Empty; string name = $"{DefaultNames.OAttributePrefix}{attr}{suffix}"; if (context.Config.TransformFeedbackEnabled && context.Config.LastInVertexPipeline) { for (int c = 0; c < 4; c++) { char swzMask = "xyzw"[c]; string xfb = string.Empty; var tfOutput = context.GetTransformFeedbackOutput(attr, c); if (tfOutput.Valid) { xfb = $", xfb_buffer = {tfOutput.Buffer}, xfb_offset = {tfOutput.Offset}, xfb_stride = {tfOutput.Stride}"; } context.AppendLine($"layout (location = {attr}, component = {c}{xfb}) out float {name}_{swzMask};"); } } else { context.AppendLine($"layout (location = {attr}) out vec4 {name};"); } }
private static void DeclareInputAttribute(CodeGenContext context, StructuredProgramInfo info, int attr) { string suffix = AttributeInfo.IsArrayAttributeGlsl(context.Config.Stage, isOutAttr: false) ? "[]" : string.Empty; string iq = string.Empty; if (context.Config.Stage == ShaderStage.Fragment) { iq = context.Config.ImapTypes[attr].GetFirstUsedType() switch { PixelImap.Constant => "flat ", PixelImap.ScreenLinear => "noperspective ", _ => string.Empty }; } string name = $"{DefaultNames.IAttributePrefix}{attr}"; if (context.Config.TransformFeedbackEnabled && context.Config.Stage == ShaderStage.Fragment) { for (int c = 0; c < 4; c++) { char swzMask = "xyzw"[c]; context.AppendLine($"layout (location = {attr}, component = {c}) {iq}in float {name}_{swzMask}{suffix};"); } } else { bool passthrough = (context.Config.PassthroughAttributes & (1 << attr)) != 0; string pass = passthrough && context.Config.GpuAccessor.QueryHostSupportsGeometryShaderPassthrough() ? "passthrough, " : string.Empty; string type; if (context.Config.Stage == ShaderStage.Vertex) { type = context.Config.GpuAccessor.QueryAttributeType(attr).ToVec4Type(); } else { type = AttributeType.Float.ToVec4Type(); } context.AppendLine($"layout ({pass}location = {attr}) {iq}in {type} {name}{suffix};"); } }