Add new GrVkBackendContext::Create explicitly requiring vk proc getters
Also remove the feature of GrVkGpu that creates the instance/device if the client doesn't provide one.
Change-Id: Ie617313b6c684ed355333a475b80d0aae7e3a026
Reviewed-on: https://skia-review.googlesource.com/14261
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/include/gpu/vk/GrVkBackendContext.h b/include/gpu/vk/GrVkBackendContext.h
index 5ae7b31..5838caa 100644
--- a/include/gpu/vk/GrVkBackendContext.h
+++ b/include/gpu/vk/GrVkBackendContext.h
@@ -58,6 +58,20 @@
CanPresentFn = CanPresentFn(),
GrVkInterface::GetProc getProc = nullptr);
+ static const GrVkBackendContext* Create(const GrVkInterface::GetInstanceProc& getInstanceProc,
+ const GrVkInterface::GetDeviceProc& getDeviceProc,
+ uint32_t* presentQueueIndex = nullptr,
+ CanPresentFn canPresent = CanPresentFn()) {
+ auto getProc = [&getInstanceProc, &getDeviceProc](const char* proc_name,
+ VkInstance instance, VkDevice device) {
+ if (device != VK_NULL_HANDLE) {
+ return getDeviceProc(device, proc_name);
+ }
+ return getInstanceProc(instance, proc_name);
+ };
+ return Create(presentQueueIndex, canPresent, getProc);
+ }
+
~GrVkBackendContext() override;
};
diff --git a/include/gpu/vk/GrVkInterface.h b/include/gpu/vk/GrVkInterface.h
index dca47ff..1a381bd 100644
--- a/include/gpu/vk/GrVkInterface.h
+++ b/include/gpu/vk/GrVkInterface.h
@@ -40,6 +40,13 @@
VkInstance, // instance or VK_NULL_HANDLE
VkDevice // device or VK_NULL_HANDLE
)>;
+
+ // This is typically vkGetInstanceProcAddr.
+ using GetInstanceProc = std::function<PFN_vkVoidFunction(VkInstance, const char*)>;
+
+ // This is typically vkGetDeviceProcAddr.
+ using GetDeviceProc = std::function<PFN_vkVoidFunction(VkDevice, const char*)>;
+
GrVkInterface(GetProc getProc,
VkInstance instance,
VkDevice device,
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 3d30e35..d8f1037 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -77,10 +77,7 @@
const GrVkBackendContext* vkBackendContext =
reinterpret_cast<const GrVkBackendContext*>(backendContext);
if (!vkBackendContext) {
- vkBackendContext = GrVkBackendContext::Create();
- if (!vkBackendContext) {
- return nullptr;
- }
+ return nullptr;
} else {
vkBackendContext->ref();
}
diff --git a/tools/gpu/vk/VkTestContext.cpp b/tools/gpu/vk/VkTestContext.cpp
index b1e7ad4..3e76d87 100644
--- a/tools/gpu/vk/VkTestContext.cpp
+++ b/tools/gpu/vk/VkTestContext.cpp
@@ -109,7 +109,8 @@
class VkTestContextImpl : public sk_gpu_test::VkTestContext {
public:
static VkTestContext* Create() {
- sk_sp<const GrVkBackendContext> backendContext(GrVkBackendContext::Create());
+ sk_sp<const GrVkBackendContext> backendContext(
+ GrVkBackendContext::Create(vkGetInstanceProcAddr, vkGetDeviceProcAddr));
if (!backendContext) {
return nullptr;
}
diff --git a/tools/viewer/sk_app/VulkanWindowContext.cpp b/tools/viewer/sk_app/VulkanWindowContext.cpp
index 831c7ae..f483c27 100644
--- a/tools/viewer/sk_app/VulkanWindowContext.cpp
+++ b/tools/viewer/sk_app/VulkanWindowContext.cpp
@@ -41,7 +41,8 @@
, fBackbuffers(nullptr) {
// any config code here (particularly for msaa)?
- fBackendContext.reset(GrVkBackendContext::Create(&fPresentQueueIndex, canPresent));
+ fBackendContext.reset(GrVkBackendContext::Create(vkGetInstanceProcAddr, vkGetDeviceProcAddr,
+ &fPresentQueueIndex, canPresent));
if (!(fBackendContext->fExtensions & kKHR_surface_GrVkExtensionFlag) ||
!(fBackendContext->fExtensions & kKHR_swapchain_GrVkExtensionFlag)) {