public static string GetName(int offset) { offset <<= 2; if (offset >= AttributeConsts.UserAttributeBase && offset < AttributeConsts.UserAttributeEnd) { offset -= AttributeConsts.UserAttributeBase; string name = $"{ DefaultNames.OAttributePrefix}{(offset >> 4)}"; name += "_" + "xyzw"[(offset >> 2) & 3]; return(name); } switch (offset) { case AttributeConsts.PositionX: case AttributeConsts.PositionY: case AttributeConsts.PositionZ: case AttributeConsts.PositionW: return("gl_Position"); case AttributeConsts.PointSize: return("gl_PointSize"); case AttributeConsts.ClipDistance0: return("gl_ClipDistance[0]"); case AttributeConsts.ClipDistance1: return("gl_ClipDistance[1]"); case AttributeConsts.ClipDistance2: return("gl_ClipDistance[2]"); case AttributeConsts.ClipDistance3: return("gl_ClipDistance[3]"); case AttributeConsts.ClipDistance4: return("gl_ClipDistance[4]"); case AttributeConsts.ClipDistance5: return("gl_ClipDistance[5]"); case AttributeConsts.ClipDistance6: return("gl_ClipDistance[6]"); case AttributeConsts.ClipDistance7: return("gl_ClipDistance[7]"); case AttributeConsts.VertexId: return("gl_VertexID"); } return(null); }
public static string GetAttributeName(AstOperand attr, ShaderConfig config, bool isOutAttr = false, string indexExpr = "0") { int value = attr.Value; char swzMask = GetSwizzleMask((value >> 2) & 3); if (value >= AttributeConsts.UserAttributeBase && value < AttributeConsts.UserAttributeEnd) { value -= AttributeConsts.UserAttributeBase; string prefix = isOutAttr ? DefaultNames.OAttributePrefix : DefaultNames.IAttributePrefix; if ((config.Flags & TranslationFlags.Feedback) != 0) { string name = $"{prefix}{(value >> 4)}_{swzMask}"; if (config.Stage == ShaderStage.Geometry && !isOutAttr) { name += $"[{indexExpr}]"; } return(name); } else { string name = $"{prefix}{(value >> 4)}"; if (config.Stage == ShaderStage.Geometry && !isOutAttr) { name += $"[{indexExpr}]"; } return(name + '.' + swzMask); } } else { if (value >= AttributeConsts.FragmentOutputColorBase && value < AttributeConsts.FragmentOutputColorEnd) { value -= AttributeConsts.FragmentOutputColorBase; return($"{DefaultNames.OAttributePrefix}{(value >> 4)}.{swzMask}"); } else if (_builtInAttributes.TryGetValue(value & ~3, out BuiltInAttribute builtInAttr)) { // TODO: There must be a better way to handle this... if (config.Stage == ShaderStage.Fragment) { switch (value & ~3) { case AttributeConsts.PositionX: return("(gl_FragCoord.x / fp_renderScale[0])"); case AttributeConsts.PositionY: return("(gl_FragCoord.y / fp_renderScale[0])"); case AttributeConsts.PositionZ: return("gl_FragCoord.z"); case AttributeConsts.PositionW: return("gl_FragCoord.w"); } } string name = builtInAttr.Name; if (config.Stage == ShaderStage.Geometry && (value & AttributeConsts.SpecialMask) == 0 && !isOutAttr) { name = $"gl_in[{indexExpr}].{name}"; } return(name); } } // TODO: Warn about unknown built-in attribute. return(isOutAttr ? "// bad_attr0x" + value.ToString("X") : "0.0"); }
private static string GetAttributeName(AstOperand attr, GalShaderType shaderType, bool isOutAttr = false) { int value = attr.Value; string swzMask = GetSwizzleMask((value >> 2) & 3); if (value >= AttributeConsts.UserAttributeBase && value < AttributeConsts.UserAttributeEnd) { value -= AttributeConsts.UserAttributeBase; string prefix = isOutAttr ? DefaultNames.OAttributePrefix : DefaultNames.IAttributePrefix; string name = $"{prefix}{(value >> 4)}"; if (shaderType == GalShaderType.Geometry && !isOutAttr) { name += "[0]"; } name += "." + swzMask; return(name); } else { if (value >= AttributeConsts.FragmentOutputColorBase && value < AttributeConsts.FragmentOutputColorEnd) { value -= AttributeConsts.FragmentOutputColorBase; return($"{DefaultNames.OAttributePrefix}{(value >> 4)}.{swzMask}"); } else if (_builtInAttributes.TryGetValue(value & ~3, out BuiltInAttribute builtInAttr)) { // TODO: There must be a better way to handle this... if (shaderType == GalShaderType.Fragment) { switch (value & ~3) { case AttributeConsts.PositionX: return("gl_FragCoord.x"); case AttributeConsts.PositionY: return("gl_FragCoord.y"); case AttributeConsts.PositionZ: return("gl_FragCoord.z"); case AttributeConsts.PositionW: return("1.0"); } } string name = builtInAttr.Name; if (shaderType == GalShaderType.Geometry && !isOutAttr) { name = "gl_in[0]." + name; } return(name); } } // TODO: Warn about unknown built-in attribute. return(isOutAttr ? "// bad_attr0x" + value.ToString("X") : "0.0"); }