Dead-lock when VR viewport drawing and depsgraph updates would fight for the draw-manager GL lock. This didn't usually cause issues because the depsgraph would be evaluated at this point already, except in rare exceptions like after file writing. Fix this by ensuring the XR surface gets its depsgraph updated after handling notifiers, which is where regular windows also do the depsgraph updating.
73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup wm
|
|
*
|
|
* \name WM-Surface
|
|
*
|
|
* Container to manage painting in an off-screen context.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
struct bContext;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct wmSurface {
|
|
struct wmSurface *next, *prev;
|
|
|
|
GHOST_ContextHandle ghost_ctx;
|
|
struct GPUContext *gpu_ctx;
|
|
|
|
void *customdata;
|
|
|
|
void (*draw)(struct bContext *);
|
|
/* To evaluate the surface's depsgraph. Called as part of the main loop. */
|
|
void (*do_depsgraph)(struct bContext *C);
|
|
/** Free customdata, not the surface itself (done by wm_surface API) */
|
|
void (*free_data)(struct wmSurface *);
|
|
|
|
/** Called when surface is activated for drawing (made drawable). */
|
|
void (*activate)(void);
|
|
/** Called when surface is deactivated for drawing (current drawable cleared). */
|
|
void (*deactivate)(void);
|
|
} wmSurface;
|
|
|
|
/* Create/Free */
|
|
void wm_surface_add(wmSurface *surface);
|
|
void wm_surface_remove(wmSurface *surface);
|
|
void wm_surfaces_free(void);
|
|
|
|
/* Utils */
|
|
void wm_surfaces_iter(struct bContext *C, void (*cb)(struct bContext *, wmSurface *));
|
|
|
|
/* Evaluation. */
|
|
void wm_surfaces_do_depsgraph(struct bContext *C);
|
|
|
|
/* Drawing */
|
|
void wm_surface_make_drawable(wmSurface *surface);
|
|
void wm_surface_clear_drawable(void);
|
|
void wm_surface_set_drawable(wmSurface *surface, bool activate);
|
|
void wm_surface_reset_drawable(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|