From cc90174cc46623891aa97ccaf7bdda3184d986a3 Mon Sep 17 00:00:00 2001 From: Brian Salomon Date: Tue, 25 Apr 2017 13:28:45 -0400 Subject: [PATCH] Add GrVkInterface constructor with sepereate instance/device proc getters. Change-Id: I8498c711ee1fa1cded71e4a7a63317a4b125272b Reviewed-on: https://skia-review.googlesource.com/14277 Reviewed-by: Greg Daniel Commit-Queue: Brian Salomon --- include/gpu/vk/GrVkInterface.h | 6 ++++++ src/gpu/vk/GrVkBackendContext.cpp | 16 ++++++---------- src/gpu/vk/GrVkInterface.cpp | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/include/gpu/vk/GrVkInterface.h b/include/gpu/vk/GrVkInterface.h index 1a381bdbe7..05ce561829 100644 --- a/include/gpu/vk/GrVkInterface.h +++ b/include/gpu/vk/GrVkInterface.h @@ -52,6 +52,12 @@ public: VkDevice device, uint32_t extensionFlags); + GrVkInterface(const GetInstanceProc&, + const GetDeviceProc&, + VkInstance instance, + VkDevice device, + uint32_t extensionFlags); + // Validates that the GrVkInterface supports its advertised standard. This means the necessary // function pointers have been initialized for Vulkan version. bool validate(uint32_t extensionFlags) const; diff --git a/src/gpu/vk/GrVkBackendContext.cpp b/src/gpu/vk/GrVkBackendContext.cpp index 3b53f83687..2d8a7d5f66 100644 --- a/src/gpu/vk/GrVkBackendContext.cpp +++ b/src/gpu/vk/GrVkBackendContext.cpp @@ -50,19 +50,15 @@ const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8); const GrVkBackendContext* GrVkBackendContext::Create(uint32_t* presentQueueIndexPtr, CanPresentFn canPresent, GrVkInterface::GetProc getProc) { + if (!getProc) { #ifdef SK_LINK_WITH_VULKAN - if (getProc == nullptr) { - getProc = [](const char* proc_name, - VkInstance instance, VkDevice device) { - if (device != VK_NULL_HANDLE) { - return vkGetDeviceProcAddr(device, proc_name); - } - return vkGetInstanceProcAddr(instance, proc_name); - }; - } + return GrVkBackendContext::Create(vkGetInstanceProcAddr, vkGetDeviceProcAddr, + presentQueueIndexPtr, canPresent); #else - SkASSERT(getProc != nullptr); + return nullptr; #endif + } + SkASSERT(getProc); VkPhysicalDevice physDev; VkDevice device; diff --git a/src/gpu/vk/GrVkInterface.cpp b/src/gpu/vk/GrVkInterface.cpp index b08f7ba851..4188943b17 100644 --- a/src/gpu/vk/GrVkInterface.cpp +++ b/src/gpu/vk/GrVkInterface.cpp @@ -12,6 +12,26 @@ #define ACQUIRE_PROC(name, instance, device) fFunctions.f##name = \ reinterpret_cast(getProc("vk"#name, instance, device)); +GrVkInterface::GetProc make_unified_getter(const GrVkInterface::GetInstanceProc& iproc, + const GrVkInterface::GetDeviceProc& dproc) { + return [&iproc, &dproc](const char* proc_name, VkInstance instance, VkDevice device) { + if (device != VK_NULL_HANDLE) { + return dproc(device, proc_name); + } + return iproc(instance, proc_name); + }; +} + +GrVkInterface::GrVkInterface(const GetInstanceProc& getInstanceProc, + const GetDeviceProc& getDeviceProc, + VkInstance instance, + VkDevice device, + uint32_t extensionFlags) + : GrVkInterface(make_unified_getter(getInstanceProc, getDeviceProc), + instance, + device, + extensionFlags) {} + GrVkInterface::GrVkInterface(GetProc getProc, VkInstance instance, VkDevice device,