PacktPublishing/Vulkan-Cookbook

Recompiling With /std:c++latest in Visual Studio Breaks The Project

trutty2 opened this issue · 4 comments

CookbookSampleFramework.h / OS.cpp cannot be recompiled in a project with C++20 features enabled in Visual Studio (it seems to work fine as long as changes aren't made to these files). I have limited experience in C++ (and none in template metaprogramming) as of right now, but from what I gather it's because of the VkDestroyer template code relying on some features that are removed from the language past C++17.

Here's the error message:

Error C2664 'VulkanCookbook::FrameResources::FrameResources(VkCommandBuffer &,VulkanCookbook::VkDestroyerVulkanCookbook::VkSemaphoreWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkSemaphoreWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkFenceWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkImageViewWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkFramebufferWrapper &)': cannot convert argument 2 from '_Ty' to 'VulkanCookbook::VkDestroyerVulkanCookbook::VkSemaphoreWrapper &'

I have the same problem as well. I tried create a version of the constructor that uses Rvalue references, and that gets the code to compile. However I don't think that the frame resources are created correctly anyway as the DrawingFInishedFence is in some state that always returns a time out value when I wait for it.

CookbookSampleFramework.h / OS.cpp cannot be recompiled in a project with C++20 features enabled in Visual Studio (it seems to work fine as long as changes aren't made to these files). I have limited experience in C++ (and none in template metaprogramming) as of right now, but from what I gather it's because of the VkDestroyer template code relying on some features that are removed from the language past C++17.

Here's the error message:

Error C2664 'VulkanCookbook::FrameResources::FrameResources(VkCommandBuffer &,VulkanCookbook::VkDestroyerVulkanCookbook::VkSemaphoreWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkSemaphoreWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkFenceWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkImageViewWrapper &,VulkanCookbook::VkDestroyerVulkanCookbook::VkFramebufferWrapper &)': cannot convert argument 2 from '_Ty' to 'VulkanCookbook::VkDestroyerVulkanCookbook::VkSemaphoreWrapper &'

Try this:

FrameResources(VkCommandBuffer& commandBuffer,
			VkDestroyer(VkSemaphore)&& imageAcquiredSemaphore,
			VkDestroyer(VkSemaphore)&& readyToPresentSemaphore,
			VkDestroyer(VkFence)&& drawingFinishedFence,
			VkDestroyer(VkImageView)&& depthAttachment,
			VkDestroyer(VkFramebuffer)&& frameBuffer) :
			CommandBuffer(commandBuffer),
			ImageAcquiredSemaphore(std::move(imageAcquiredSemaphore)),
			ReadyToPresentSemaphore(std::move(readyToPresentSemaphore)),
			DrawingFinishedFence(std::move(drawingFinishedFence)),
			DepthAttachment(std::move(depthAttachment)),
			Framebuffer(std::move(frameBuffer)) {
		}

Here's how I create the frame resources:
VkDestroyer(VkFramebuffer) frameBuffer; FrameResourcesVec.emplace_back( commandBuffer[0], std::move(imageAcquiredSemaphore), std::move(readyToPresentSemaphore), std::move(drawingFinishedFence), std::move(depthAttachment), std::move(frameBuffer));

I discovered this also using mingw-64 GCC. Any c++ standard fails. I also fixed it the same as you. Too bad I didn't read your post first. I could have saved a lot of time.

Well, hopefully the source files get corrected at some point.