WindowContext* NewVulkanForAndroid(ANativeWindow* window, const DisplayParams& params) { auto createVkSurface = [window] (VkInstance instance) -> VkSurfaceKHR { static PFN_vkCreateAndroidSurfaceKHR createAndroidSurfaceKHR = nullptr; if (!createAndroidSurfaceKHR) { createAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR)vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR"); } if (!window) { return VK_NULL_HANDLE; } VkSurfaceKHR surface; VkAndroidSurfaceCreateInfoKHR surfaceCreateInfo; memset(&surfaceCreateInfo, 0, sizeof(VkAndroidSurfaceCreateInfoKHR)); surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; surfaceCreateInfo.pNext = nullptr; surfaceCreateInfo.flags = 0; surfaceCreateInfo.window = window; VkResult res = createAndroidSurfaceKHR(instance, &surfaceCreateInfo, nullptr, &surface); return (VK_SUCCESS == res) ? surface : VK_NULL_HANDLE; }; auto canPresent = [](VkInstance, VkPhysicalDevice, uint32_t) { return true; }; WindowContext* ctx = new VulkanWindowContext(params, createVkSurface, canPresent); if (!ctx->isValid()) { delete ctx; return nullptr; } return ctx; }
WindowContext* NewGLForAndroid(ANativeWindow* window, const DisplayParams& params) { WindowContext* ctx = new GLWindowContext_android(window, params); if (!ctx->isValid()) { delete ctx; return nullptr; } return ctx; }
WindowContext* NewRasterForWin(HWND wnd, const DisplayParams& params) { WindowContext* ctx = new RasterWindowContext_win(wnd, params); if (!ctx->isValid()) { delete ctx; ctx = nullptr; } return ctx; }
WindowContext* NewGLForIOS(const IOSWindowInfo& info, const DisplayParams& params) { WindowContext* ctx = new GLWindowContext_ios(info, params); if (!ctx->isValid()) { delete ctx; return nullptr; } return ctx; }
WindowContext* NewGLForXlib(const XlibWindowInfo& winInfo, const DisplayParams& params) { WindowContext* ctx = new GLWindowContext_xlib(winInfo, params); if (!ctx->isValid()) { delete ctx; return nullptr; } return ctx; }
WindowContext* NewRasterForMac(const MacWindowInfo& info, const DisplayParams& params) { WindowContext* ctx = new RasterWindowContext_mac(info, params); if (!ctx->isValid()) { delete ctx; return nullptr; } return ctx; }
WindowContext* NewRasterForXlib(const XlibWindowInfo& info, const DisplayParams& params) { WindowContext* ctx = new RasterWindowContext_xlib(info.fDisplay, info.fWindow, info.fWidth, info.fHeight, params); if (!ctx->isValid()) { delete ctx; ctx = nullptr; } return ctx; }