20void SwapchainOpenXR::createSwapchainImageViews()
22 int swapSize = swapChainImagesXr.size();
24 auto aspect = vk::ImageAspectFlagBits::eColor;
26 aspect = vk::ImageAspectFlagBits::eDepth;
29 for (uint32_t i = 0; i < swapSize; i++) {
31 swapChainImagesXr[i].image,
41 this->
wraps = wrapper;
44 case VK_FORMAT_D16_UNORM:
45 case VK_FORMAT_D24_UNORM_S8_UINT:
46 case VK_FORMAT_D32_SFLOAT:
53 createSwapchain(vp,session, format);
54 createSwapchainImageViews();
59 XrSwapchainImageAcquireInfo acquireInfo{ XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO };
61 uint32_t swapchainImageIndex;
62 CHECK_XRCMD(xrAcquireSwapchainImage(xrswapchain.handle, &acquireInfo, &swapchainImageIndex));
64 XrSwapchainImageWaitInfo waitInfo{ XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO };
65 waitInfo.timeout = XR_INFINITE_DURATION;
66 CHECK_XRCMD(xrWaitSwapchainImage(xrswapchain.handle, &waitInfo));
68 currentImage = swapchainImageIndex;
69 std::optional<vk::Semaphore> sem;
70 return std::tuple<uint32_t, std::optional<vk::Semaphore>>(swapchainImageIndex,sem);
75 throw std::runtime_error(
"Synchronization with Semaphore is not supported with openxr swapchains");
80 assert(fence != (vk::Fence) VK_NULL_HANDLE);
83 const uint32_t timeoutNs = 1 * 1000 * 1000 * 1000;
84 for (
int i = 0; i < 5; ++i) {
86 if (res == vk::Result::eSuccess) {
90 PRINT(
"%s",
"Waiting for CmdBuffer fence timed out, retrying...");
93 XrSwapchainImageReleaseInfo releaseInfo{ XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO };
94 CHECK_XRCMD(xrReleaseSwapchainImage(xrswapchain.handle, &releaseInfo));
105 assert(index < swapChainImagesXr.size());
106 assert(index < xrSwapchainImagesBase.size());
107 return swapChainImagesXr[index].image;
118 xrDestroySwapchain(xrswapchain.handle);
123 assert(swapChainImagesXr.size() == xrSwapchainImagesBase.size());
124 return swapChainImagesXr.size();
129 return swapChainImagesXr[currentImage].image;
132void SwapchainOpenXR::createSwapchain(
const XrViewConfigurationView & vp, XrSession* xrSession, int64_t format) {
135 Fmt(
"Creating depth swapchain with dimensions Width=%d Height=%d SampleCount=%d",
136 vp.recommendedImageRectWidth, vp.recommendedImageRectHeight, vp.recommendedSwapchainSampleCount).c_str());)
139 Fmt(
"Creating swapchain with dimensions Width=%d Height=%d SampleCount=%d",
140 vp.recommendedImageRectWidth, vp.recommendedImageRectHeight, vp.recommendedSwapchainSampleCount).c_str());)
144 XrSwapchainCreateInfo swapchainCreateInfo{ XR_TYPE_SWAPCHAIN_CREATE_INFO };
145 swapchainCreateInfo.arraySize = 1;
146 swapchainCreateInfo.format = format;
147 swapchainCreateInfo.width = vp.recommendedImageRectWidth;
148 swapchainCreateInfo.height = vp.recommendedImageRectHeight;
149 swapchainCreateInfo.mipCount = 1;
150 swapchainCreateInfo.faceCount = 1;
151 swapchainCreateInfo.sampleCount = VK_SAMPLE_COUNT_1_BIT;
152 auto usages = XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_TRANSFER_DST_BIT | XR_SWAPCHAIN_USAGE_TRANSFER_SRC_BIT ;
154 usages |= XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
157 usages |= XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_UNORDERED_ACCESS_BIT;
159 swapchainCreateInfo.usageFlags = usages;
162 xrswapchain.width = swapchainCreateInfo.width;
163 xrswapchain.height = swapchainCreateInfo.height;
167 CHECK_XRCMD(xrCreateSwapchain(*xrSession, &swapchainCreateInfo, &xrswapchain.handle));
170 handle = xrswapchain.handle;
173 CHECK_XRCMD(xrEnumerateSwapchainImages(xrswapchain.handle, 0, &imageCount,
nullptr));
175 std::vector<XrSwapchainImageBaseHeader*> swapchainImages = initPresentation(imageCount, swapchainCreateInfo);
177 CHECK_XRCMD(xrEnumerateSwapchainImages(xrswapchain.handle, imageCount, &imageCount, swapchainImages[0]));
179 xrSwapchainImagesBase = swapchainImages;
182 for (
int i = 0; i < swapChainImagesXr.size(); i++) {
183 auto name =
"image id i: " + std::to_string(i) ;
184 name += isDepth ?
"depth" :
"color";
185 vk::DebugUtilsObjectNameInfoEXT debug(vk::ObjectType::eImage, (uint64_t)
static_cast<VkImage
>(swapChainImagesXr[i].image), name.c_str());
191std::vector<XrSwapchainImageBaseHeader*> SwapchainOpenXR::initPresentation(uint32_t count, XrSwapchainCreateInfo swapchainInfo) {
192 vk::Format format =
static_cast<vk::Format
>((VkFormat)swapchainInfo.format);
195 if (format == vk::Format::eR8G8B8A8Srgb) {
196 format = vk::Format::eR8G8B8A8Unorm;
198 if (format == vk::Format::eR8G8B8A8Unorm) {
203 swapchainExtent = vk::Extent2D(swapchainInfo.width, swapchainInfo.height);
205 swapChainImagesXr.resize(count);
207 std::vector<XrSwapchainImageBaseHeader*> bases(count);
208 for (uint32_t i = 0; i < count; ++i) {
209 swapChainImagesXr[i] = { XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR };
210 bases[i] =
reinterpret_cast<XrSwapchainImageBaseHeader*
>(&swapChainImagesXr[i]);
File that contains the SwapchainOpenXR class.
Class that contains helper functions for Vulkan.
file that contains the VulkanWrapper class that manages the classes related to Vulkan code and ease t...
std::vector< vk::ImageView > swapchainImageViews
vk::Extent2D swapchainExtent
std::variant< vk::SwapchainKHR > handle
vk::Format swapchainFormat
int getAttachmentSize() override
SwapchainOpenXR(int64_t format, const XrViewConfigurationView &vp, WindowAbstract *window, VulkanWrapper *wrapper, XrSession *session)
vk::ImageView getSwapchainImageView(int elem) override
std::tuple< uint32_t, std::optional< vk::Semaphore > > acquireImage() override
vk::Image getSwapchainImage(int index) override
vk::Image getCurrentImage() override
void presentImage(uint32_t imageIndex, vk::Semaphore &renderingFinnished) override
Class that manages the classes related to Vulkan code and act as a wrapper around them.
Abstraction of the way of the result is displayed (screen or HMD).