Commit: 9d29373b06e8312bdcbc93232a1d18e6d90d65a1 Author: Julian Eisel Date: Wed Jun 19 12:18:35 2019 +0200 Branches: soc-2019-openxr https://developer.blender.org/rB9d29373b06e8312bdcbc93232a1d18e6d90d65a1
Init OpenXR graphics bindings with valid graphics context (Win only) Will do this for Linux in a separate commit. Also fixes a stupid mistake from previous commit on lazy-creation of XR context. =================================================================== M intern/ghost/intern/GHOST_ContextD3D.cpp M intern/ghost/intern/GHOST_ContextD3D.h M intern/ghost/intern/GHOST_ContextWGL.cpp M intern/ghost/intern/GHOST_ContextWGL.h M intern/ghost/intern/GHOST_XRSession.cpp M release/scripts/addons M source/blender/windowmanager/intern/wm_operators.c =================================================================== diff --git a/intern/ghost/intern/GHOST_ContextD3D.cpp b/intern/ghost/intern/GHOST_ContextD3D.cpp index 2f3e28a28b2..2c4a5860ed9 100644 --- a/intern/ghost/intern/GHOST_ContextD3D.cpp +++ b/intern/ghost/intern/GHOST_ContextD3D.cpp @@ -383,3 +383,8 @@ static void drawTestTriangle(ID3D11Device *m_device, m_device_ctx->Draw(std::size(vertices), 0); } #endif + +ID3D11Device *GHOST_ContextD3D::getDevice() +{ + return m_device.Get(); +} diff --git a/intern/ghost/intern/GHOST_ContextD3D.h b/intern/ghost/intern/GHOST_ContextD3D.h index 9f067fa23ce..2a28d03c9b5 100644 --- a/intern/ghost/intern/GHOST_ContextD3D.h +++ b/intern/ghost/intern/GHOST_ContextD3D.h @@ -113,6 +113,8 @@ class GHOST_ContextD3D : public GHOST_Context { return true; } + ID3D11Device *getDevice(); + private: friend class SharedOpenGLContext; diff --git a/intern/ghost/intern/GHOST_ContextWGL.cpp b/intern/ghost/intern/GHOST_ContextWGL.cpp index a3d5d6f7edf..62e17359d71 100644 --- a/intern/ghost/intern/GHOST_ContextWGL.cpp +++ b/intern/ghost/intern/GHOST_ContextWGL.cpp @@ -730,3 +730,8 @@ GHOST_TSuccess GHOST_ContextWGL::releaseNativeHandles() return success; } + +GHOST_ContextWGL::Info GHOST_ContextWGL::getInfo() +{ + return Info{m_hDC, m_hGLRC}; +} diff --git a/intern/ghost/intern/GHOST_ContextWGL.h b/intern/ghost/intern/GHOST_ContextWGL.h index af7619e3806..ed230591912 100644 --- a/intern/ghost/intern/GHOST_ContextWGL.h +++ b/intern/ghost/intern/GHOST_ContextWGL.h @@ -101,6 +101,15 @@ class GHOST_ContextWGL : public GHOST_Context { GHOST_TSuccess setDefaultFramebufferSize(GHOST_TUns32 width, GHOST_TUns32 height); + /** + * Helper to get low level system specific info out of the context. + */ + struct Info { + HDC hDC; + HGLRC hGLRC; + }; + Info getInfo(); + private: int choose_pixel_format(bool stereoVisual, bool needAlpha); int choose_pixel_format_arb(bool stereoVisual, bool needAlpha); diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp index bf36732aa89..f66214ed1c1 100644 --- a/intern/ghost/intern/GHOST_XRSession.cpp +++ b/intern/ghost/intern/GHOST_XRSession.cpp @@ -23,6 +23,12 @@ #include <cstring> #include "GHOST_C-api.h" +#if defined(WITH_X11) +# include "GHOST_ContextGLX.h" +#elif defined(WIN32) +# include "GHOST_ContextWGL.h" +# include "GHOST_ContextD3D.h" +#endif #include "GHOST_XR_intern.h" @@ -62,7 +68,7 @@ static void GHOST_XR_system_init(OpenXRData *oxr) } static void *openxr_graphics_binding_create(const GHOST_XRContext *xr_context, - GHOST_ContextHandle /*ghost_context*/) + GHOST_Context *ghost_ctx) { static union { #if defined(WITH_X11) @@ -80,14 +86,22 @@ static void *openxr_graphics_binding_create(const GHOST_XRContext *xr_context, #if defined(WITH_X11) binding.glx.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR; #elif defined(WIN32) + GHOST_ContextWGL *ctx_wgl = static_cast<GHOST_ContextWGL *>(ghost_ctx); + GHOST_ContextWGL::Info info = ctx_wgl->getInfo(); + binding.wgl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR; + binding.wgl.hDC = info.hDC; + binding.wgl.hGLRC = info.hGLRC; #endif break; } #ifdef WIN32 case GHOST_kXRGraphicsD3D11: { + GHOST_ContextD3D *ctx_d3d = static_cast<GHOST_ContextD3D *>(ghost_ctx); + binding.d3d11.type = XR_TYPE_GRAPHICS_BINDING_D3D11_KHR; + binding.d3d11.device = ctx_d3d->getDevice(); break; } @@ -128,8 +142,7 @@ void GHOST_XR_session_start(GHOST_XRContext *xr_context) XrSessionCreateInfo create_info{}; create_info.type = XR_TYPE_SESSION_CREATE_INFO; create_info.systemId = oxr->system_id; - create_info.next = openxr_graphics_binding_create(xr_context, - (GHOST_ContextHandle)xr_context->gpu_ctx); + create_info.next = openxr_graphics_binding_create(xr_context, xr_context->gpu_ctx); xrCreateSession(oxr->instance, &create_info, &oxr->session); } diff --git a/release/scripts/addons b/release/scripts/addons index 6cad544cb30..a5a236df5f6 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit 6cad544cb30364ac14954a9c050d83c6fcbe50dd +Subproject commit a5a236df5f6630ea17958e3006070ef609c6a4b8 diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 73f371a392d..7debf2ce5c6 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -3665,24 +3665,23 @@ static bool wm_xr_ensure_context(wmWindowManager *wm) static int wm_xr_session_toggle_exec(bContext *C, wmOperator *UNUSED(op)) { wmWindowManager *wm = CTX_wm_manager(C); - struct GHOST_XRContext *xr_context = wm->xr_context; /* Lazy-create xr context - tries to dynlink to the runtime, reading active_runtime.json. */ if (wm_xr_ensure_context(wm) == false) { return OPERATOR_CANCELLED; } - - if (GHOST_XR_session_is_running(xr_context)) { - GHOST_XR_session_end(xr_context); + if (GHOST_XR_session_is_running(wm->xr_context)) { + GHOST_XR_session_end(wm->xr_context); } else { # if defined(WIN32) xr_session_window_create(C); # endif - GHOST_XR_graphics_context_bind_funcs( - xr_context, xr_session_gpu_binding_context_create, xr_session_gpu_binding_context_destroy); - GHOST_XR_session_start(xr_context); + GHOST_XR_graphics_context_bind_funcs(wm->xr_context, + xr_session_gpu_binding_context_create, + xr_session_gpu_binding_context_destroy); + GHOST_XR_session_start(wm->xr_context); } return OPERATOR_FINISHED; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs