static void GenerateSampler(StringBuilder sb, VeldridMemberInfo member, GenerationContext context)
    {
        if (member.Symbol is not IFieldSymbol field)
        {
            context.Report($"Resource set backing members must be fields (member {member.Symbol.ToDisplayString()} in " +
                           $"{member.Symbol.ContainingType.ToDisplayString()} was a {member.Symbol.GetType().Name})");
            return;
        }

        /* e.g.
         * public SamplerHolder Sampler
         * {
         * get => _sampler;
         * set
         * {
         *  if (_sampler == value) return;
         *  if (_sampler != null) _sampler.PropertyChanged -= PropertyDirty;
         *  _sampler = value;
         *  if (_sampler != null) _sampler.PropertyChanged += PropertyDirty;
         *  Dirty();
         * }
         * } */
        var propertyName = VeldridGenUtil.UnderscoreToTitleCase(field.Name);

        sb.AppendLine($@"        public {field.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)} {propertyName}
        {{
            get => {field.Name};
            set
            {{
                if ({field.Name} == value) 
                    return;

                if ({field.Name} != null)
                    {field.Name}.PropertyChanged -= PropertyDirty;

                {field.Name} = value;

                if ({field.Name} != null)
                    {field.Name}.PropertyChanged += PropertyDirty;
                Dirty();
            }}
        }}
");
    }
    static void GenerateUniform(StringBuilder sb, VeldridMemberInfo member, GenerationContext context)
    {
        if (member.Symbol is not IFieldSymbol field)
        {
            context.Report($"Resource set backing members must be fields (member {member.Symbol.ToDisplayString()} in " +
                           $"{member.Symbol.ContainingType.ToDisplayString()} was a {member.Symbol.GetType().Name})");
            return;
        }

        /* e.g.
         * public SingleBuffer<GlobalInfo> GlobalInfo
         * {
         *  get => _globalInfo;
         *  set
         *  {
         *      if (_globalInfo == value)
         *          return;
         *      _globalInfo = value;
         *      Dirty();
         *  }
         * }*/
        var propertyName = VeldridGenUtil.UnderscoreToTitleCase(field.Name);

        sb.AppendLine($@"        public {field.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)} {propertyName}
        {{
            get => {field.Name};
            set
            {{
                if ({field.Name} == value)
                    return;
                {field.Name} = value;
                Dirty();
            }}
        }}
");
    }