Instead of wrapping Vulkan in complex class hierarchies, use a plain C struct and functions:
// Simple state struct - no classes, no inheritance
struct VulkanState {
VkInstance instance;
VkPhysicalDevice physical_device;
VkDevice device;
VkSurfaceKHR surface;
GLFWwindow* window;
};
bool create_vulkan_instance(VulkanState* vk) {
VkApplicationInfo app_info = {};
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app_info.pApplicationName = "My App";
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.pEngineName = "No Engine";
app_info.apiVersion = VK_API_VERSION_1_3;
VkInstanceCreateInfo create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
create_info.pApplicationInfo = &app_info;
// Get GLFW extensions
uint32_t glfw_ext_count = 0;
const char** glfw_exts = glfwGetRequiredInstanceExtensions(&glfw_ext_count);
create_info.enabledExtensionCount = glfw_ext_count;
create_info.ppEnabledExtensionNames = glfw_exts;
return vkCreateInstance(&create_info, nullptr, &vk->instance) == VK_SUCCESS;
}
void cleanup_vulkan(VulkanState* vk) {
vkDestroyDevice(vk->device, nullptr);
vkDestroySurfaceKHR(vk->instance, vk->surface, nullptr);
vkDestroyInstance(vk->instance, nullptr);
}
// Usage
int main() {
VulkanState vk = {};
if (!create_vulkan_instance(&vk)) return 1;
// ... use vk
cleanup_vulkan(&vk);
}
Benefits: