/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/gpu/vk/GrVkVulkan.h" #include "tools/sk_app/android/WindowContextFactory_android.h" #include "tools/sk_app/VulkanWindowContext.h" #include "tools/gpu/vk/VkTestUtils.h" namespace sk_app { namespace window_context_factory { std::unique_ptr MakeVulkanForAndroid(ANativeWindow* window, const DisplayParams& params) { PFN_vkGetInstanceProcAddr instProc; if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc)) { return nullptr; } auto createVkSurface = [window, instProc] (VkInstance instance) -> VkSurfaceKHR { PFN_vkCreateAndroidSurfaceKHR createAndroidSurfaceKHR = (PFN_vkCreateAndroidSurfaceKHR) instProc(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; }; std::unique_ptr ctx( new VulkanWindowContext(params, createVkSurface, canPresent, instProc)); if (!ctx->isValid()) { return nullptr; } return ctx; } } // namespace window_context_factory } // namespace sk_app