From 34465a7fb091664b07611353d99dcaa0862d4a4c Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 2 Apr 2020 17:40:29 +0200 Subject: VR: Refactor DirectX context management All DirectX management happens on Ghost level now, higher level code can just assume everything is OpenGL (except of the upside-down drawing that still needs to be done for DirectX). This is similar to how the metal-layer is hidden outside of Ghost. The Ghost-XR graphics binding for DirectX is responsible for managing the DirectX compatibility now. --- source/blender/windowmanager/WM_api.h | 4 -- source/blender/windowmanager/intern/wm_window.c | 21 --------- source/blender/windowmanager/intern/wm_xr.c | 58 +++++++------------------ 3 files changed, 15 insertions(+), 68 deletions(-) (limited to 'source/blender/windowmanager') diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index a29ee4131cb..8047e5e2112 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -156,10 +156,6 @@ void *WM_opengl_context_create(void); void WM_opengl_context_dispose(void *context); void WM_opengl_context_activate(void *context); void WM_opengl_context_release(void *context); -#ifdef WIN32 -void *WM_directx_context_create(void); -void WM_directx_context_dispose(void *context); -#endif struct wmWindow *WM_window_open(struct bContext *C, const struct rcti *rect); struct wmWindow *WM_window_open_temp(struct bContext *C, diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 505383d295f..c29fd24d4cd 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -2458,24 +2458,3 @@ void WM_ghost_show_message_box(const char *title, GHOST_ShowMessageBox(g_system, title, message, help_label, continue_label, link, dialog_options); } /** \} */ - -#ifdef WIN32 -/* -------------------------------------------------------------------- */ -/** \name Direct DirectX Context Management - * \{ */ - -void *WM_directx_context_create(void) -{ - BLI_assert(GPU_framebuffer_active_get() == NULL); - return GHOST_CreateDirectXContext(g_system); -} - -void WM_directx_context_dispose(void *context) -{ - BLI_assert(GPU_framebuffer_active_get() == NULL); - GHOST_DisposeDirectXContext(g_system, context); -} - -/** \} */ - -#endif diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c index 18c3b70ed01..5115607101c 100644 --- a/source/blender/windowmanager/intern/wm_xr.c +++ b/source/blender/windowmanager/intern/wm_xr.c @@ -68,9 +68,9 @@ struct wmXrRuntimeData *wm_xr_runtime_data_create(void); void wm_xr_runtime_data_free(struct wmXrRuntimeData **runtime); void wm_xr_draw_view(const GHOST_XrDrawViewInfo *, void *); -void *wm_xr_session_gpu_binding_context_create(GHOST_TXrGraphicsBinding); -void wm_xr_session_gpu_binding_context_destroy(GHOST_TXrGraphicsBinding, GHOST_ContextHandle); -wmSurface *wm_xr_session_surface_create(wmWindowManager *, unsigned int); +void *wm_xr_session_gpu_binding_context_create(); +void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle); +wmSurface *wm_xr_session_surface_create(void); void wm_xr_pose_to_viewmat(const GHOST_XrPose *pose, float r_viewmat[4][4]); /* -------------------------------------------------------------------- */ @@ -109,11 +109,8 @@ typedef struct wmXrDrawData { } wmXrDrawData; typedef struct { - GHOST_TXrGraphicsBinding gpu_binding_type; GPUOffScreen *offscreen; GPUViewport *viewport; - - GHOST_ContextHandle secondary_ghost_ctx; } wmXrSurfaceData; typedef struct { @@ -412,10 +409,9 @@ bool WM_xr_session_state_viewer_pose_matrix_info_get(const wmXrData *xr, * * \{ */ -void *wm_xr_session_gpu_binding_context_create(GHOST_TXrGraphicsBinding graphics_binding) +void *wm_xr_session_gpu_binding_context_create(void) { - wmSurface *surface = wm_xr_session_surface_create(G_MAIN->wm.first, graphics_binding); - wmXrSurfaceData *data = surface->customdata; + wmSurface *surface = wm_xr_session_surface_create(); wm_surface_add(surface); @@ -423,11 +419,10 @@ void *wm_xr_session_gpu_binding_context_create(GHOST_TXrGraphicsBinding graphics * and running. */ WM_main_add_notifier(NC_WM | ND_XR_DATA_CHANGED, NULL); - return data->secondary_ghost_ctx ? data->secondary_ghost_ctx : surface->ghost_ctx; + return surface->ghost_ctx; } -void wm_xr_session_gpu_binding_context_destroy(GHOST_TXrGraphicsBinding UNUSED(graphics_lib), - GHOST_ContextHandle UNUSED(context)) +void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle UNUSED(context)) { if (g_xr_surface) { /* Might have been freed already */ wm_surface_remove(g_xr_surface); @@ -532,13 +527,6 @@ static void wm_xr_session_free_data(wmSurface *surface) { wmXrSurfaceData *data = surface->customdata; - if (data->secondary_ghost_ctx) { -#ifdef WIN32 - if (data->gpu_binding_type == GHOST_kXrGraphicsD3D11) { - WM_directx_context_dispose(data->secondary_ghost_ctx); - } -#endif - } if (data->viewport) { GPU_viewport_free(data->viewport); } @@ -591,7 +579,7 @@ static bool wm_xr_session_surface_offscreen_ensure(const GHOST_XrDrawViewInfo *d return true; } -wmSurface *wm_xr_session_surface_create(wmWindowManager *UNUSED(wm), unsigned int gpu_binding_type) +wmSurface *wm_xr_session_surface_create(void) { if (g_xr_surface) { BLI_assert(false); @@ -601,30 +589,13 @@ wmSurface *wm_xr_session_surface_create(wmWindowManager *UNUSED(wm), unsigned in wmSurface *surface = MEM_callocN(sizeof(*surface), __func__); wmXrSurfaceData *data = MEM_callocN(sizeof(*data), "XrSurfaceData"); -#ifndef WIN32 - BLI_assert(gpu_binding_type == GHOST_kXrGraphicsOpenGL); -#endif - surface->draw = wm_xr_session_surface_draw; surface->free_data = wm_xr_session_free_data; - - data->gpu_binding_type = gpu_binding_type; - surface->customdata = data; - surface->ghost_ctx = DRW_xr_opengl_context_get(); - - switch (gpu_binding_type) { - case GHOST_kXrGraphicsOpenGL: - break; -#ifdef WIN32 - case GHOST_kXrGraphicsD3D11: - data->secondary_ghost_ctx = WM_directx_context_create(); - break; -#endif - } - surface->gpu_ctx = DRW_xr_gpu_context_get(); + surface->customdata = data; + g_xr_surface = surface; return surface; @@ -679,10 +650,11 @@ static void wm_xr_draw_matrices_create(const wmXrDrawData *draw_data, } static void wm_xr_draw_viewport_buffers_to_active_framebuffer( - const wmXrSurfaceData *surface_data, const GHOST_XrDrawViewInfo *draw_view) + const wmXrRuntimeData *runtime_data, + const wmXrSurfaceData *surface_data, + const GHOST_XrDrawViewInfo *draw_view) { - const bool is_upside_down = surface_data->secondary_ghost_ctx && - GHOST_isUpsideDownContext(surface_data->secondary_ghost_ctx); + const bool is_upside_down = GHOST_XrSessionNeedsUpsideDownDrawing(runtime_data->context); rcti rect = {.xmin = 0, .ymin = 0, .xmax = draw_view->width - 1, .ymax = draw_view->height - 1}; wmViewport(&rect); @@ -759,7 +731,7 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata) GPU_offscreen_bind(surface_data->offscreen, false); - wm_xr_draw_viewport_buffers_to_active_framebuffer(surface_data, draw_view); + wm_xr_draw_viewport_buffers_to_active_framebuffer(wm->xr.runtime, surface_data, draw_view); } /** \} */ /* XR Drawing */ -- cgit v1.2.3