Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Kim <pk15950@gmail.com>2022-02-11 14:44:26 +0300
committerPeter Kim <pk15950@gmail.com>2022-02-11 14:46:55 +0300
commit675f38aca7073234a2ce0b36597d95f8a153ef7c (patch)
treec6fb86abe6e78c57b23edfe7122f69848aea48e9 /source/blender/gpu/intern/gpu_viewport.c
parent2cad80cbc4775447152a631bbfcabbf8d642e833 (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/gpu/intern/gpu_viewport.c')
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index 7a20278e5aa..2ed7994aee6 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -199,7 +199,9 @@ void GPU_viewport_bind(GPUViewport *viewport, int view, const rcti *rect)
viewport->active_view = view;
}
-void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen *ofs)
+void GPU_viewport_bind_from_offscreen(GPUViewport *viewport,
+ struct GPUOffScreen *ofs,
+ bool is_xr_surface)
{
GPUTexture *color, *depth;
GPUFrameBuffer *fb;
@@ -208,7 +210,13 @@ void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen
GPU_offscreen_viewport_data_get(ofs, &fb, &color, &depth);
- gpu_viewport_textures_free(viewport);
+ /* XR surfaces will already check for texture size changes and free if necessary (see
+ * #wm_xr_session_surface_offscreen_ensure()), so don't free here as it has a significant
+ * performance impact (leads to texture re-creation in #gpu_viewport_textures_create() every VR
+ * drawing iteration).*/
+ if (!is_xr_surface) {
+ gpu_viewport_textures_free(viewport);
+ }
/* This is the only texture we can share. */
viewport->depth_tx = depth;