// File: /workspace/github_c_makefile_star2_O0/lukexi[P]eglstreams-mini/src/egl.c
// Function: SetupEGL
egl_state* SetupEGL() {
    egl_state* EGL = calloc(1, sizeof(egl_state));

    // Setup global EGL state
    GetEglExtensionFunctionPointers();

    EGL->Device = GetEglDevice();

    int drmFd = GetDrmFd(EGL->Device);
    // Set up EGL state for each connected display
    kms_plane* Planes = SetDisplayModes(drmFd, &EGL->DisplaysCount);

    EGL->DRMFD         = drmFd;
    EGL->DisplayDevice = GetEglDisplay(EGL->Device, drmFd);
    EGL->Config        = GetEglConfig(EGL->DisplayDevice);
    EGL->RootContext   = GetEglContext(EGL->DisplayDevice, EGL->Config);


    EGL->Displays     = SetupEGLDisplays(EGL->DisplayDevice,
        EGL->Config, EGL->RootContext, Planes, EGL->DisplaysCount);

    EGLBoolean ret = eglMakeCurrent(EGL->DisplayDevice,
        EGL->Displays->Surface, EGL->Displays->Surface,
        EGL->RootContext);
    if (!ret) Fatal("Couldn't make main context current\n");

    InitGLEW();

    // Disable EGL VSync
    // (seems to have no effect)
    for (int DisplayIndex = 0; DisplayIndex < EGL->DisplaysCount; DisplayIndex++) {
        egl_display* Display = &EGL->Displays[DisplayIndex];
        eglMakeCurrent(Display->DisplayDevice,
            Display->Surface, Display->Surface,
            Display->Context);
        eglSwapInterval(Display->DisplayDevice, 0);
    }

    // Create a drmEventContext configured to
    // call our PageFlipEventHandler function
    // when a page flip occurs
    EGL->DRMEventContext.page_flip_handler = PageFlipEventHandler;
    // EGL->DRMEventContext.vblank_handler    = VBlankEventHandler;
    EGL->DRMEventContext.version           = 2;

    return EGL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movl $0x1, %edi
movl $0x60, %esi
callq 0x2350
movq %rax, -0x8(%rbp)
callq 0x2dc0
callq 0x2f00
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x3090
movl %eax, -0xc(%rbp)
movl -0xc(%rbp), %edi
movq -0x8(%rbp), %rsi
addq $0x8, %rsi
callq 0x3e10
movq %rax, -0x18(%rbp)
movl -0xc(%rbp), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x30(%rax)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl -0xc(%rbp), %esi
callq 0x3150
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x3260
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
callq 0x33a0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdx
movq -0x18(%rbp), %rcx
movq -0x8(%rbp), %rax
movl 0x8(%rax), %r8d
callq 0x3700
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rsi
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rdx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rcx
callq 0x2190
movl %eax, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jne 0x3c06
leaq 0x2b62(%rip), %rdi      # 0x6761
movb $0x0, %al
callq 0x4cf0
callq 0x3a90
movl $0x0, -0x20(%rbp)
movl -0x20(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jge 0x3c73
movq -0x8(%rbp), %rax
movq (%rax), %rax
movslq -0x20(%rbp), %rcx
imulq $0x58, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rdx
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rcx
callq 0x2190
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rdi
xorl %esi, %esi
callq 0x22c0
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x3c12
movq -0x8(%rbp), %rax
leaq 0x22(%rip), %rcx        # 0x3ca0
movq %rcx, 0x48(%rax)
movq -0x8(%rbp), %rax
movl $0x2, 0x38(%rax)
movq -0x8(%rbp), %rax
addq $0x30, %rsp
popq %rbp
retq
nopw (%rax,%rax)