From d1e6e83c15cf1274a7991d823a62f90cb1a2b004 Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Tue, 28 Dec 2021 18:01:20 +0300 Subject: [PATCH] wineopenxr: Convert projection view info chain in convert_XrCompositionLayer(). CW-Bug-Id: #19878 --- wineopenxr/openxr.c | 70 +++++++++++++++++++++++++++++++++---- wineopenxr/openxr_private.h | 9 ++++- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/wineopenxr/openxr.c b/wineopenxr/openxr.c index e1217ea3..86a5a741 100644 --- a/wineopenxr/openxr.c +++ b/wineopenxr/openxr.c @@ -998,6 +998,7 @@ XrResult WINAPI wine_xrDestroySession(XrSession session) } heap_free(wine_session->projection_views); + heap_free(wine_session->view_infos); heap_free(wine_session->composition_layers); heap_free(wine_session); @@ -2071,7 +2072,7 @@ XrResult WINAPI wine_xrEnumerateSwapchainImages(XrSwapchain swapchain, uint32_t static XrCompositionLayerBaseHeader *convert_XrCompositionLayer(wine_XrSession *wine_session, const XrCompositionLayerBaseHeader *in_layer, CompositionLayer *out_layer, - uint32_t *view_idx) + uint32_t *view_idx, uint32_t *view_info_idx) { uint32_t i; @@ -2103,25 +2104,82 @@ static XrCompositionLayerBaseHeader *convert_XrCompositionLayer(wine_XrSession * break; case XR_TYPE_COMPOSITION_LAYER_PROJECTION: + { + const XrCompositionLayerProjectionView *view; + unsigned int view_info_count; + out_layer->projection = *(const XrCompositionLayerProjection *)in_layer; + view_info_count = 0; + for (i = 0; i < out_layer->projection.viewCount; ++i) + { + view = &((XrCompositionLayerProjection *)in_layer)->views[i]; + while ((view = view->next)) + ++view_info_count; + } + if(out_layer->projection.viewCount + *view_idx > wine_session->projection_view_count){ wine_session->projection_view_count = out_layer->projection.viewCount + *view_idx; wine_session->projection_views = heap_realloc(wine_session->projection_views, sizeof(XrCompositionLayerProjectionView) * wine_session->projection_view_count); } + if(view_info_count + *view_info_idx > wine_session->view_info_count){ + wine_session->view_info_count += view_info_count; + wine_session->view_infos = heap_realloc(wine_session->view_infos, + sizeof(*wine_session->view_infos) * wine_session->view_info_count); + } + out_layer->projection.views = &wine_session->projection_views[*view_idx]; memcpy((void*)out_layer->projection.views, ((const XrCompositionLayerProjection *)in_layer)->views, sizeof(XrCompositionLayerProjectionView) * out_layer->projection.viewCount); + view_info_count = 0; for(i = 0; i < out_layer->projection.viewCount; ++i){ - ((XrCompositionLayerProjectionView *)&out_layer->projection.views[i])->subImage.swapchain = - ((wine_XrSwapchain *)out_layer->projection.views[i].subImage.swapchain)->swapchain; + view = &out_layer->projection.views[i]; + if (view->type != XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW) + WINE_WARN("Unexpected view type %u.\n", view->type); + + ((XrCompositionLayerProjectionView *)view)->subImage.swapchain = ((wine_XrSwapchain *)view->subImage.swapchain)->swapchain; + while (view->next) + { + switch (((XrCompositionLayerProjectionView *)view->next)->type) + { + case XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR: + { + XrCompositionLayerDepthInfoKHR *out_depth_info, *in_depth_info; + + in_depth_info = (XrCompositionLayerDepthInfoKHR *)view->next; + out_depth_info = &wine_session->view_infos[*view_info_idx + view_info_count].depth_info; + *out_depth_info = *in_depth_info; + out_depth_info->subImage.swapchain = ((wine_XrSwapchain *)out_depth_info->subImage.swapchain)->swapchain; + ((XrCompositionLayerProjectionView *)view)->next = out_depth_info; + break; + } + case XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB: + { + XrCompositionLayerSpaceWarpInfoFB *out_warp_info, *in_warp_info; + + in_warp_info = (XrCompositionLayerSpaceWarpInfoFB *)view->next; + out_warp_info = &wine_session->view_infos[*view_info_idx + view_info_count].space_warp_info; + *out_warp_info = *in_warp_info; + out_warp_info->motionVectorSubImage.swapchain = ((wine_XrSwapchain *)out_warp_info->motionVectorSubImage.swapchain)->swapchain; + out_warp_info->depthSubImage.swapchain = ((wine_XrSwapchain *)out_warp_info->depthSubImage.swapchain)->swapchain; + ((XrCompositionLayerProjectionView *)view)->next = out_warp_info; + break; + } + default: + WINE_WARN("Unknown view info type %u.\n", view->type); + break; + } + ++view_info_count; + view = view->next; + } } *view_idx += out_layer->projection.viewCount; + *view_info_idx += view_info_count; break; - + } case XR_TYPE_COMPOSITION_LAYER_QUAD: out_layer->quad = *(const XrCompositionLayerQuad *)in_layer; out_layer->quad.subImage.swapchain = ((wine_XrSwapchain *)out_layer->quad.subImage.swapchain)->swapchain; @@ -2138,9 +2196,9 @@ static XrCompositionLayerBaseHeader *convert_XrCompositionLayer(wine_XrSession * XrResult WINAPI wine_xrEndFrame(XrSession session, const XrFrameEndInfo *frameEndInfo) { wine_XrSession *wine_session = (wine_XrSession *)session; + uint32_t i, view_idx = 0, view_info_idx = 0; IDXGIVkInteropDevice2 *dxvk_device; XrFrameEndInfo our_frameEndInfo; - uint32_t i, view_idx = 0; XrResult res; WINE_TRACE("%p, %p\n", session, frameEndInfo); @@ -2157,7 +2215,7 @@ XrResult WINAPI wine_xrEndFrame(XrSession session, const XrFrameEndInfo *frameEn wine_session->composition_layer_ptrs[i] = convert_XrCompositionLayer(wine_session, frameEndInfo->layers[i], &wine_session->composition_layers[i], - &view_idx); + &view_idx, &view_info_idx); } our_frameEndInfo = *frameEndInfo; diff --git a/wineopenxr/openxr_private.h b/wineopenxr/openxr_private.h index 20bf7055..fb95749d 100644 --- a/wineopenxr/openxr_private.h +++ b/wineopenxr/openxr_private.h @@ -26,6 +26,12 @@ typedef struct wine_XrInstance { union CompositionLayer; typedef union CompositionLayer CompositionLayer; +typedef union +{ + XrCompositionLayerDepthInfoKHR depth_info; + XrCompositionLayerSpaceWarpInfoFB space_warp_info; +} view_info; + typedef struct wine_XrSession { XrSession session; struct wine_XrInstance *wine_instance; @@ -36,8 +42,9 @@ typedef struct wine_XrSession { CompositionLayer *composition_layers; XrCompositionLayerBaseHeader **composition_layer_ptrs; - uint32_t projection_view_count; + uint32_t projection_view_count, view_info_count; XrCompositionLayerProjectionView *projection_views; + view_info *view_infos; } wine_XrSession; typedef struct wine_XrHandTrackerEXT {