#include "vkh.h"
#include "vkh_app.h"
#include "vkh_phyinfo.h"
+#include "vkh_presenter.h"
+#include "vkh_image.h"
+#include "vkh_device.h"
-bool vkeCheckPhyPropBlitSource (VkEngine *e) {
+bool vkeCheckPhyPropBlitSource (vk_engine_t *e) {
VkFormatProperties formatProps;
- vkGetPhysicalDeviceFormatProperties(e->phy, e->renderer.format, &formatProps);
+ vkGetPhysicalDeviceFormatProperties(e->dev->phy, e->renderer->format, &formatProps);
assert((formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) && "Format cannot be used as transfer source");
}
-void initPhySurface(VkEngine* e, VkFormat preferedFormat, VkPresentModeKHR presentMode){
- vkh_presenter* r = &e->renderer;
-
- uint32_t count;
- VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR (e->phy, r->surface, &count, NULL));
- assert (count>0);
- VkSurfaceFormatKHR formats[count];
- VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceFormatsKHR (e->phy, r->surface, &count, formats));
-
- for (int i=0; i<count; i++){
- if (formats[i].format == preferedFormat) {
- r->format = formats[i].format;
- r->colorSpace = formats[i].colorSpace;
- break;
- }
- }
- assert (r->format != VK_FORMAT_UNDEFINED);
-
- VK_CHECK_RESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(e->phy, r->surface, &count, NULL));
- assert (count>0);
- VkPresentModeKHR presentModes[count];
- VK_CHECK_RESULT(vkGetPhysicalDeviceSurfacePresentModesKHR(e->phy, r->surface, &count, presentModes));
- r->presentMode = -1;
- for (int i=0; i<count; i++){
- if (presentModes[i] == presentMode) {
- r->presentMode = presentModes[i];
- break;
- }
- }
- assert (r->presentMode >= 0);
-}
-
-void vke_swapchain_create (VkEngine* e){
- // Ensure all operations on the device have been finished before destroying resources
- vkDeviceWaitIdle(e->dev);
- vkh_presenter* r = &e->renderer;
-
- VkSurfaceCapabilitiesKHR surfCapabilities;
- VK_CHECK_RESULT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(e->phy, r->surface, &surfCapabilities));
- assert (surfCapabilities.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT);
-
-
- // width and height are either both 0xFFFFFFFF, or both not 0xFFFFFFFF.
- if (surfCapabilities.currentExtent.width == 0xFFFFFFFF) {
- // If the surface size is undefined, the size is set to
- // the size of the images requested
- if (r->width < surfCapabilities.minImageExtent.width)
- r->width = surfCapabilities.minImageExtent.width;
- else if (r->width > surfCapabilities.maxImageExtent.width)
- r->width = surfCapabilities.maxImageExtent.width;
- if (r->height < surfCapabilities.minImageExtent.height)
- r->height = surfCapabilities.minImageExtent.height;
- else if (r->height > surfCapabilities.maxImageExtent.height)
- r->height = surfCapabilities.maxImageExtent.height;
- } else {
- // If the surface size is defined, the swap chain size must match
- r->width = surfCapabilities.currentExtent.width;
- r->height= surfCapabilities.currentExtent.height;
- }
-
- VkSwapchainKHR newSwapchain;
- VkSwapchainCreateInfoKHR createInfo = { .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
- .surface = r->surface,
- .minImageCount = surfCapabilities.minImageCount,
- .imageFormat = r->format,
- .imageColorSpace = r->colorSpace,
- .imageExtent = {r->width,r->height},
- .imageArrayLayers = 1,
- .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
- .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
- .preTransform = surfCapabilities.currentTransform,
- .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
- .presentMode = r->presentMode,
- .clipped = VK_TRUE,
- .oldSwapchain = r->swapChain};
-
- VK_CHECK_RESULT(vkCreateSwapchainKHR (e->dev, &createInfo, NULL, &newSwapchain));
- if (r->swapChain != VK_NULL_HANDLE)
- vke_swapchain_destroy(r);
- r->swapChain = newSwapchain;
-
- VK_CHECK_RESULT(vkGetSwapchainImagesKHR(e->dev, r->swapChain, &r->imgCount, NULL));
- assert (r->imgCount>0);
-
- VkImage images[r->imgCount];
- VK_CHECK_RESULT(vkGetSwapchainImagesKHR(e->dev, r->swapChain, &r->imgCount,images));
-
- r->ScBuffers = (ImageBuffer*)malloc(sizeof(ImageBuffer)*r->imgCount);
- r->cmdBuffs = (VkCommandBuffer*)malloc(sizeof(VkCommandBuffer)*r->imgCount);
-
- for (int i=0; i<r->imgCount; i++) {
- ImageBuffer sc_buffer = {};
- VkImageViewCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .image = images[i],
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- .format = r->format,
- .components = {VK_COMPONENT_SWIZZLE_R,VK_COMPONENT_SWIZZLE_G,VK_COMPONENT_SWIZZLE_B,VK_COMPONENT_SWIZZLE_A},
- .subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT,0,1,0,1}};
- VK_CHECK_RESULT(vkCreateImageView(e->dev, &createInfo, NULL, &sc_buffer.view));
- sc_buffer.image = images[i];
- r->ScBuffers [i] = sc_buffer;
- r->cmdBuffs [i] = vkh_cmd_buff_create(e->dev, e->renderer.cmdPool,VK_COMMAND_BUFFER_LEVEL_PRIMARY);
- }
- r->currentScBufferIndex = 0;
-}
-void vke_swapchain_destroy (vkh_presenter* r){
- for (uint32_t i = 0; i < r->imgCount; i++)
- {
- vkDestroyImageView (r->dev, r->ScBuffers[i].view, NULL);
- vkFreeCommandBuffers (r->dev, r->cmdPool, 1, &r->cmdBuffs[i]);
- }
- vkDestroySwapchainKHR(r->dev, r->swapChain, NULL);
- free(r->ScBuffers);
- free(r->cmdBuffs);
-}
VkSampleCountFlagBits getMaxUsableSampleCount(VkSampleCountFlags counts)
{
return VK_SAMPLE_COUNT_1_BIT;
}
-void vkengine_dump_Infos (VkEngine* e){
+void vkengine_dump_Infos (vk_engine_t* e){
printf("max samples = %d\n", getMaxUsableSampleCount(e->gpu_props.limits.framebufferColorSampleCounts));
printf("max tex2d size = %d\n", e->gpu_props.limits.maxImageDimension2D);
printf("max tex array layers = %d\n", e->gpu_props.limits.maxImageArrayLayers);
printf("\n");
}
}
-void vkengine_get_queues_properties (VkEngine* e, VkQueueFamilyProperties** qFamProps, uint32_t* count){
- vkGetPhysicalDeviceQueueFamilyProperties (e->phy, count, NULL);
- (*qFamProps) = (VkQueueFamilyProperties*)malloc((*count) * sizeof(VkQueueFamilyProperties));
- vkGetPhysicalDeviceQueueFamilyProperties (e->phy, count, (*qFamProps));
-}
-VkEngine* vke_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t height) {
- VkEngine* e = (VkEngine*)calloc(1,sizeof(VkEngine));
+vk_engine_t* vke_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t height) {
+ vk_engine_t* e = (vk_engine_t*)calloc(1,sizeof(vk_engine_t));
+
glfwInit();
assert (glfwVulkanSupported()==GLFW_TRUE);
e->app = vkh_app_create("vkvgTest", enabledExtsCount, enabledExts);
- VkhPhyInfo* phys = vkh_app_get_phyinfos(e->app, &phyCount);
+ glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
+ glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
+ glfwWindowHint(GLFW_FLOATING, GLFW_FALSE);
+ glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
+
+ e->window = glfwCreateWindow (width, height, "Window Title", NULL, NULL);
+ VkSurfaceKHR surf;
+
+ assert (glfwCreateWindowSurface(e->app->inst, e->window, NULL, &surf)==VK_SUCCESS);
+
+
+ VkhPhyInfo* phys = vkh_app_get_phyinfos (e->app, &phyCount, surf);
VkhPhyInfo pi = NULL;
for (int i=0; i<phyCount; i++){
pi = phys[i];
- if (pi->properties.deviceType == preferedGPU){
- e->phy = pi->phy;
+ if (pi->properties.deviceType == preferedGPU)
break;
- }
}
e->memory_properties = pi->memProps;
.ppEnabledExtensionNames = dex
};
- VK_CHECK_RESULT(vkCreateDevice(e->phy, &device_info, NULL, &e->dev));
+ VkDevice dev;
+ VK_CHECK_RESULT(vkCreateDevice (pi->phy, &device_info, NULL, &dev));
+ e->dev = vkh_device_create(pi->phy, dev);
+ e->renderer = vkh_presenter_create
+ (e->dev, pi->pQueue, surf, width, height, VK_FORMAT_B8G8R8A8_UNORM, VK_PRESENT_MODE_FIFO_KHR);
- assert (glfwGetPhysicalDevicePresentationSupport (e->app->inst, e->phy, pi->gQueue)==GLFW_TRUE);
-
- e->renderer.width = width;
- e->renderer.height = height;
-
- glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
- glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
- glfwWindowHint(GLFW_FLOATING, GLFW_FALSE);
- glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
-
- vkh_presenter* r = &e->renderer;
- r->dev = e->dev;
-
- r->window = glfwCreateWindow(r->width, r->height, "Window Title", NULL, NULL);
-
- assert (glfwCreateWindowSurface(e->app->inst, r->window, NULL, &r->surface)==VK_SUCCESS);
-
- VkBool32 isSupported;
- vkGetPhysicalDeviceSurfaceSupportKHR(e->phy, pi->gQueue, r->surface, &isSupported);
- assert (isSupported && "vkGetPhysicalDeviceSurfaceSupportKHR");
-
- vkGetDeviceQueue(e->dev, pi->gQueue, 0, &e->renderer.queue);
- e->renderer.qFam = pi->gQueue;
- vkGetDeviceQueue(e->dev, pi->cQueue, 0, &e->computer.queue);
- vkGetDeviceQueue(e->dev, pi->tQueue, 0, &e->loader.queue);
-
- e->renderer.cmdPool = vkh_cmd_pool_create (e->dev, pi->gQueue, 0);
- e->computer.cmdPool = vkh_cmd_pool_create (e->dev, pi->cQueue, 0);
- e->loader.cmdPool = vkh_cmd_pool_create (e->dev, pi->tQueue, 0);
vkh_app_free_phyinfos (phyCount, phys);
- r->semaPresentEnd = vkh_semaphore_create(e->dev);
- r->semaDrawEnd = vkh_semaphore_create(e->dev);
-
- initPhySurface(e,VK_FORMAT_B8G8R8A8_UNORM,VK_PRESENT_MODE_FIFO_KHR);
-
- vke_swapchain_create(e);
return e;
}
-void vke_destroy (VkEngine* e) {
- vkDeviceWaitIdle(e->dev);
- vkh_presenter* r = &e->renderer;
- vke_swapchain_destroy(r);
+void vke_destroy (vk_engine_t* e) {
+ vkDeviceWaitIdle(e->dev->dev);
- vkDestroySemaphore(e->dev, r->semaDrawEnd, NULL);
- vkDestroySemaphore(e->dev, r->semaPresentEnd, NULL);
+ vkDestroySurfaceKHR (e->app->inst, e->renderer->surface, NULL);
- vkDestroyCommandPool (e->dev, e->renderer.cmdPool, NULL);
- vkDestroyCommandPool (e->dev, e->computer.cmdPool, NULL);
- vkDestroyCommandPool (e->dev, e->loader.cmdPool, NULL);
+ vkh_presenter_destroy (e->renderer);
- vkDestroyDevice (e->dev, NULL);
- vkDestroySurfaceKHR (e->app->inst, r->surface, NULL);
- glfwDestroyWindow (r->window);
+ vkDestroyDevice (e->dev->dev, NULL);
+
+ glfwDestroyWindow (e->window);
glfwTerminate ();
vkh_app_destroy (e->app);
static void mouse_move_callback(GLFWwindow* window, double x, double y){}
static void mouse_button_callback(GLFWwindow* window, int but, int state, int modif){}
-void vke_set_key_callback (VkEngine* e, GLFWkeyfun key_callback){
- glfwSetKeyCallback(e->renderer.window, key_callback);
+inline bool vke_should_close (vk_engine_t* e) {
+ return glfwWindowShouldClose (e->window);
+}
+void vke_set_key_callback (vk_engine_t* e, GLFWkeyfun key_callback){
+ glfwSetKeyCallback (e->window, key_callback);
}
-void vke_init_blit_renderer(VkEngine* e, VkImage blitSource){
- vkh_presenter* r = &e->renderer;
- for (int32_t i = 0; i < r->imgCount; ++i)
- {
- VkImage bltDstImage = r->ScBuffers[i].image;
-
- VkCommandBuffer cb = r->cmdBuffs[i];
- vkh_cmd_begin(cb,VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
-
- set_image_layout(cb, bltDstImage, VK_IMAGE_ASPECT_COLOR_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
-
- set_image_layout(cb, blitSource, VK_IMAGE_ASPECT_COLOR_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
-
- VkImageCopy cregion = { .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},
- .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1},
- .srcOffset = {},
- .dstOffset = {0,0,0},
- .extent = {1024,800,1}};
-
- vkCmdCopyImage(cb, blitSource, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, bltDstImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- 1, &cregion);
- set_image_layout(cb, bltDstImage, VK_IMAGE_ASPECT_COLOR_BIT,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
- vkh_cmd_end(cb);
- }
-}
-void submitCommandBuffer(VkQueue queue, VkCommandBuffer *pCmdBuff, VkSemaphore* pWaitSemaphore, VkSemaphore* pSignalSemaphore){
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- VkSubmitInfo submit_info = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
- .commandBufferCount = 1,
- .signalSemaphoreCount = 1,
- .pSignalSemaphores = pSignalSemaphore,
- .waitSemaphoreCount = 1,
- .pWaitSemaphores = pWaitSemaphore,
- .pWaitDstStageMask = &dstStageMask,
- .pCommandBuffers = pCmdBuff};
- VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submit_info, NULL));
-}
-void draw(VkEngine* e, VkImage blitSource) {
- vkh_presenter* r = &e->renderer;
- // Get the index of the next available swapchain image:
- VkResult err = vkAcquireNextImageKHR(e->dev, r->swapChain, UINT64_MAX, r->semaPresentEnd, VK_NULL_HANDLE,
- &r->currentScBufferIndex);
- if ((err == VK_ERROR_OUT_OF_DATE_KHR) || (err == VK_SUBOPTIMAL_KHR)){
- vke_swapchain_create(e);
- vke_init_blit_renderer(e, blitSource);
- }else{
- VK_CHECK_RESULT(err);
- submitCommandBuffer (r->queue, &r->cmdBuffs[r->currentScBufferIndex], &r->semaPresentEnd, &r->semaDrawEnd);
-
- /* Now present the image in the window */
- VkPresentInfoKHR present = { .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
- .swapchainCount = 1,
- .pSwapchains = &r->swapChain,
- .waitSemaphoreCount = 1,
- .pWaitSemaphores = &r->semaDrawEnd,
- .pImageIndices = &r->currentScBufferIndex };
-
- /* Make sure command buffer is finished before presenting */
- VK_CHECK_RESULT(vkQueuePresentKHR(r->queue, &present));
- }
-}