static void terminateApp() { if (initialResources.get()) { initialResources->destroyDevice(); } // if (surface.get()) { surface->destroy(); } // if (window.get()) { window->destroy(); } if (display.get()) { display->destroy(); } vkts::visualTerminate(); // if (initialResources.get()) { initialResources->destroyInstance(); initialResources.reset(); } // vkts::profileTerminate(); // vkts::engineTerminate(); }
BuildCommandTask::BuildCommandTask(const vkts::IUpdateThreadContext& updateContext, const vkts::IInitialResourcesSP& initialResources, const vkts::IGraphicsPipelineSP& pipeline, const vkts::ISceneSP& scene, const uint32_t& objectOffset, const uint32_t& objectStep) : ITask(), updateContext(updateContext), initialResources(initialResources), pipeline(pipeline), scene(scene), objectOffset(objectOffset), objectStep(objectStep), commandBufferInheritanceInfo(nullptr), extent{0, 0}, commandPool(nullptr), cmdBuffer(nullptr) { // This pool will contain secondary command buffers, which will be reseted. commandPool = vkts::commandPoolCreate(initialResources->getDevice()->getDevice(), VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, initialResources->getQueue()->getQueueFamilyIndex()); if (!commandPool.get()) { vkts::logPrint(VKTS_LOG_ERROR, "BuildCommandTask: Could not get command pool."); } // cmdBuffer = vkts::commandBuffersCreate(initialResources->getDevice()->getDevice(), commandPool->getCmdPool(), VK_COMMAND_BUFFER_LEVEL_SECONDARY, 1); if (!cmdBuffer.get()) { vkts::logPrint(VKTS_LOG_ERROR, "BuildCommandTask: Could not create command buffer."); commandPool->destroy(); } }
int main() { // // Engine initialization. // if (!vkts::engineInit()) { return -1; } vkts::logSetLevel(VKTS_LOG_INFO); // // Set task executors. // if (!vkts::engineSetTaskExecutorCount(vkts::processorGetNumber())) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not set task executors."); terminateApp(); return -1; } // VkResult result; // if (!vkts::wsiGatherNeededInstanceExtensions()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not gather instance extensions."); terminateApp(); return -1; } auto instance = vkts::instanceCreate(VKTS_EXAMPLE_NAME, VK_MAKE_VERSION(1, 0, 0), VK_MAKE_VERSION(1, 0, 0), 0, 0, nullptr, vkts::extensionGetNeededInstanceExtensionCount(), vkts::extensionGetNeededInstanceExtensionNames()); if (!instance.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create instance."); terminateApp(); return -1; } if (!vkts::wsiInitInstanceExtensions(instance->getInstance())) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not initialize instance extension."); terminateApp(); return -1; } auto physicalDevice = vkts::physicalDeviceCreate(instance->getInstance(), 0); if (!physicalDevice.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not get physical device."); terminateApp(); return -1; } // VkPhysicalDeviceFeatures physicalDeviceFeatures; physicalDevice->getPhysicalDeviceFeatures(physicalDeviceFeatures); // Check, if geometry and tessellation shader are available. if (!physicalDeviceFeatures.geometryShader || !physicalDeviceFeatures.tessellationShader) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Physical device not capable of geometry and tessellation shaders."); return VK_FALSE; } // if (!vkts::wsiGatherNeededDeviceExtensions(physicalDevice->getPhysicalDevice())) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not gather device extension."); terminateApp(); return -1; } // // Visual initialization. // if (!vkts::visualInit(instance->getInstance(), physicalDevice->getPhysicalDevice())) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not initialize visual."); terminateApp(); return -1; } display = vkts::visualCreateDefaultDisplay().lock(); if (!display.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create display."); terminateApp(); return -1; } window = vkts::visualCreateWindow(display, VKTS_EXAMPLE_NAME, 1024, 768, VK_FALSE, VK_TRUE, VK_FALSE).lock(); if (!window.get()) { window = vkts::visualGetWindow(VKTS_DEFAULT_WINDOW_INDEX).lock(); if (!window.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create window."); terminateApp(); return -1; } } // surface = vkts::wsiSurfaceCreate(instance->getInstance(), display->getNativeDisplay(), window->getNativeWindow()); if (!surface.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create surface."); terminateApp(); return -1; } // std::vector<VkBool32> supportFilter; result = vkts::wsiGetPhysicalDeviceSurfaceSupport(physicalDevice->getPhysicalDevice(), surface->getSurface(), (uint32_t) physicalDevice->getAllQueueFamilyProperties().size(), supportFilter); if (result != VK_SUCCESS || supportFilter.size() == 0) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not get physical device surface support."); terminateApp(); return -1; } // uint32_t queueFamilyIndex; if (!vkts::queueGetFamilyIndex(physicalDevice->getAllQueueFamilyProperties(), VK_QUEUE_GRAPHICS_BIT, 0, &supportFilter, queueFamilyIndex)) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not find queue family index."); terminateApp(); return -1; } // float queuePriorities[1] = {0.0f}; VkDeviceQueueCreateInfo deviceQueueCreateInfo; memset(&deviceQueueCreateInfo, 0, sizeof(VkDeviceQueueCreateInfo)); deviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; deviceQueueCreateInfo.flags = 0; deviceQueueCreateInfo.queueFamilyIndex = 0; deviceQueueCreateInfo.queueCount = 1; deviceQueueCreateInfo.pQueuePriorities = queuePriorities; auto device = vkts::deviceCreate(physicalDevice->getPhysicalDevice(), 0, 1, &deviceQueueCreateInfo, 0, nullptr, vkts::extensionGetNeededDeviceExtensionCount(), vkts::extensionGetNeededDeviceExtensionNames(), nullptr); if (!device.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create device."); terminateApp(); return -1; } if (!vkts::wsiInitDeviceExtensions(device->getDevice())) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not initialize device extension."); terminateApp(); return -1; } // auto queue = vkts::queueGet(device->getDevice(), queueFamilyIndex, 0); if (!queue.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not get device queue."); terminateApp(); return -1; } // initialResources = vkts::initialResourcesCreate(instance, physicalDevice, device, queue); if (!initialResources.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create initial resources."); terminateApp(); return -1; } // // Example setup. // // Single threaded application, so it is safe to pass display and window. vkts::IUpdateThreadSP example = vkts::IUpdateThreadSP(new Example(initialResources, window->getIndex(), surface)); if (!example.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Main: Could not create application."); terminateApp(); return -1; } // This update thread is executed in the main loop. No additional thread is launched. vkts::engineAddUpdateThread(example); // // Execution. // vkts::engineRun(); // // Termination. // terminateApp(); return 0; }