anchor.diff:        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
  
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:           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);
            Exit;
          end;
        end;
  
  