X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fvulkan%2Fvk.cc;h=0e3725b32150a31678535480a9f9a5597a05974e;hb=32feb79dc3b9ddeeab84a0329d53b8aaff86bb80;hp=105cabae25dd07f5fd287114dda061288f158e3f;hpb=0c5fa3525b2c8151bf83a215eee992c257d6fa28;p=demo diff --git a/src/vulkan/vk.cc b/src/vulkan/vk.cc index 105caba..0e3725b 100644 --- a/src/vulkan/vk.cc +++ b/src/vulkan/vk.cc @@ -4,39 +4,46 @@ #include #include #include - #include #include +#include + #include "gfxapi.h" +#include "vkutil.h" /* global variables */ extern GLFWwindow *win; extern int win_w; extern int win_h; -/* static variables */ -static std::vector enabled_extension_names; -static VkInstance inst; -static VkDevice device; -static VkPhysicalDevice pdev; -static VkSurfaceKHR surface; -static uint32_t device_mem_idx; -static uint32_t num_queues; -static uint32_t qfamily_idx; - -static const char *print_vulkan_error(VkResult error); -static const char *dev_type_str(VkPhysicalDeviceType type); -static const char *heap_flags_str(VkMemoryHeapFlags flags); -static const char *memtype_flags_str(VkMemoryPropertyFlags flags); -static const char *queue_flags_str(VkQueueFlags flags); - -/* static fumctions */ -static bool create_instance(); -static bool create_device(); +VkCommandBuffer *swapchain_cmd_bufs; + +/* static functions */ +static void error_callback(int error, const char *descr); +static void clear(float r, float g, float b); +static void viewport(int x, int y, int width, int height); +static void zbuffer(bool enable); +static void cull_face(Gfx_cull_face cf); +static void reshape(int width, int height); +static void swapbuffers(); +static void begin_drawing(); +static void end_drawing(); + +static bool create_swapchain_cmd_bufs(VkCommandPool vkcmdpool); +static bool record_cmd_clear(float r, float g, float b); bool init_vulkan() { + gfx_clear = clear; + gfx_viewport = viewport; + gfx_zbuffer = zbuffer; + gfx_cull_face = cull_face; + gfx_reshape = reshape; + gfx_swapbuffers = swapbuffers; + gfx_begin_drawing = begin_drawing; + gfx_end_drawing = end_drawing; + if(!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW.\n"); return false; @@ -47,12 +54,14 @@ bool init_vulkan() return false; } - if(!create_instance()) { - fprintf(stderr, "Failed to enable validation.\n"); + glfwSetErrorCallback(error_callback); + + if(!vku_create_device()) { + fprintf(stderr, "Failed to initialize vulkan.\n"); return false; } - if(!glfwGetPhysicalDevicePresentationSupport(inst, pdev, qfamily_idx)) { + if(!glfwGetPhysicalDevicePresentationSupport(vkinst, vkpdev, vkqfamily)) { fprintf(stderr, "Presentation support not found.\n"); return false; } @@ -63,341 +72,221 @@ bool init_vulkan() return false; } - if(VkResult err = glfwCreateWindowSurface(inst, win, 0, &surface)) { - fprintf(stderr, "Failed to create KHR surface: %s\n", print_vulkan_error(err)); + if(VkResult err = glfwCreateWindowSurface(vkinst, win, 0, &vksurface)) { + fprintf(stderr, "Failed to create KHR surface: %s\n", vku_get_vulkan_error_str(err)); return false; } - return true; -} - -void cleanup_vulkan() -{ - //TODOs according to the book: - // 1- make sure all threads have been terminated (when I add threads) - // 2- destroy objects in *reverse* order - - vkDestroySurfaceKHR(inst, surface, 0); - - if(vkDeviceWaitIdle(device) == VK_SUCCESS) { - vkDestroyDevice(device, 0); - vkDestroyInstance(inst, 0); - } -} - -static bool create_instance() -{ - /* enable layers */ - uint32_t layer_count = 0; - std::vector enabled_layers; - - if(vkEnumerateInstanceLayerProperties(&layer_count, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to query layer properties.\n"); + if(!vku_create_semaphores()) return false; - } - if(layer_count > 0) { - VkLayerProperties *layers = (VkLayerProperties *)alloca(layer_count * sizeof *layers); - vkEnumerateInstanceLayerProperties(&layer_count, layers); - for(uint32_t i=0; i enabled_extensions; - - if(vkEnumerateInstanceExtensionProperties(0, &extensions_count, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to enumerate instance extension properties\n"); + vkswapchain_images = vku_get_swapchain_images(vkswapchain, &vknum_swapchain_images); + if(!vkswapchain_images) { + fprintf(stderr, "Failed to get swapchain images.\n"); return false; } - if(extensions_count > 0) { - VkExtensionProperties *extensions = (VkExtensionProperties *)alloca(extensions_count * sizeof *extensions); - vkEnumerateInstanceExtensionProperties(0, &extensions_count, extensions); - - for(uint32_t i=0; i 0) { - VkLayerProperties *layers = (VkLayerProperties*)alloca(layer_count * sizeof *layers); - vkEnumerateDeviceLayerProperties(pdev, &layer_count, layers); - printf("%u layers found.\n", layer_count); - for(uint32_t i=0; i