X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fvulkan%2Fvkutil.cc;h=35a85dd0e3a378d52ae8cdf43a910bcecc0e54f6;hb=22347bb45e427ea763295d77da0de0d2ef9c2395;hp=051ee4dc7174b101c6301ba2924046ec7a55f34e;hpb=9148ff7614b1dc22fd5d1dcf6d74e2fb4ff13706;p=demo diff --git a/src/vulkan/vkutil.cc b/src/vulkan/vkutil.cc index 051ee4d..35a85dd 100644 --- a/src/vulkan/vkutil.cc +++ b/src/vulkan/vkutil.cc @@ -1,3 +1,4 @@ +#include #include #include #include @@ -6,22 +7,31 @@ #include #include +#include "allocator.h" #include "vkutil.h" /* global variables */ - -VkSwapchainKHR vkswapchain; -VkImage *vkswapchain_images; -int vknext_swapchain_image; -VkSurfaceKHR vksurface; +VkPhysicalDevice vk_physical; +VkDevice vk_device; +VkCommandPool vk_pool; +VkQueue vk_queue; +VkSurfaceKHR vk_surface; +VkSwapchainKHR vk_swapchain; + +VkPipeline *vkgparent_pipeline; +VkFramebuffer *vkfbufs; +VkRenderPass vkrpass; VkInstance vkinst; -VkPhysicalDevice vkpdev; -VkDevice vkdev; -VkQueue vkq; -VkCommandPool vkcmdpool; VkCommandBuffer vkcmdbuf; /* primary command buffer */ int vkqfamily; +VkSemaphore vk_img_avail_sema; +VkSemaphore vk_rend_done_sema; +VkImage *vkswapchain_images; +VkImageView *vkswapchain_views; +int vknum_swapchain_images; +int vk_curr_swapchain_image; + /* static functions */ static const char *get_device_name_str(VkPhysicalDeviceType type); static const char *get_memtype_flags_str(VkMemoryPropertyFlags flags); @@ -46,10 +56,7 @@ bool vku_have_extension(const char *name) vkext_count = 0; vkEnumerateInstanceExtensionProperties(0, &vkext_count, 0); if(vkext_count) { - if(!(vkext = (VkExtensionProperties *)malloc(vkext_count * sizeof *vkext))) { - perror("failed to allocate instance extension list"); - return false; - } + vkext = new VkExtensionProperties[vkext_count]; vkEnumerateInstanceExtensionProperties(0, &vkext_count, vkext); printf("instance extensions:\n"); @@ -75,10 +82,7 @@ bool vku_have_device_extension(const char *name) vkdevext_count = 0; vkEnumerateDeviceExtensionProperties(phys_devices[sel_dev], 0, &vkdevext_count, 0); if(vkdevext_count) { - if(!(vkdevext = (VkExtensionProperties *)malloc(vkdevext_count * sizeof *vkdevext))) { - perror("failed to allocate device extension list"); - return false; - } + vkdevext = new VkExtensionProperties[vkdevext_count]; vkEnumerateDeviceExtensionProperties(phys_devices[sel_dev], 0, &vkdevext_count, vkdevext); printf("selected device extensions:\n"); @@ -137,7 +141,7 @@ bool vku_create_device() fprintf(stderr, "failed to enumerate vulkan physical devices\n"); return false; } - phys_devices = (VkPhysicalDevice *)malloc(num_devices * sizeof *phys_devices); + phys_devices = new VkPhysicalDevice[num_devices]; if(vkEnumeratePhysicalDevices(vkinst, &num_devices, phys_devices) != 0) { fprintf(stderr, "failed to enumerate vulkan physical devices\n"); return false; @@ -179,7 +183,7 @@ bool vku_create_device() if(qprop_count <= 0) { continue; } - qprop = (VkQueueFamilyProperties *)malloc(qprop_count * sizeof *qprop); + qprop = new VkQueueFamilyProperties[qprop_count]; vkGetPhysicalDeviceQueueFamilyProperties(phys_devices[i], &qprop_count, qprop); for(unsigned int j=0; jformat = VK_FORMAT_B8G8R8_UNORM; } - vkGetSwapchainImagesKHR(vkdev, sc, &nimg, images); - if(count) *count = (int)nimg; - return images; + delete [] formats; + return true; } + int vku_get_next_image(VkSwapchainKHR sc) { uint32_t next; - if(vkAcquireNextImageKHR(vkdev, sc, UINT64_MAX, 0, 0, &next) != 0) { + if(vkAcquireNextImageKHR(vk_device, sc, UINT64_MAX, 0, 0, &next) != 0) { return -1; } return (int)next; @@ -391,7 +424,7 @@ void vku_present(VkSwapchainKHR sc, int img_idx) inf.pImageIndices = &index; inf.pResults = &res; - vkQueuePresentKHR(vkq, &inf); + vkQueuePresentKHR(vk_queue, &inf); } struct vku_buffer *vku_create_buffer(int sz, unsigned int usage) @@ -399,10 +432,7 @@ struct vku_buffer *vku_create_buffer(int sz, unsigned int usage) struct vku_buffer *buf; VkBufferCreateInfo binfo; - if(!(buf = (vku_buffer *)malloc(sizeof *buf))) { - perror("failed to allocate vk_buffer structure"); - return 0; - } + buf = new vku_buffer; memset(&binfo, 0, sizeof binfo); binfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; @@ -410,19 +440,31 @@ struct vku_buffer *vku_create_buffer(int sz, unsigned int usage) binfo.usage = usage; binfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - if(vkCreateBuffer(vkdev, &binfo, 0, &buf->buf) != 0) { + if(vkCreateBuffer(vk_device, &binfo, 0, &buf->buf) != 0) { fprintf(stderr, "failed to create %d byte buffer (usage: %x)\n", sz, usage); return 0; } - // TODO back with memory + + VkMemoryRequirements mr; + vkGetBufferMemoryRequirements(vk_device, buf->buf, &mr); + + DevMemBlock block; + if(!vku_allocate(mr.size, &block)) + return 0; + + buf->mem_pool = block.dev_mem; + return buf; } void vku_destroy_buffer(struct vku_buffer *buf) { if(buf) { - vkDestroyBuffer(vkdev, buf->buf, 0); - free(buf); + //TODO change when the allocator changes + vku_free(buf->mem_pool); + + vkDestroyBuffer(vk_device, buf->buf, 0); + delete buf; } } @@ -437,257 +479,6 @@ void vku_cmd_copybuf(VkCommandBuffer cmdbuf, VkBuffer dest, int doffs, vkCmdCopyBuffer(cmdbuf, src, dest, 1, ©); } -/* paste - -static bool create_instance() -{ - uint32_t layer_count = 0; - std::vector enabled_layers; - - if(vkEnumerateInstanceLayerProperties(&layer_count, 0) != VK_SUCCESS) { - fprintf(stderr, "Failed to query layer properties.\n"); - 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"); - 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