anchor.diff:              iface       : FShade.GLSL.GLSLProgramInterface
               format      : BinaryFormat
               binary      : byte[]
  -
  +            code        : string
  +            modes       : Option<Set<IndexedGeometryMode>>
           }
   
   
  
positive.code:     let private codeCache = ConcurrentDictionary<Context * string * IFramebufferSignature, Error<FShade.GLSL.GLSLProgramInterface * Program>>()
      let private shaderCache = ConcurrentDictionary<Context * Surface * IFramebufferSignature, Error<FShade.GLSL.GLSLProgramInterface * IMod<Program>>>()
      let private shaderPickler = MBrace.FsPickler.FsPickler.CreateBinarySerializer()
      let private cachePath =
          let temp = Path.combine [System.IO.Path.GetTempPath(); "aardvark-gl-shadercache"]
          if not (System.IO.Directory.Exists temp) then System.IO.Directory.CreateDirectory temp |> ignore
          temp
  
      type private OutputSignature =
          {
  
negative.code:                         let outputs = code.iface.outputs |> List.map (fun p -> p.paramName, p.paramLocation) |> Map.ofList
                          match x.TryCompileProgram(outputs, true, code.code) with
                              | Success prog ->
                                  if useDiskCache then
                                      match x.TryGetProgramBinary prog with
                                          | Some (format, binary) ->
                                              let entry =
                                                  shaderPickler.Pickle {
                                                      iface = code.iface
                                                      format = format
                                                      binary = binary
                                                      code = code.code
                                                      modes = prog.SupportedModes
                                                  }
                                              File.writeAllBytes file entry
  
                                          | None ->
                                              ()
  
                                  Success (code.iface, prog)
                              | Error e ->
  