// File: stetre[P]moonvulkan/src/getproc.c
// Function: Init
static int Init(lua_State *L)
    {
#if defined(LINUX)
    char *err;

    Handle = dlopen(LIBNAME, RTLD_LAZY | RTLD_LOCAL);
    if(!Handle)
        {
        err = dlerror();
        return luaL_error(L, err != NULL ? err : "cannot load " LIBNAME);
        }

    FP(GetInstanceProcAddr) = dlsym(Handle, "vkGetInstanceProcAddr");
    FP(GetDeviceProcAddr) = dlsym(Handle, "vkGetDeviceProcAddr");

#elif defined(MINGW)
    Handle = LoadLibraryW(LLIBNAME);
    if(!Handle)
        Handle = LoadLibraryW(LLIBNAME1);
    if(!Handle)
        return luaL_error(L, "cannot load " LIBNAME " or " LIBNAME1);

    GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)GetProcAddress(Handle, "vkGetInstanceProcAddr");
    GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)GetProcAddress(Handle, "vkGetDeviceProcAddr");

#endif

    if(!GetInstanceProcAddr)
        return luaL_error(L, "cannot find vkGetInstanceProcAddr");
    if(!GetDeviceProcAddr)
        return luaL_error(L, "cannot find vkGetDeviceProcAddr");

    /* Fill the global dispatch table */
#define GET(fn) do {                                            \
    vk.fn = (PFN_vk##fn)GetInstanceProcAddr(NULL, "vk"#fn);     \
    if(!vk.fn) return luaL_error(L, "cannot find vk"#fn);       \
} while(0)
    GET(EnumerateInstanceExtensionProperties);
    GET(EnumerateInstanceLayerProperties);
    GET(CreateInstance);
#undef GET
#define GET(fn) do {                                            \
    vk.fn = (PFN_vk##fn)GetInstanceProcAddr(NULL, "vk"#fn);     \
} while(0)
    GET(EnumerateInstanceVersion);
#undef GET

    return 0;
    }

// Assembly:
subq $0x28, %rsp
movq %rdi, 0x18(%rsp)
leaq 0x8a1cd(%rip), %rdi     # 0xe227d
movl $0x1, %esi
callq 0x19100
movq %rax, 0xa634f(%rip)     # 0xfe410
cmpq $0x0, 0xa6347(%rip)     # 0xfe410
jne 0x58118
callq 0x180e0
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, 0x8(%rsp)
cmpq $0x0, 0x10(%rsp)
je 0x580f2
movq 0x10(%rsp), %rax
movq %rax, (%rsp)
jmp 0x580ff
leaq 0x8a178(%rip), %rax     # 0xe2271
movq %rax, (%rsp)
jmp 0x580ff
movq 0x8(%rsp), %rdi
movq (%rsp), %rsi
movb $0x0, %al
callq 0x19ce0
movl %eax, 0x24(%rsp)
jmp 0x582a0
movq 0xa62f1(%rip), %rdi     # 0xfe410
leaq 0x8a170(%rip), %rsi     # 0xe2296
callq 0x19f20
movq %rax, 0xa62ce(%rip)     # 0xfe400
movq 0xa62d7(%rip), %rdi     # 0xfe410
leaq 0x8a178(%rip), %rsi     # 0xe22b8
callq 0x19f20
movq %rax, 0xa62bc(%rip)     # 0xfe408
cmpq $0x0, 0xa62ac(%rip)     # 0xfe400
jne 0x58172
movq 0x18(%rsp), %rdi
leaq 0x8a128(%rip), %rsi     # 0xe228a
movb $0x0, %al
callq 0x19ce0
movl %eax, 0x24(%rsp)
jmp 0x582a0
cmpq $0x0, 0xa628e(%rip)     # 0xfe408
jne 0x58198
movq 0x18(%rsp), %rdi
leaq 0x8a124(%rip), %rsi     # 0xe22ac
movb $0x0, %al
callq 0x19ce0
movl %eax, 0x24(%rsp)
jmp 0x582a0
jmp 0x5819a
xorl %eax, %eax
movl %eax, %edi
leaq 0x8a133(%rip), %rsi     # 0xe22d8
callq *0xa6255(%rip)          # 0xfe400
movq %rax, %rcx
movq 0xa4e0b(%rip), %rax     # 0xfcfc0
movq %rcx, (%rax)
movq 0xa4e01(%rip), %rax     # 0xfcfc0
cmpq $0x0, (%rax)
jne 0x581e1
movq 0x18(%rsp), %rdi
leaq 0x8a0fb(%rip), %rsi     # 0xe22cc
movb $0x0, %al
callq 0x19ce0
movl %eax, 0x24(%rsp)
jmp 0x582a0
jmp 0x581e3
jmp 0x581e5
xorl %eax, %eax
movl %eax, %edi
leaq 0x8a11b(%rip), %rsi     # 0xe230b
callq *0xa620a(%rip)          # 0xfe400
movq %rax, %rcx
movq 0xa4dc0(%rip), %rax     # 0xfcfc0
movq %rcx, 0x8(%rax)
movq 0xa4db5(%rip), %rax     # 0xfcfc0
cmpq $0x0, 0x8(%rax)
jne 0x5822b
movq 0x18(%rsp), %rdi
leaq 0x8a0e1(%rip), %rsi     # 0xe22ff
movb $0x0, %al
callq 0x19ce0
movl %eax, 0x24(%rsp)
jmp 0x582a0
jmp 0x5822d
jmp 0x5822f
xorl %eax, %eax
movl %eax, %edi
leaq 0x8a100(%rip), %rsi     # 0xe233a
callq *0xa61c0(%rip)          # 0xfe400
movq %rax, %rcx
movq 0xa4d76(%rip), %rax     # 0xfcfc0
movq %rcx, 0x10(%rax)
movq 0xa4d6b(%rip), %rax     # 0xfcfc0
cmpq $0x0, 0x10(%rax)
jne 0x58275
movq 0x18(%rsp), %rdi
leaq 0x8a0c6(%rip), %rsi     # 0xe232e
movb $0x0, %al
callq 0x19ce0
movl %eax, 0x24(%rsp)
jmp 0x582a0
jmp 0x58277
jmp 0x58279
xorl %eax, %eax
movl %eax, %edi
leaq 0x8a0c7(%rip), %rsi     # 0xe234b
callq *0xa6176(%rip)          # 0xfe400
movq %rax, %rcx
movq 0xa4d2c(%rip), %rax     # 0xfcfc0
movq %rcx, 0x18(%rax)
movl $0x0, 0x24(%rsp)
movl 0x24(%rsp), %eax
addq $0x28, %rsp
retq
nopl (%rax)