[fpc-pascal] glGetString crash

Ryan Joseph ryan at thealchemistguild.com
Sun Feb 18 02:59:11 CET 2018


I tried using a core OpenGL context on my old MacBook (2010) and got a crash from glGetString from the Pascal bindings (a legacy 2.x context doesn’t crash).

I pulled out the related functions from glext.pp where it crashes in Load_GL_ARB_blend_func_extended from Load_GL_VERSION_3_3. It looks like the function pointer for glGetString wasn’t loaded but how could that be? I’m using SDL to load the context and I need to use glGetString in order to even return what the highest OpenGL version is on the system.

* thread #1: tid = 0x750fc, 0x00007fff9362ffc8 libGL.dylib`glGetString + 15, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00007fff9362ffc8 libGL.dylib`glGetString + 15
libGL.dylib`glGetString + 15:
-> 0x7fff9362ffc8:  movq   (%rcx), %rdi
   0x7fff9362ffcb:  movq   0x3b0(%rcx), %rcx
   0x7fff9362ffd2:  movl   %eax, %esi
   0x7fff9362ffd4:  popq   %rbp
(lldb) bt
* thread #1: tid = 0x750fc, 0x00007fff9362ffc8 libGL.dylib`glGetString + 15, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00007fff9362ffc8 libGL.dylib`glGetString + 15
    frame #1: 0x00000001000a78fc OpenGL-Tests`GLEXT_$$_LOAD_GL_ARB_BLEND_FUNC_EXTENDED$BOOLEAN$$BOOLEAN + 76
    frame #2: 0x000000010004b6b1 OpenGL-Tests`TEST_1_VERTATTRIBS_$$_TESTVERTATTRIBS + 201
    frame #3: 0x0000000100000ae5 OpenGL-Tests`PASCALMAIN + 69
    frame #4: 0x00000001000205d4 OpenGL-Tests`FPC_SysEntry + 12
    frame #5: 0x0000000100000a4e OpenGL-Tests`FPC_SYSTEMMAIN + 54
    frame #6: 0x00000001000009f4 OpenGL-Tests`start + 52
(lldb)

procedure Load_GL_VERSION_3_3x(var allOK: boolean; out isVersion: Boolean);
var
   dummy: boolean;
begin
  isVersion := Load_GL_ARB_blend_func_extended(true);
  if not isVersion then allOK := false;
  if not Load_GL_ARB_sampler_objects(true) then allOK := false;
  if not Load_GL_ARB_timer_query(true) then allOK := false;
  if not Load_GL_ARB_vertex_type_2_10_10_10_rev(true) then allOK := false;
  Load_GL_VERSION_3_2x(allOK, dummy);
end;


function Load_GL_ARB_blend_func_extended(LoadAsCore: boolean): Boolean;
var
  extstring: String;
begin
  Result := False;
  extstring := String(PChar(glGetString(GL_EXTENSIONS)));

  if LoadAsCore or glext_ExtensionSupported('GL_ARB_blend_func_extended', extstring) then
  begin
    glBindFragDataLocationIndexed := wglGetProcAddress('glBindFragDataLocationIndexed');
    if not Assigned(glBindFragDataLocationIndexed) then Exit;
    glGetFragDataIndex := wglGetProcAddress('glGetFragDataIndex');
    if not Assigned(glGetFragDataIndex) then Exit;
    Result := True;
  end;
end;


Regards,
	Ryan Joseph




More information about the fpc-pascal mailing list