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
path: root/source
diff options
context:
space:
mode:
authorPeter Kim <pk15950@gmail.com>2022-02-11 14:51:27 +0300
committerPeter Kim <pk15950@gmail.com>2022-02-11 14:51:27 +0300
commit2d231f837a48933c0e819cdc6e78d977152bdd69 (patch)
tree9d0b9c0bd9fe2d2724af866ace830d74d13090cf /source
parentfd98241cb80c63ed0b3515cb4976ad786d7540c8 (diff)
parent675f38aca7073234a2ce0b36597d95f8a153ef7c (diff)
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/intern/draw_manager.c4
-rw-r--r--source/blender/gpu/GPU_viewport.h4
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c12
3 files changed, 16 insertions, 4 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index b4b92acbb56..440f74af64b 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1750,6 +1750,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) {
@@ -1759,7 +1761,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();
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index daf817adbe8..be989635f84 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -63,7 +63,9 @@ void GPU_viewport_colorspace_set(GPUViewport *viewport,
/**
* Should be called from DRW after DRW_opengl_context_enable.
*/
-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);
/**
* Clear vars assigned from offscreen, so we don't free data owned by `GPUOffScreen`.
*/
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index d910153e912..fd4a87bc544 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -183,7 +183,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;
@@ -192,7 +194,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;