Commit: b18f5a6a814263d1dd497926059fa4003263cdf0 Author: Julian Eisel Date: Wed Jun 19 17:23:41 2019 +0200 Branches: soc-2019-openxr https://developer.blender.org/rBb18f5a6a814263d1dd497926059fa4003263cdf0
Pass graphics context data to OpenXR graphics bindings on Linux too Refactors function into a class, and make this class a friend of GHOST_ContextGLX. That seems like a better way to access low level graphics data for this specific case, rather than giving anyone access via a getter. =================================================================== M intern/ghost/intern/GHOST_ContextGLX.h M intern/ghost/intern/GHOST_XR.cpp M intern/ghost/intern/GHOST_XRSession.cpp M intern/ghost/intern/GHOST_XR_intern.h M release/scripts/addons =================================================================== diff --git a/intern/ghost/intern/GHOST_ContextGLX.h b/intern/ghost/intern/GHOST_ContextGLX.h index ba8df7dac1b..69a7246a238 100644 --- a/intern/ghost/intern/GHOST_ContextGLX.h +++ b/intern/ghost/intern/GHOST_ContextGLX.h @@ -38,6 +38,9 @@ #endif class GHOST_ContextGLX : public GHOST_Context { + /* XR code needs low level graphics data to send to OpenXR. */ + friend class GHOST_XRGraphicsBinding; + public: /** * Constructor. diff --git a/intern/ghost/intern/GHOST_XR.cpp b/intern/ghost/intern/GHOST_XR.cpp index d5376892ee7..0561df3809d 100644 --- a/intern/ghost/intern/GHOST_XR.cpp +++ b/intern/ghost/intern/GHOST_XR.cpp @@ -168,9 +168,9 @@ static void openxr_extensions_to_enable_get(const GHOST_XRContext *context, const OpenXRData *oxr, std::vector<const char *> &r_ext_names) { - assert(context->gpu_binding != GHOST_kXRGraphicsUnknown); + assert(context->gpu_binding_type != GHOST_kXRGraphicsUnknown); - const char *gpu_binding = openxr_ext_name_from_wm_gpu_binding(context->gpu_binding); + const char *gpu_binding = openxr_ext_name_from_wm_gpu_binding(context->gpu_binding_type); const static std::vector<std::string> try_ext; /* None yet */ assert(gpu_binding); @@ -238,7 +238,7 @@ GHOST_XRContext *GHOST_XR_context_create(const GHOST_XRContextCreateInfo *create puts("Done printing OpenXR layers/extensions."); #endif - xr_context->gpu_binding = openxr_graphics_extension_to_enable_get(oxr, create_info); + xr_context->gpu_binding_type = openxr_graphics_extension_to_enable_get(oxr, create_info); assert(xr_context->oxr.instance == XR_NULL_HANDLE); openxr_instance_create(xr_context); @@ -287,13 +287,13 @@ void GHOST_XR_graphics_context_bind(GHOST_XRContext &xr_context) { assert(xr_context.gpu_ctx_bind_fn); xr_context.gpu_ctx = static_cast<GHOST_Context *>( - xr_context.gpu_ctx_bind_fn(xr_context.gpu_binding)); + xr_context.gpu_ctx_bind_fn(xr_context.gpu_binding_type)); } void GHOST_XR_graphics_context_unbind(GHOST_XRContext &xr_context) { if (xr_context.gpu_ctx_unbind_fn) { - xr_context.gpu_ctx_unbind_fn(xr_context.gpu_binding, xr_context.gpu_ctx); + xr_context.gpu_ctx_unbind_fn(xr_context.gpu_binding_type, xr_context.gpu_ctx); } xr_context.gpu_ctx = nullptr; } diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp index f66214ed1c1..d975bc1874f 100644 --- a/intern/ghost/intern/GHOST_XRSession.cpp +++ b/intern/ghost/intern/GHOST_XRSession.cpp @@ -67,51 +67,52 @@ static void GHOST_XR_system_init(OpenXRData *oxr) xrGetSystem(oxr->instance, &system_info, &oxr->system_id); } -static void *openxr_graphics_binding_create(const GHOST_XRContext *xr_context, - GHOST_Context *ghost_ctx) -{ - static union { +class GHOST_XRGraphicsBinding { + public: + union { #if defined(WITH_X11) XrGraphicsBindingOpenGLXlibKHR glx; #elif defined(WIN32) XrGraphicsBindingOpenGLWin32KHR wgl; XrGraphicsBindingD3D11KHR d3d11; #endif - } binding; - - memset(&binding, 0, sizeof(binding)); + } oxr_binding; - switch (xr_context->gpu_binding) { - case GHOST_kXRGraphicsOpenGL: { + void initFromGhostContext(GHOST_TGraphicsBinding type, GHOST_Context *ghost_ctx) + { + switch (type) { + case GHOST_kXRGraphicsOpenGL: { #if defined(WITH_X11) - binding.glx.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR; + GHOST_ContextGLX *ctx_glx = static_cast<GHOST_ContextGLX *>(ghost_ctx); + + oxr_binding.glx.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR; + oxr_binding.glx.xDisplay = ctx_glx->m_display; #elif defined(WIN32) - GHOST_ContextWGL *ctx_wgl = static_cast<GHOST_ContextWGL *>(ghost_ctx); - GHOST_ContextWGL::Info info = ctx_wgl->getInfo(); + 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; + oxr_binding.wgl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR; + oxr_binding.wgl.hDC = info.hDC; + oxr_binding.wgl.hGLRC = info.hGLRC; #endif - break; - } + break; + } #ifdef WIN32 - case GHOST_kXRGraphicsD3D11: { - GHOST_ContextD3D *ctx_d3d = static_cast<GHOST_ContextD3D *>(ghost_ctx); + 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(); + oxr_binding.d3d11.type = XR_TYPE_GRAPHICS_BINDING_D3D11_KHR; + oxr_binding.d3d11.device = ctx_d3d->getDevice(); - break; - } + break; + } #endif - default: - assert(false); + default: + assert(false); + } } - - return &binding; -} +}; void GHOST_XR_session_start(GHOST_XRContext *xr_context) { @@ -138,11 +139,13 @@ void GHOST_XR_session_start(GHOST_XRContext *xr_context) "GHOST_XR_session_start()).\n"); return; } + xr_context->gpu_binding = new GHOST_XRGraphicsBinding(); + xr_context->gpu_binding->initFromGhostContext(xr_context->gpu_binding_type, xr_context->gpu_ctx); 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, xr_context->gpu_ctx); + create_info.next = &xr_context->gpu_binding->oxr_binding; xrCreateSession(oxr->instance, &create_info, &oxr->session); } diff --git a/intern/ghost/intern/GHOST_XR_intern.h b/intern/ghost/intern/GHOST_XR_intern.h index fd5ed1e6e00..12162d59939 100644 --- a/intern/ghost/intern/GHOST_XR_intern.h +++ b/intern/ghost/intern/GHOST_XR_intern.h @@ -40,7 +40,8 @@ typedef struct GHOST_XRContext { OpenXRData oxr; /** Active graphics binding type. */ - GHOST_TGraphicsBinding gpu_binding; + GHOST_TGraphicsBinding gpu_binding_type; + class GHOST_XRGraphicsBinding *gpu_binding; /** Function to retrieve (possibly create) a graphics context */ GHOST_XRGraphicsContextBindFn gpu_ctx_bind_fn; /** Function to release (possibly free) a graphics context */ diff --git a/release/scripts/addons b/release/scripts/addons index a5a236df5f6..6cad544cb30 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit a5a236df5f6630ea17958e3006070ef609c6a4b8 +Subproject commit 6cad544cb30364ac14954a9c050d83c6fcbe50dd _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs