Image Editor: Fix slowdown with 8b colormanaged images.

Byte images are converted to float. Due to an issue how VSE cache is
freeing its images we cannot store these float buffers what leads
to recalculating it for each change in the image editor.

This fix will reduce the slowdown to areas that have the root cause of
the memory leak, so the buffers can be reused between refreshes.

NOTE: The root cause should still be fixed.

Thanks for reporting Sybren!
This commit is contained in:
Jeroen Bakker 2022-02-04 15:28:48 +01:00
parent 080dd18cdf
commit 2e766ff762
1 changed files with 5 additions and 7 deletions

View File

@ -231,7 +231,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
if (iterator.tile_data.tile_buffer == nullptr) {
continue;
}
const bool float_buffer_created = ensure_float_buffer(*iterator.tile_data.tile_buffer);
ensure_float_buffer(*iterator.tile_data.tile_buffer);
const float tile_width = static_cast<float>(iterator.tile_data.tile_buffer->x);
const float tile_height = static_cast<float>(iterator.tile_data.tile_buffer->y);
@ -338,10 +338,6 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
0);
imb_freerectImbuf_all(&extracted_buffer);
}
/* TODO(jbakker): Find leak when rendering VSE and remove this call. */
if (float_buffer_created) {
imb_freerectfloatImBuf(iterator.tile_data.tile_buffer);
}
}
}
@ -419,6 +415,9 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
const int texture_width = texture_buffer.x;
const int texture_height = texture_buffer.y;
const bool float_buffer_created = ensure_float_buffer(tile_buffer);
/* TODO(jbakker): Find leak when rendering VSE and don't free here. */
const bool do_free_float_buffer = float_buffer_created &&
instance_data.image->type == IMA_TYPE_R_RESULT;
/* IMB_transform works in a non-consistent space. This should be documented or fixed!.
* Construct a variant of the info_uv_to_texture that adds the texel space
@ -456,8 +455,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
uv_to_texel,
crop_rect_ptr);
/* TODO(jbakker): Find leak when rendering VSE and remove this call. */
if (float_buffer_created) {
if (do_free_float_buffer) {
imb_freerectfloatImBuf(&tile_buffer);
}
}