diff options
author | Peter Kim <pk15950@gmail.com> | 2022-02-11 14:44:26 +0300 |
---|---|---|
committer | Peter Kim <pk15950@gmail.com> | 2022-02-11 14:46:55 +0300 |
commit | 675f38aca7073234a2ce0b36597d95f8a153ef7c (patch) | |
tree | c6fb86abe6e78c57b23edfe7122f69848aea48e9 /source/blender/draw/intern/draw_manager.c | |
parent | 2cad80cbc4775447152a631bbfcabbf8d642e833 (diff) |
Fix excessive re-creation of VR viewport textures
Due to the freeing and re-creation of textures performed when binding
offscreen viewports, VR viewport textures would be needlessly
re-created every drawing iteration, leading to a negative impact on VR
frame rate.
This was brought to light by 6738ecb64e8b, which introduced an
additional texture clear operation on initialization and was
prohibitively costly on some systems when performed every frame.
Now, the textures for VR viewports will not be always re-created
during offscreen binding, but only when necessary using a pre-drawing
step (`wm_xr_session_surface_offscreen_ensure()`).
Reviewed By: jbakker, fclem
Differential Revision: https://developer.blender.org/D14059
Diffstat (limited to 'source/blender/draw/intern/draw_manager.c')
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 1249004eda0..864987234b0 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -1765,6 +1765,8 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph, GPUOffScreen *ofs, GPUViewport *viewport) { + const bool is_xr_surface = ((v3d->flag & V3D_XR_SESSION_SURFACE) != 0); + /* Create temporary viewport if needed or update the existing viewport. */ GPUViewport *render_viewport = viewport; if (viewport == NULL) { @@ -1774,7 +1776,7 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph, drw_notify_view_update_offscreen(depsgraph, engine_type, region, v3d, render_viewport); } - GPU_viewport_bind_from_offscreen(render_viewport, ofs); + GPU_viewport_bind_from_offscreen(render_viewport, ofs, is_xr_surface); /* Just here to avoid an assert but shouldn't be required in practice. */ GPU_framebuffer_restore(); |