Add GrVkInterface constructor with sepereate instance/device proc getters.

Change-Id: I8498c711ee1fa1cded71e4a7a63317a4b125272b
Reviewed-on: https://skia-review.googlesource.com/14277
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
This commit is contained in:
Brian Salomon 2017-04-25 13:28:45 -04:00 committed by Skia Commit-Bot
parent 9378732e89
commit cc90174cc4
3 changed files with 32 additions and 10 deletions

View File

@ -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;

View File

@ -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;

View File

@ -12,6 +12,26 @@
#define ACQUIRE_PROC(name, instance, device) fFunctions.f##name = \
reinterpret_cast<PFN_vk##name>(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,