anchor.diff:  
           let itemArgs = args |> List.map (fun (n,t) -> sprintf "%s : %s" n t) |> String.concat ", "
   
  -        memberFunction
  -            "load single texel from image"
  -            SampleVariants.None
  -            "Load"
  -            args
  -            returnType
  -
  -        memberFunctionAttributes
  -            "write single texel into image"
  -            (Some "[<FShade.Imperative.KeepCall>]")
  -            SampleVariants.None
  -            "Store"
  -            (args @ ["data", returnType])
  -            "unit"
  -
  -        property
  -            "access single texel of image"
  -            "Load"
  -            (Some "Store")
  -            args
  -            returnType
  +        Write.MemberFunction(
  +            "Load",
  +            args,
  +            returnType,
  +            comment = "load single texel from image"
  +        )
  +
  +        Write.MemberFunction(
  +            "Store",
  +            (args @ ["data", returnType]),
  +            "unit",
  +            comment = "write single texel into image",
  +            attributes = "[<FShade.Imperative.KeepCall>]"
  +        )
  +
  +        Write.Property(
  +            "Load",
  +            args,
  +            returnType,
  +            setter = "Store",
  +            comment = "access single texel of image"
  +        )
   
           if t = SamplerType.Int then
               line "member x.AtomicAdd(%s, data : int) : int = onlyInShaderCode \"AtomicAdd\"" itemArgs
  
positive.code:                 else
                      ["coord", texelCoordType, None] @ additionalDefaultArgs @ ["lod", "int", Some "0"]
  
              memberFunctionDefaultArgs
                  "non-sampled texture read"
                  SampleVariants.None
                  "Read"
                  arguments
                  returnType
  
              propertyDefaultArgs
                  "non-sampled texture read"
                  "Fetch"
                  None
                  arguments
                  returnType
  
          stop()
  
  
negative.code:                 else
                      SampleVariants.Bias
  
              Write.MemberFunction(
                  "Sample",
                  (["coord", coordType] @ additionalArgs),
                  returnType,
                  comment = "regular sampled texture-lookup",
                  variants = variant
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureOffset.xhtml
          if d <> SamplerDimension.SamplerCube && not m then
              Write.MemberFunction(
                  "SampleOffset",
                  (["coord", coordType] @ additionalArgs @ ["offset", texelCoordType]),
                  returnType,
                  comment = "regular sampled texture-lookup with offset",
                  variants = SampleVariants.Bias
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureProj.xhtml
          if d <> SamplerDimension.SamplerCube && not m && not a then
              Write.MemberFunction(
                  "SampleProj",
                  (["coord", projCoordType] @ additionalArgs),
                  returnType,
                  comment ="projective sampled texture-lookup",
                  variants = SampleVariants.Bias
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureLod.xhtml
          if not m && not (s && d = SamplerDimension.SamplerCube) && not (s && a && d = SamplerDimension.Sampler2d) then
              Write.MemberFunction(
                  "SampleLevel",
                  (["coord", coordType] @ additionalArgs @ ["level", "float"]),
                  returnType,
                  comment = "sampled texture-lookup with given level"
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureLodOffset.xhtml
          if not m && d <> SamplerDimension.SamplerCube && not (s && a && d = SamplerDimension.Sampler2d) then
              Write.MemberFunction(
                  "SampleLevelOffset",
                  (["coord", coordType] @ additionalArgs @ ["level", "float"; "offset", texelCoordType]),
                  returnType,
                  comment = "sampled texture-lookup with given level and offset"
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureGrad.xhtml
          if not m then
              Write.MemberFunction(
                  "SampleGrad",
                  (["coord", coordType] @ additionalArgs @ ["dTdx", coordType; "dTdy", coordType]),
                  returnType,
                  comment = "sampled texture-lookup with explicit gradients"
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureQueryLod.xhtml
          if not m then
              Write.MemberFunction(
                  "QueryLod",
                  ["coord", coordType],
                  "V2d",
                  comment = "query lod levels"
              )
  
          // https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureGather.xhtml
          if (d = SamplerDimension.Sampler2d || d = SamplerDimension.SamplerCube) && not m then
  