static void load_command_buffer_functions() { if (!gLibrary) { #if defined _WIN32 gLibrary = DynamicLoadLibrary("command_buffer_gles2.dll"); #elif defined SK_BUILD_FOR_MAC gLibrary = DynamicLoadLibrary("libcommand_buffer_gles2.dylib"); #else gLibrary = DynamicLoadLibrary("libcommand_buffer_gles2.so"); #endif // defined _WIN32 if (gLibrary) { gfGetDisplay = (GetDisplayProc)GetProcedureAddress(gLibrary, "eglGetDisplay"); gfInitialize = (InitializeProc)GetProcedureAddress(gLibrary, "eglInitialize"); gfTerminate = (TerminateProc)GetProcedureAddress(gLibrary, "eglTerminate"); gfChooseConfig = (ChooseConfigProc)GetProcedureAddress(gLibrary, "eglChooseConfig"); gfGetConfigAttrib = (GetConfigAttrib)GetProcedureAddress(gLibrary, "eglGetConfigAttrib"); gfCreateWindowSurface = (CreateWindowSurfaceProc)GetProcedureAddress(gLibrary, "eglCreateWindowSurface"); gfCreatePbufferSurface = (CreatePbufferSurfaceProc)GetProcedureAddress(gLibrary, "eglCreatePbufferSurface"); gfDestroySurface = (DestroySurfaceProc)GetProcedureAddress(gLibrary, "eglDestroySurface"); gfCreateContext = (CreateContextProc)GetProcedureAddress(gLibrary, "eglCreateContext"); gfDestroyContext = (DestroyContextProc)GetProcedureAddress(gLibrary, "eglDestroyContext"); gfMakeCurrent = (MakeCurrentProc)GetProcedureAddress(gLibrary, "eglMakeCurrent"); gfSwapBuffers = (SwapBuffersProc)GetProcedureAddress(gLibrary, "eglSwapBuffers"); gfGetProcAddress = (GetProcAddressProc)GetProcedureAddress(gLibrary, "eglGetProcAddress"); gfFunctionsLoadedSuccessfully = gfGetDisplay && gfInitialize && gfTerminate && gfChooseConfig && gfCreateWindowSurface && gfCreatePbufferSurface && gfDestroySurface && gfCreateContext && gfDestroyContext && gfMakeCurrent && gfSwapBuffers && gfGetProcAddress; } } }
bool LoadVkLibraryAndGetProcAddrFuncs(PFN_vkGetInstanceProcAddr* instProc, PFN_vkGetDeviceProcAddr* devProc) { #ifdef SK_MOLTENVK // MoltenVK is a statically linked framework, so there is no Vulkan library to load. *instProc = &vkGetInstanceProcAddr; *devProc = &vkGetDeviceProcAddr; return true; #else static void* vkLib = nullptr; static PFN_vkGetInstanceProcAddr localInstProc = nullptr; static PFN_vkGetDeviceProcAddr localDevProc = nullptr; if (!vkLib) { #if defined _WIN32 vkLib = DynamicLoadLibrary("vulkan-1.dll"); #else vkLib = DynamicLoadLibrary("libvulkan.so"); #endif if (!vkLib) { return false; } localInstProc = (PFN_vkGetInstanceProcAddr) GetProcedureAddress(vkLib, "vkGetInstanceProcAddr"); localDevProc = (PFN_vkGetDeviceProcAddr) GetProcedureAddress(vkLib, "vkGetDeviceProcAddr"); } if (!localInstProc || !localDevProc) { return false; } *instProc = localInstProc; *devProc = localDevProc; return true; #endif }
const GrGLInterface* GrGLCreateANGLEInterface() { static Libs gLibs = { nullptr, nullptr }; if (nullptr == gLibs.fGLLib) { // We load the ANGLE library and never let it go #if defined _WIN32 gLibs.fGLLib = DynamicLoadLibrary("libGLESv2.dll"); gLibs.fEGLLib = DynamicLoadLibrary("libEGL.dll"); #elif defined SK_BUILD_FOR_MAC gLibs.fGLLib = DynamicLoadLibrary("libGLESv2.dylib"); gLibs.fEGLLib = DynamicLoadLibrary("libEGL.dylib"); #else gLibs.fGLLib = DynamicLoadLibrary("libGLESv2.so"); gLibs.fGLLib = DynamicLoadLibrary("libEGL.so"); #endif } if (nullptr == gLibs.fGLLib || nullptr == gLibs.fEGLLib) { // We can't setup the interface correctly w/o the so return nullptr; } return GrGLAssembleGLESInterface(&gLibs, angle_get_gl_proc); }