33 using ImageVec = std::vector<XrSwapchainImageBaseHeader *>;
42 std::vector<XrSwapchainImageBaseHeader *> images;
45 CHECK_XR(xrEnumerateSwapchainImages(swapchain, 0, &image_count,
nullptr),
46 "Failed to get count of swapchain images to create for the VR session.");
48 CHECK_XR(xrEnumerateSwapchainImages(swapchain, images.size(), &image_count, images[0]),
49 "Failed to create swapchain images for the VR session.");
55 const XrSession &session,
56 const XrViewConfigurationView &view_config)
59 XrSwapchainCreateInfo create_info = {XR_TYPE_SWAPCHAIN_CREATE_INFO};
62 CHECK_XR(xrEnumerateSwapchainFormats(session, 0, &format_count,
nullptr),
63 "Failed to get count of swapchain image formats.");
64 std::vector<int64_t> swapchain_formats(format_count);
65 CHECK_XR(xrEnumerateSwapchainFormats(
66 session, swapchain_formats.size(), &format_count, swapchain_formats.data()),
67 "Failed to get swapchain image formats.");
68 assert(swapchain_formats.size() == format_count);
74 "Error: No format matching OpenXR runtime supported swapchain formats found.");
77 create_info.usageFlags = XR_SWAPCHAIN_USAGE_SAMPLED_BIT |
78 XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT;
79 create_info.format = *chosen_format;
80 create_info.sampleCount = view_config.recommendedSwapchainSampleCount;
81 create_info.width = view_config.recommendedImageRectWidth;
82 create_info.height = view_config.recommendedImageRectHeight;
83 create_info.faceCount = 1;
84 create_info.arraySize = 1;
85 create_info.mipCount = 1;
87 CHECK_XR(xrCreateSwapchain(session, &create_info, &m_oxr->swapchain),
88 "Failed to create OpenXR swapchain.");
90 m_image_width = create_info.width;
91 m_image_height = create_info.height;
97 : m_oxr(
std::move(other.m_oxr)),
98 m_image_width(other.m_image_width),
99 m_image_height(other.m_image_height),
100 m_is_srgb_buffer(other.m_is_srgb_buffer)
103 other.m_oxr =
nullptr;
109 if (m_oxr && m_oxr->swapchain != XR_NULL_HANDLE) {
117 XrSwapchainImageAcquireInfo acquire_info = {XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO};
118 XrSwapchainImageWaitInfo wait_info = {XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO};
121 CHECK_XR(xrAcquireSwapchainImage(m_oxr->swapchain, &acquire_info, &image_idx),
122 "Failed to acquire swapchain image for the VR session.");
123 wait_info.timeout = XR_INFINITE_DURATION;
124 CHECK_XR(xrWaitSwapchainImage(m_oxr->swapchain, &wait_info),
125 "Failed to acquire swapchain image for the VR session.");
127 return m_oxr->swapchain_images[image_idx];
132 r_sub_image.swapchain = m_oxr->swapchain;
133 r_sub_image.imageRect.offset = {0, 0};
134 r_sub_image.imageRect.extent = {m_image_width, m_image_height};
139 return m_is_srgb_buffer;
144 XrSwapchainImageReleaseInfo release_info = {XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO};
146 CHECK_XR(xrReleaseSwapchainImage(m_oxr->swapchain, &release_info),
147 "Failed to release swapchain image used to submit VR session frame.");
GHOST C-API function and type declarations.
static OpenXRSwapchainData::ImageVec swapchain_images_create(XrSwapchain swapchain, GHOST_IXrGraphicsBinding &gpu_binding)
#define CHECK_XR_ASSERT(call)
#define CHECK_XR(call, error_msg)
virtual std::vector< XrSwapchainImageBaseHeader * > createSwapchainImages(uint32_t image_count)=0
virtual std::optional< int64_t > chooseSwapchainFormat(const std::vector< int64_t > &runtime_formats, bool &r_is_rgb_format) const =0
GHOST_XrSwapchain(GHOST_IXrGraphicsBinding &gpu_binding, const XrSession &session, const XrViewConfigurationView &view_config)
void updateCompositionLayerProjectViewSubImage(XrSwapchainSubImage &r_sub_image)
XrSwapchainImageBaseHeader * acquireDrawableSwapchainImage()
std::vector< XrSwapchainImageBaseHeader * > ImageVec
ImageVec swapchain_images