Fix T89204: slow repeated rendering with GPUOffscreen.draw_view3d.
Reviewed By: fclem Differential Revision: D13235
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user