mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
103 lines
3.2 KiB
C++
103 lines
3.2 KiB
C++
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "vulkan_proc_table.h"
|
|
#include "lib/ftl/logging.h"
|
|
|
|
#include <dlfcn.h>
|
|
|
|
namespace vulkan {
|
|
|
|
VulkanProcTable::VulkanProcTable() : valid_(false), handle_(nullptr) {
|
|
if (!OpenLibraryHandle()) {
|
|
return;
|
|
}
|
|
|
|
if (!AcquireProcs()) {
|
|
return;
|
|
}
|
|
|
|
valid_ = true;
|
|
}
|
|
|
|
VulkanProcTable::~VulkanProcTable() {
|
|
CloseLibraryHandle();
|
|
}
|
|
|
|
bool VulkanProcTable::IsValid() const {
|
|
return valid_;
|
|
}
|
|
|
|
bool VulkanProcTable::OpenLibraryHandle() {
|
|
dlerror(); // clear existing errors on thread.
|
|
handle_ = dlopen("libvulkan.so", RTLD_NOW);
|
|
if (handle_ == nullptr) {
|
|
FTL_DLOG(WARNING) << "Could not open the vulkan library: " << dlerror();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool VulkanProcTable::CloseLibraryHandle() {
|
|
if (handle_ != nullptr) {
|
|
dlerror(); // clear existing errors on thread.
|
|
if (dlclose(handle_) != 0) {
|
|
FTL_DLOG(ERROR) << "Could not close the vulkan library handle. This "
|
|
"indicates a leak.";
|
|
FTL_DLOG(ERROR) << dlerror();
|
|
}
|
|
handle_ = nullptr;
|
|
}
|
|
|
|
return handle_ == nullptr;
|
|
}
|
|
|
|
bool VulkanProcTable::AcquireProcs() {
|
|
if (handle_ == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
#define ACQUIRE_PROC(symbol, name) \
|
|
if (!(symbol = reinterpret_cast<decltype(symbol)::Proto>( \
|
|
dlsym(handle_, name)))) { \
|
|
FTL_DLOG(WARNING) << "Could not acquire proc for function " << name; \
|
|
return false; \
|
|
}
|
|
|
|
ACQUIRE_PROC(createInstance, "vkCreateInstance");
|
|
ACQUIRE_PROC(destroyInstance, "vkDestroyInstance");
|
|
ACQUIRE_PROC(enumeratePhysicalDevices, "vkEnumeratePhysicalDevices");
|
|
ACQUIRE_PROC(createDevice, "vkCreateDevice");
|
|
ACQUIRE_PROC(destroyDevice, "vkDestroyDevice");
|
|
ACQUIRE_PROC(getDeviceQueue, "vkGetDeviceQueue");
|
|
ACQUIRE_PROC(getPhysicalDeviceSurfaceCapabilitiesKHR,
|
|
"vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
|
|
ACQUIRE_PROC(getPhysicalDeviceSurfaceFormatsKHR,
|
|
"vkGetPhysicalDeviceSurfaceFormatsKHR");
|
|
ACQUIRE_PROC(createSwapchainKHR, "vkCreateSwapchainKHR");
|
|
ACQUIRE_PROC(getSwapchainImagesKHR, "vkGetSwapchainImagesKHR");
|
|
ACQUIRE_PROC(getPhysicalDeviceSurfacePresentModesKHR,
|
|
"vkGetPhysicalDeviceSurfacePresentModesKHR");
|
|
ACQUIRE_PROC(destroySurfaceKHR, "vkDestroySurfaceKHR");
|
|
ACQUIRE_PROC(createCommandPool, "vkCreateCommandPool");
|
|
ACQUIRE_PROC(destroyCommandPool, "vkDestroyCommandPool");
|
|
ACQUIRE_PROC(createSemaphore, "vkCreateSemaphore");
|
|
ACQUIRE_PROC(destroySemaphore, "vkDestroySemaphore");
|
|
ACQUIRE_PROC(allocateCommandBuffers, "vkAllocateCommandBuffers");
|
|
ACQUIRE_PROC(freeCommandBuffers, "vkFreeCommandBuffers");
|
|
ACQUIRE_PROC(createFence, "vkCreateFence");
|
|
ACQUIRE_PROC(destroyFence, "vkDestroyFence");
|
|
ACQUIRE_PROC(waitForFences, "vkWaitForFences");
|
|
|
|
#if OS_ANDROID
|
|
ACQUIRE_PROC(createAndroidSurfaceKHR, "vkCreateAndroidSurfaceKHR");
|
|
#endif // OS_ANDROID
|
|
|
|
#undef ACQUIRE_PROC
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace vulkan
|