VkBool32 Example::buildResources(const vkts::IUpdateThreadContext& updateContext) { VkResult result; // auto lastSwapchain = swapchain; VkSwapchainKHR oldSwapchain = lastSwapchain.get() ? lastSwapchain->getSwapchain() : VK_NULL_HANDLE; swapchain = vkts::wsiSwapchainCreate(initialResources->getPhysicalDevice()->getPhysicalDevice(), initialResources->getDevice()->getDevice(), 0, surface->getSurface(), VKTS_NUMBER_BUFFERS, 1, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_SHARING_MODE_EXCLUSIVE, 0, nullptr, VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, VK_TRUE, oldSwapchain); if (!swapchain.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not create swap chain."); return VK_FALSE; } // swapchainImagesCount = (uint32_t)swapchain->getAllSwapchainImages().size(); if (swapchainImagesCount == 0) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not get swap chain images count."); return VK_FALSE; } swapchainImageView = vkts::SmartPointerVector<vkts::IImageViewSP>(swapchainImagesCount); framebuffer = vkts::SmartPointerVector<vkts::IFramebufferSP>(swapchainImagesCount); cmdBuffer = vkts::SmartPointerVector<vkts::ICommandBuffersSP>(swapchainImagesCount); // if (lastSwapchain.get()) { lastSwapchain->destroy(); } // if (!buildRenderPass()) { return VK_FALSE; } if (!buildPipeline()) { return VK_FALSE; } // vkts::ICommandBuffersSP updateCmdBuffer = vkts::commandBuffersCreate(initialResources->getDevice()->getDevice(), commandPool->getCmdPool(), VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1); if (!updateCmdBuffer.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not create command buffer."); return VK_FALSE; } result = updateCmdBuffer->beginCommandBuffer(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE, 0, VK_NULL_HANDLE, VK_FALSE, 0, 0); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not begin command buffer."); return VK_FALSE; } for (uint32_t index = 0; index < swapchain->getMinImageCount(); index++) { swapchain->cmdPipelineBarrier(updateCmdBuffer->getCommandBuffer(), 0, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, index); } if (!buildDepthTexture(updateCmdBuffer)) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not build texture."); return VK_FALSE; } VkBool32 doUpdateDescriptorSets = VK_FALSE; if (!scene.get()) { if (!buildScene(updateCmdBuffer)) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not build scene."); return VK_FALSE; } doUpdateDescriptorSets = VK_TRUE; } result = updateCmdBuffer->endCommandBuffer(); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not end command buffer."); return VK_FALSE; } VkSubmitInfo submitInfo; memset(&submitInfo, 0, sizeof(VkSubmitInfo)); submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.waitSemaphoreCount = 0; submitInfo.pWaitSemaphores = nullptr; submitInfo.commandBufferCount = updateCmdBuffer->getCommandBufferCount(); submitInfo.pCommandBuffers = updateCmdBuffer->getCommandBuffers(); submitInfo.signalSemaphoreCount = 0; submitInfo.pSignalSemaphores = nullptr; result = initialResources->getQueue()->submit(1, &submitInfo, VK_NULL_HANDLE); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not submit queue."); return VK_FALSE; } result = initialResources->getQueue()->waitIdle(); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not wait for idle queue."); return VK_FALSE; } updateCmdBuffer->destroy(); // if (doUpdateDescriptorSets) { if (!updateDescriptorSets()) { return VK_FALSE; } if (scene.get()) { scene->updateDescriptorSetsRecursive(VKTS_BINDING_UNIFORM_BINDING_COUNT, writeDescriptorSets); } } if (!buildDepthStencilImageView()) { return VK_FALSE; } // for (int32_t i = 0; i < (int32_t)swapchainImagesCount; i++) { if (!buildSwapchainImageView(i)) { return VK_FALSE; } if (!buildFramebuffer(i)) { return VK_FALSE; } if (!buildCmdBuffer(i)) { return VK_FALSE; } } return VK_TRUE; }
VkBool32 Example::buildResources( const vkts::IUpdateThreadContext& updateContext) { VkResult result; // glm::uvec2 dimension = updateContext.getWindowDimension(windowIndex); VkExtent2D extent2D = { dimension.x, dimension.y }; // auto lastSwapchain = swapchain; VkSwapchainKHR oldSwapchain = lastSwapchain.get() ? lastSwapchain->getSwapchain() : VK_NULL_HANDLE; swapchain = vkts::wsiSwapchainCreate(physicalDevice->getPhysicalDevice(), device->getDevice(), 0, surface->getSurface(), VKTS_NUMBER_BUFFERS, extent2D, 1, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_SHARING_MODE_EXCLUSIVE, 0, nullptr, VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, VK_TRUE, oldSwapchain); if (!swapchain.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not create swap chain."); return VK_FALSE; } if (lastSwapchain.get()) { lastSwapchain->destroy(); } // if (!buildRenderPass()) { return VK_FALSE; } if (!buildPipeline()) { return VK_FALSE; } // vkts::IImageSP stageImage; vkts::IDeviceMemorySP stageDeviceMemoryImage; vkts::ICommandBuffersSP updateCmdBuffer = vkts::commandBuffersCreate(device->getDevice(), commandPool->getCmdPool(), VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1); if (!updateCmdBuffer.get()) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not create command buffer."); return VK_FALSE; } result = updateCmdBuffer->beginCommandBuffer(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_NULL_HANDLE, 0, VK_NULL_HANDLE, VK_FALSE, 0, 0); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not begin command buffer."); return VK_FALSE; } for (uint32_t index = 0; index < swapchain->getMinImageCount(); index++) { swapchain->cmdPipelineBarrier(updateCmdBuffer->getCommandBuffer(), 0, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, index); } VkBool32 doUpdateDescriptorSets = VK_FALSE; if (!image.get()) { if (!buildTexture(updateCmdBuffer, stageImage, stageDeviceMemoryImage)) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not build texture."); return VK_FALSE; } doUpdateDescriptorSets = VK_TRUE; } result = updateCmdBuffer->endCommandBuffer(); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not end command buffer."); return VK_FALSE; } VkSubmitInfo submitInfo; memset(&submitInfo, 0, sizeof(VkSubmitInfo)); submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.waitSemaphoreCount = 0; submitInfo.pWaitSemaphores = nullptr; submitInfo.commandBufferCount = updateCmdBuffer->getCommandBufferCount(); submitInfo.pCommandBuffers = updateCmdBuffer->getCommandBuffers(); submitInfo.signalSemaphoreCount = 0; submitInfo.pSignalSemaphores = nullptr; result = queue->submit(1, &submitInfo, VK_NULL_HANDLE); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not submit queue."); return VK_FALSE; } result = queue->waitIdle(); if (result != VK_SUCCESS) { vkts::logPrint(VKTS_LOG_ERROR, "Example: Could not wait for idle queue."); return VK_FALSE; } updateCmdBuffer->destroy(); if (stageImage.get() || stageDeviceMemoryImage.get()) { destroyTexture(stageImage, stageDeviceMemoryImage); } // if (doUpdateDescriptorSets) { if (!updateDescriptorSets()) { return VK_FALSE; } } for (int32_t i = 0; i < VKTS_NUMBER_BUFFERS; i++) { if (!buildSwapchainImageView(i)) { return VK_FALSE; } if (!buildFramebuffer(i)) { return VK_FALSE; } if (!buildCmdBuffer(i)) { return VK_FALSE; } } return VK_TRUE; }