[Bf-blender-cvs] [8b8142c13a7] soc-2019-openxr: Remove obscure unique_oxr_ptr, implement alternative RAII for swapchain
Julian Eisel
noreply at git.blender.org
Tue Mar 10 16:34:46 CET 2020
Commit: 8b8142c13a70cd72c794f6a0fd9f4fdd7789f72a
Author: Julian Eisel
Date: Tue Mar 10 15:30:21 2020 +0100
Branches: soc-2019-openxr
https://developer.blender.org/rB8b8142c13a70cd72c794f6a0fd9f4fdd7789f72a
Remove obscure unique_oxr_ptr, implement alternative RAII for swapchain
Add an own class for the swapchain, through which we can ensure correct
RAII resource management.
===================================================================
M intern/ghost/CMakeLists.txt
M intern/ghost/intern/GHOST_IXrGraphicsBinding.h
M intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
M intern/ghost/intern/GHOST_XrSession.cpp
M intern/ghost/intern/GHOST_XrSession.h
A intern/ghost/intern/GHOST_XrSwapchain.cpp
A intern/ghost/intern/GHOST_XrSwapchain.h
M intern/ghost/intern/GHOST_Xr_intern.h
===================================================================
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index 8bd46cb4f64..07d98475c00 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -364,13 +364,15 @@ if(WITH_XR_OPENXR)
intern/GHOST_XrEvent.cpp
intern/GHOST_XrGraphicsBinding.cpp
intern/GHOST_XrSession.cpp
+ intern/GHOST_XrSwapchain.cpp
GHOST_IXrContext.h
+ intern/GHOST_IXrGraphicsBinding.h
intern/GHOST_Xr_intern.h
intern/GHOST_Xr_openxr_includes.h
intern/GHOST_XrContext.h
- intern/GHOST_IXrGraphicsBinding.h
intern/GHOST_XrSession.h
+ intern/GHOST_XrSwapchain.h
)
list(APPEND INC_SYS
${XR_OPENXR_SDK_INCLUDE_DIR}
diff --git a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
index 4cc71d19f21..4ef91d8ce46 100644
--- a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
@@ -57,7 +57,7 @@ class GHOST_IXrGraphicsBinding {
int64_t *r_result) const = 0;
virtual std::vector<XrSwapchainImageBaseHeader *> createSwapchainImages(
uint32_t image_count) = 0;
- virtual void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
+ virtual void submitToSwapchainImage(XrSwapchainImageBaseHeader *swapchain_image,
const GHOST_XrDrawViewInfo *draw_info) = 0;
protected:
diff --git a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
index b6a4f76b92d..ddc757b8f8a 100644
--- a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
@@ -153,8 +153,8 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
return base_images;
}
- void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
- const GHOST_XrDrawViewInfo *draw_info) override
+ void submitToSwapchainImage(XrSwapchainImageBaseHeader *swapchain_image,
+ const GHOST_XrDrawViewInfo *draw_info) override
{
XrSwapchainImageOpenGLKHR *ogl_swapchain_image = reinterpret_cast<XrSwapchainImageOpenGLKHR *>(
swapchain_image);
@@ -257,8 +257,8 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
return base_images;
}
- void submitToSwapchain(XrSwapchainImageBaseHeader *swapchain_image,
- const GHOST_XrDrawViewInfo *draw_info) override
+ void submitToSwapchainImage(XrSwapchainImageBaseHeader *swapchain_image,
+ const GHOST_XrDrawViewInfo *draw_info) override
{
XrSwapchainImageD3D11KHR *d3d_swapchain_image = reinterpret_cast<XrSwapchainImageD3D11KHR *>(
swapchain_image);
diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index 4dfd72f46a3..818e9322ea7 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -31,6 +31,7 @@
#include "GHOST_Xr_intern.h"
#include "GHOST_XrContext.h"
#include "GHOST_XrException.h"
+#include "GHOST_XrSwapchain.h"
#include "GHOST_XrSession.h"
@@ -43,9 +44,7 @@ struct OpenXRSessionData {
const XrViewConfigurationType view_type = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
XrSpace reference_space;
std::vector<XrView> views;
- std::vector<XrSwapchain> swapchains;
- std::map<XrSwapchain, std::vector<XrSwapchainImageBaseHeader *>> swapchain_images;
- int32_t swapchain_image_width, swapchain_image_height;
+ std::vector<std::unique_ptr<GHOST_XrSwapchain>> swapchains;
};
struct GHOST_XrDrawInfo {
@@ -71,10 +70,8 @@ GHOST_XrSession::~GHOST_XrSession()
{
unbindGraphicsContext();
- for (XrSwapchain &swapchain : m_oxr->swapchains) {
- CHECK_XR_ASSERT(xrDestroySwapchain(swapchain));
- }
m_oxr->swapchains.clear();
+
if (m_oxr->reference_space != XR_NULL_HANDLE) {
CHECK_XR_ASSERT(xrDestroySpace(m_oxr->reference_space));
}
@@ -241,58 +238,6 @@ GHOST_XrSession::LifeExpectancy GHOST_XrSession::handleStateChangeEvent(
*
* \{ */
-static std::vector<XrSwapchainImageBaseHeader *> swapchain_images_create(
- XrSwapchain swapchain, GHOST_IXrGraphicsBinding *gpu_binding)
-{
- std::vector<XrSwapchainImageBaseHeader *> images;
- uint32_t image_count;
-
- CHECK_XR(xrEnumerateSwapchainImages(swapchain, 0, &image_count, nullptr),
- "Failed to get count of swapchain images to create for the VR session.");
- images = gpu_binding->createSwapchainImages(image_count);
- CHECK_XR(xrEnumerateSwapchainImages(swapchain, images.size(), &image_count, images[0]),
- "Failed to create swapchain images for the VR session.");
-
- return images;
-}
-
-static unique_oxr_ptr<XrSwapchain> swapchain_create(const XrSession session,
- GHOST_IXrGraphicsBinding *gpu_binding,
- const XrViewConfigurationView *xr_view)
-{
- XrSwapchainCreateInfo create_info = {XR_TYPE_SWAPCHAIN_CREATE_INFO};
- unique_oxr_ptr<XrSwapchain> swapchain(xrDestroySwapchain);
- uint32_t format_count = 0;
- int64_t chosen_format;
-
- CHECK_XR(xrEnumerateSwapchainFormats(session, 0, &format_count, nullptr),
- "Failed to get count of swapchain image formats.");
- std::vector<int64_t> swapchain_formats(format_count);
- CHECK_XR(xrEnumerateSwapchainFormats(
- session, swapchain_formats.size(), &format_count, swapchain_formats.data()),
- "Failed to get swapchain image formats.");
- assert(swapchain_formats.size() == format_count);
-
- if (!gpu_binding->chooseSwapchainFormat(swapchain_formats, &chosen_format)) {
- throw GHOST_XrException(
- "Error: No format matching OpenXR runtime supported swapchain formats found.");
- }
-
- create_info.usageFlags = XR_SWAPCHAIN_USAGE_SAMPLED_BIT |
- XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT;
- create_info.format = chosen_format;
- create_info.sampleCount = xr_view->recommendedSwapchainSampleCount;
- create_info.width = xr_view->recommendedImageRectWidth;
- create_info.height = xr_view->recommendedImageRectHeight;
- create_info.faceCount = 1;
- create_info.arraySize = 1;
- create_info.mipCount = 1;
- CHECK_XR(swapchain.construct(xrCreateSwapchain, session, &create_info),
- "Failed to create OpenXR swapchain.");
-
- return swapchain;
-}
-
void GHOST_XrSession::prepareDrawing()
{
std::vector<XrViewConfigurationView> view_configs;
@@ -311,17 +256,9 @@ void GHOST_XrSession::prepareDrawing()
view_configs.data()),
"Failed to get count of view configurations.");
- for (const XrViewConfigurationView &view : view_configs) {
- unique_oxr_ptr<XrSwapchain> swapchain = swapchain_create(
- m_oxr->session, m_gpu_binding.get(), &view);
- auto images = swapchain_images_create(swapchain.get(), m_gpu_binding.get());
-
- m_oxr->swapchain_image_width = view.recommendedImageRectWidth;
- m_oxr->swapchain_image_height = view.recommendedImageRectHeight;
- m_oxr->swapchains.push_back(swapchain.get());
- m_oxr->swapchain_images.insert(std::make_pair(swapchain.get(), std::move(images)));
-
- swapchain.release();
+ for (const XrViewConfigurationView &view_config : view_configs) {
+ m_oxr->swapchains.push_back(std::unique_ptr<GHOST_XrSwapchain>(
+ new GHOST_XrSwapchain(*m_gpu_binding, m_oxr->session, view_config)));
}
m_oxr->views.resize(view_count, {XR_TYPE_VIEW});
@@ -432,50 +369,35 @@ static bool ghost_xr_draw_view_expects_srgb_buffer(const GHOST_XrContext *contex
(context->getOpenXRRuntimeID() == OPENXR_RUNTIME_MONADO);
}
-void GHOST_XrSession::drawView(XrSwapchain swapchain,
- XrCompositionLayerProjectionView &proj_layer_view,
+void GHOST_XrSession::drawView(GHOST_XrSwapchain &swapchain,
+ XrCompositionLayerProjectionView &r_proj_layer_view,
XrView &view,
void *draw_customdata)
{
- XrSwapchainImageAcquireInfo acquire_info = {XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO};
- XrSwapchainImageWaitInfo wait_info = {XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO};
- XrSwapchainImageReleaseInfo release_info = {XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO};
- XrSwapchainImageBaseHeader *swapchain_image;
+ XrSwapchainImageBaseHeader *swapchain_image = swapchain.acquireDrawableSwapchainImage();
GHOST_XrDrawViewInfo draw_view_info = {};
- uint32_t swapchain_idx;
-
- CHECK_XR(xrAcquireSwapchainImage(swapchain, &acquire_info, &swapchain_idx),
- "Failed to acquire swapchain image for the VR session.");
- wait_info.timeout = XR_INFINITE_DURATION;
- CHECK_XR(xrWaitSwapchainImage(swapchain, &wait_info),
- "Failed to acquire swapchain image for the VR session.");
-
- proj_layer_view.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW;
- proj_layer_view.pose = view.pose;
- proj_layer_view.fov = view.fov;
- proj_layer_view.subImage.swapchain = swapchain;
- proj_layer_view.subImage.imageRect.offset = {0, 0};
- proj_layer_view.subImage.imageRect.extent = {m_oxr->swapchain_image_width,
- m_oxr->swapchain_image_height};
- swapchain_image = m_oxr->swapchain_images[swapchain][swapchain_idx];
+ r_proj_layer_view.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW;
+ r_proj_layer_view.pose = view.pose;
+ r_proj_layer_view.fov = view.fov;
+ swapchain.updateCompositionLayerProjectViewSubImage(r_proj_layer_view.subImage);
draw_view_info.expects_srgb_buffer = ghost_xr_draw_view_expects_srgb_buffer(m_context);
- draw_view_info.ofsx = proj_layer_view.subImage.imageRect.offset.x;
- draw_view_info.ofsy = proj_layer_view.subImage.imageRect.offset.y;
- draw_view_info.width = proj_layer_view.subImage.imageRect.extent.width;
- draw_view_info.height = proj_layer_view.subImage.imageRect.extent.height;
+ draw_view_info.ofsx = r_proj_layer_view.subImage.imageRect.offset.x;
+ draw_view_info.ofsy = r_proj_layer_view.subImage.imageRect.offset.y;
+ draw_view_info.width = r_proj_layer_view.subImage.ima
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list