[Bf-blender-cvs] [867007d9d7d] soc-2019-openxr: Set up OpenXR compositing layers for drawing
Julian Eisel
noreply at git.blender.org
Mon Jun 24 16:47:20 CEST 2019
Commit: 867007d9d7d01bcc77bedbdee5d3f04c22e4b339
Author: Julian Eisel
Date: Mon Jun 24 16:44:43 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB867007d9d7d01bcc77bedbdee5d3f04c22e4b339
Set up OpenXR compositing layers for drawing
That should be one of the last steps to prepare pushing pixels to HMDs.
Fingers crossed!
===================================================================
M intern/ghost/GHOST_C-api.h
M intern/ghost/intern/GHOST_XRSession.cpp
M intern/ghost/intern/GHOST_XR_intern.h
M release/scripts/addons
M release/scripts/addons_contrib
M source/blender/windowmanager/intern/wm_xr.c
M source/tools
===================================================================
diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index 0912fdf8168..40a711b207d 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -1015,8 +1015,6 @@ GHOST_TSuccess GHOST_XrSessionIsRunning(const struct GHOST_XrContext *xr_context
void GHOST_XrSessionStart(struct GHOST_XrContext *xr_context);
void GHOST_XrSessionEnd(struct GHOST_XrContext *xr_context);
void GHOST_XrSessionRenderingPrepare(struct GHOST_XrContext *xr_context);
-void GHOST_XrSessionBeginDrawing(struct GHOST_XrContext *xr_context);
-void GHOST_XrSessionEndDrawing(struct GHOST_XrContext *xr_context);
void GHOST_XrSessionDrawViews(struct GHOST_XrContext *xr_context);
/* events */
diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp
index 1ae4e4b7533..11bd65b20fe 100644
--- a/intern/ghost/intern/GHOST_XRSession.cpp
+++ b/intern/ghost/intern/GHOST_XRSession.cpp
@@ -177,6 +177,7 @@ void GHOST_XrSessionRenderingPrepare(GHOST_XrContext *xr_context)
xrEnumerateViewConfigurationViews(
oxr->instance, oxr->system_id, oxr->view_type, 0, &view_count, nullptr);
+ view_configs.resize(view_count, {XR_TYPE_VIEW_CONFIGURATION_VIEW});
xrEnumerateViewConfigurationViews(oxr->instance,
oxr->system_id,
oxr->view_type,
@@ -188,13 +189,16 @@ void GHOST_XrSessionRenderingPrepare(GHOST_XrContext *xr_context)
XrSwapchain swapchain = swapchain_create(oxr->session, xr_context->gpu_binding.get(), &view);
auto images = swapchain_images_create(swapchain, xr_context->gpu_binding.get());
+ oxr->swapchain_image_width = view.recommendedImageRectWidth;
+ oxr->swapchain_image_height = view.recommendedImageRectHeight;
+ oxr->swapchains.push_back(swapchain);
oxr->swapchain_images.insert(std::make_pair(swapchain, std::move(images)));
}
oxr->views.resize(view_count, {XR_TYPE_VIEW});
}
-void GHOST_XrSessionBeginDrawing(GHOST_XrContext *xr_context)
+static void drawing_begin(GHOST_XrContext *xr_context)
{
OpenXRData *oxr = &xr_context->oxr;
XrFrameWaitInfo wait_info{XR_TYPE_FRAME_WAIT_INFO};
@@ -210,22 +214,88 @@ void GHOST_XrSessionBeginDrawing(GHOST_XrContext *xr_context)
xr_context->draw_frame->frame_state = frame_state;
}
-void GHOST_XrSessionEndDrawing(GHOST_XrContext *xr_context)
+void drawing_end(GHOST_XrContext *xr_context, std::vector<XrCompositionLayerBaseHeader *> *layers)
{
XrFrameEndInfo end_info{XR_TYPE_FRAME_END_INFO};
+ end_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
+ end_info.environmentBlendMode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE;
+ end_info.layerCount = layers->size();
+ end_info.layers = layers->data();
+
xrEndFrame(xr_context->oxr.session, &end_info);
xr_context->draw_frame = nullptr;
}
-void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
+static void draw_view(OpenXRData *oxr,
+ XrSwapchain swapchain,
+ XrCompositionLayerProjectionView &proj_layer_view,
+ XrView &view)
+{
+ 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;
+ uint32_t swapchain_idx;
+
+ xrAcquireSwapchainImage(swapchain, &acquire_info, &swapchain_idx);
+ wait_info.timeout = XR_INFINITE_DURATION;
+ xrWaitSwapchainImage(swapchain, &wait_info);
+
+ 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 = {oxr->swapchain_image_width,
+ oxr->swapchain_image_height};
+
+ swapchain_image = oxr->swapchain_images[swapchain][swapchain_idx];
+
+ // xr_context->draw_view_fn();
+
+ xrReleaseSwapchainImage(swapchain, &release_info);
+}
+
+static XrCompositionLayerProjection draw_layer(GHOST_XrContext *xr_context,
+ OpenXRData *oxr,
+ XrSpace space)
{
- OpenXRData *oxr = &xr_context->oxr;
XrViewLocateInfo viewloc_info{XR_TYPE_VIEW_LOCATE_INFO};
XrViewState view_state{XR_TYPE_VIEW_STATE};
+ XrCompositionLayerProjection layer{XR_TYPE_COMPOSITION_LAYER_PROJECTION};
+ std::vector<XrCompositionLayerProjectionView> proj_layer_views;
+ uint32_t view_count;
+
+ viewloc_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
+ viewloc_info.space = space;
+
+ xrLocateViews(
+ oxr->session, &viewloc_info, &view_state, oxr->views.size(), &view_count, oxr->views.data());
+ assert(oxr->swapchains.size() == view_count);
+
+ proj_layer_views.resize(view_count);
+
+ for (uint32_t view_idx = 0; view_idx < view_count; view_idx++) {
+ draw_view(oxr, oxr->swapchains[view_idx], proj_layer_views[view_idx], oxr->views[view_idx]);
+ }
+
+ layer.space = space;
+ layer.viewCount = proj_layer_views.size();
+ layer.views = proj_layer_views.data();
+
+ return layer;
+}
+
+void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
+{
+ OpenXRData *oxr = &xr_context->oxr;
XrReferenceSpaceCreateInfo refspace_info{XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
+ XrCompositionLayerProjection proj_layer;
+ std::vector<XrCompositionLayerBaseHeader *> layers;
XrSpace space;
- uint32_t view_count;
+
+ drawing_begin(xr_context);
refspace_info.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_LOCAL;
// TODO Use viewport pose here.
@@ -233,9 +303,8 @@ void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
refspace_info.poseInReferenceSpace.orientation = {0.0f, 0.0f, 0.0f, 1.0f};
xrCreateReferenceSpace(oxr->session, &refspace_info, &space);
- viewloc_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
- viewloc_info.space = space;
+ proj_layer = draw_layer(xr_context, oxr, space);
+ layers.push_back(reinterpret_cast<XrCompositionLayerBaseHeader *>(&proj_layer));
- xrLocateViews(
- oxr->session, &viewloc_info, &view_state, oxr->views.size(), &view_count, oxr->views.data());
+ drawing_end(xr_context, &layers);
}
diff --git a/intern/ghost/intern/GHOST_XR_intern.h b/intern/ghost/intern/GHOST_XR_intern.h
index 5daeb79cab9..83205ec28dd 100644
--- a/intern/ghost/intern/GHOST_XR_intern.h
+++ b/intern/ghost/intern/GHOST_XR_intern.h
@@ -41,7 +41,9 @@ typedef struct OpenXRData {
XrSession session;
XrSessionState session_state;
+ std::vector<XrSwapchain> swapchains;
std::map<XrSwapchain, std::vector<XrSwapchainImageBaseHeader *>> swapchain_images;
+ int32_t swapchain_image_width, swapchain_image_height;
} OpenXRData;
typedef struct GHOST_XrContext {
diff --git a/release/scripts/addons b/release/scripts/addons
index a5a236df5f6..0e53a9a3867 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit a5a236df5f6630ea17958e3006070ef609c6a4b8
+Subproject commit 0e53a9a38672790d5fbb9a1d4a935980824d4a84
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 5781362d811..e83541d42c7 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 5781362d811bb4a99bee4e38a9d3a69813a8dd04
+Subproject commit e83541d42c71bfb689acf9a53a6eb66b0c190451
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index c53e021d5f6..73f925aa7db 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -25,8 +25,6 @@ void wm_xr_session_draw(struct GHOST_XrContext *xr_context)
if (!GHOST_XrSessionIsRunning(xr_context)) {
return;
}
- GHOST_XrSessionBeginDrawing(xr_context);
// TODO session visible?
GHOST_XrSessionDrawViews(xr_context);
- GHOST_XrSessionEndDrawing(xr_context);
}
diff --git a/source/tools b/source/tools
index 33d3969202b..eb406b701d5 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 33d3969202b855305a9823a9bc67a1d56e4546c2
+Subproject commit eb406b701d5a251818e425fec489417477019d61
More information about the Bf-blender-cvs
mailing list