diff options
Diffstat (limited to 'source/blender/python')
-rw-r--r-- | source/blender/python/gpu/gpu_py_offscreen.c | 21 | ||||
-rw-r--r-- | source/blender/python/gpu/gpu_py_offscreen.h | 4 |
2 files changed, 24 insertions, 1 deletions
diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 6f23c2213e2..24192780a86 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -44,6 +44,7 @@ #include "GPU_context.h" #include "GPU_framebuffer.h" #include "GPU_texture.h" +#include "GPU_viewport.h" #include "ED_view3d.h" #include "ED_view3d_offscreen.h" @@ -355,6 +356,15 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar GPU_offscreen_bind(self->ofs, true); + /* Cache the GPUViewport so the framebuffers and associated textures are + * not reallocated each time, see: T89204 */ + if (!self->viewport) { + self->viewport = GPU_viewport_create(); + } + else { + GPU_viewport_tag_update(self->viewport); + } + ED_view3d_draw_offscreen(depsgraph, scene, v3d->shading.type, @@ -370,7 +380,7 @@ static PyObject *pygpu_offscreen_draw_view3d(BPyGPUOffScreen *self, PyObject *ar do_color_management, true, self->ofs, - NULL); + self->viewport); GPU_offscreen_unbind(self->ofs, true); @@ -391,6 +401,11 @@ static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self) { BPY_GPU_OFFSCREEN_CHECK_OBJ(self); + if (self->viewport) { + GPU_viewport_free(self->viewport); + self->viewport = NULL; + } + GPU_offscreen_free(self->ofs); self->ofs = NULL; Py_RETURN_NONE; @@ -399,6 +414,9 @@ static PyObject *pygpu_offscreen_free(BPyGPUOffScreen *self) static void BPyGPUOffScreen__tp_dealloc(BPyGPUOffScreen *self) { + if (self->viewport) { + GPU_viewport_free(self->viewport); + } if (self->ofs) { GPU_offscreen_free(self->ofs); } @@ -469,6 +487,7 @@ PyObject *BPyGPUOffScreen_CreatePyObject(GPUOffScreen *ofs) self = PyObject_New(BPyGPUOffScreen, &BPyGPUOffScreen_Type); self->ofs = ofs; + self->viewport = NULL; return (PyObject *)self; } diff --git a/source/blender/python/gpu/gpu_py_offscreen.h b/source/blender/python/gpu/gpu_py_offscreen.h index 309735a6202..78bad595a3d 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.h +++ b/source/blender/python/gpu/gpu_py_offscreen.h @@ -26,9 +26,13 @@ extern PyTypeObject BPyGPUOffScreen_Type; #define BPyGPUOffScreen_Check(v) (Py_TYPE(v) == &BPyGPUOffScreen_Type) +struct GPUOffscreen; +struct GPUViewport; + typedef struct BPyGPUOffScreen { PyObject_HEAD struct GPUOffScreen *ofs; + struct GPUViewport *viewport; } BPyGPUOffScreen; PyObject *BPyGPUOffScreen_CreatePyObject(struct GPUOffScreen *ofs) ATTR_NONNULL(1); |