anchor.diff:            Blockread(f, p^, len);
             closefile(f);
   
  +          result:=TrampolineglCreateShaderProgramv(AType, 1, @p);
  +          Freemem(p);
  +          Exit;
  +        end;
  +      end;
  +
  +      LOG('CreateShaderProgramvBounce 5');
  +      if Config.GetShaders then
  +      begin
  +        Assignfile(f, s);
  +        {$i-}rewrite(f, 1);{$i+}
  +        if ioresult = 0 then
  +        begin
  +          return:=$0a0d;
  +          for i := 0 to count - 1 do
  +          begin
  +            len:=0;
  +            while PChar(pa[i])[len] <> #0 do inc(len);
  +            BlockWrite(f, pa[i]^, len);
  +            Blockwrite(f, return, SizeOf(return));
  +          end;
  +          closefile(f);
  +        end else
  +          LOG('Could not write shader to disk!');
  +      end;
  +    end;
  +    result:=TrampolineglCreateShaderProgramv(AType, count, _string);
  +  end else
  +    result:=0;
  +end;
  +
  +procedure glShaderSourceBounce(shader: GLuint; count: GLsizei; _string: PGLchar; length: PGLint); stdcall;
  +var
  +  f: File;
  +  s: string;
  +  i: Integer;
  +  pa: PPointerArray;
  +  pl: PIntegerArray;
  +  return: Word;
  +  hash: Cardinal;
  +  p: Pointer;
  +  len: glint;
  +begin
  +  if Assigned(TrampolineglShaderSource) then
  +  begin
  +    if Assigned(_string) then
  +    begin
  +      pa := Pointer(_string);
  +      pl := Pointer(length);
  +
  +      hash := 0;
  +      for i:=0 to count - 1 do
  +        if Assigned(length) then
  +        hash := hash + SuperfastHash(pa[i], pl[i])
  +       else
  +        hash := hash + SuperfastHash(pa[i], System.Length(pchar(pa[i])));
  +
  +      s:=BasePath + BaseName+'_shader_'+IntToHex(hash, 8)+'.txt';
  +      InterLockedIncrement(ShaderWritten);
  +
  +      if Config.Inject and FileExists(s) then
  +      begin
  +        assignfile(F, s);
  +        {$i-}reset(f, 1);{$i+}
  +        if ioresult = 0 then
  +        begin
  +          LOG('Replacing shader '+s);
  +          i:=0;
  +          len:=FileSize(f);
  +          GetMem(p, len);
  +          Blockread(f, p^, len);
  +          closefile(f);
  +
             TrampolineglShaderSource(shader, 1, @p, @len);
             Freemem(p);
  -          //length:=nil;
  +          Exit;
           end;
         end;
   
  
positive.code: var
    TrampolineglShaderSource: procedure(shader: GLuint; count: GLsizei; const _string: PGLchar; const length: PGLint); stdcall = nil;
    TrampolinewglGetProcAddress: function(proc: PChar): Pointer; stdcall = nil;
    ShaderWritten: Integer;
  
  procedure glShaderSourceBounce(shader: GLuint; count: GLsizei; _string: PGLchar; length: PGLint); stdcall;
  var
    f: File;
    s: string;
    i: Integer;
    pa: PPointerArray;
    pl: PIntegerArray;
    return: Word;
    hash: Cardinal;
    p: Pointer;
    len: glint;
  begin
    if Assigned(TrampolineglShaderSource) then
    begin
      if Assigned(_string) then
      begin
        pa := Pointer(_string);
        pl := Pointer(length);
  
        hash := 0;
        for i:=0 to count - 1 do
          if Assigned(length) then
          hash := hash + SuperfastHash(pa[i], pl[i])
         else
          hash := hash + SuperfastHash(pa[i], System.Length(pchar(pa[i])));
  
        s:=BasePath + BaseName+'_shader_'+IntToHex(hash, 8)+'.txt';
        InterLockedIncrement(ShaderWritten);
  
negative.code:       if not Assigned(TrampolineglShaderSource) then
          TrampolineglShaderSource:=result;
        result:=@glShaderSourceBounce;
      end else if (proc = 'glCreateShaderProgramv') then
      begin
        if not Assigned(TrampolineglCreateShaderProgramv) then
          TrampolineglCreateShaderProgramv:=result;
        result:=@glCreateShaderProgramvBounce;
      end else if (proc = 'glCompileShader') then
      begin
        if not Assigned(TrampolineglCompileShader) then
  