Merge branch 'blender-v3.2-release'

This commit is contained in:
Sergey Sharybin 2022-05-06 16:44:18 +02:00
commit 92d0ed3000
3 changed files with 13 additions and 12 deletions

View File

@ -75,8 +75,10 @@ struct IMAGE_InstanceData {
TextureInfo &info = texture_infos[i];
const bool is_allocated = info.texture != nullptr;
const bool is_visible = info.visible;
const bool should_be_freed = !is_visible && is_allocated;
const bool should_be_created = is_visible && !is_allocated;
const bool resolution_changed = assign_if_different(info.last_viewport_size,
float2(DRW_viewport_size_get()));
const bool should_be_freed = is_allocated && (!is_visible || resolution_changed);
const bool should_be_created = is_visible && (!is_allocated || resolution_changed);
if (should_be_freed) {
GPU_texture_free(info.texture);

View File

@ -46,6 +46,8 @@ struct TextureInfo {
*/
GPUTexture *texture;
float2 last_viewport_size = float2(0.0f, 0.0f);
~TextureInfo()
{
if (batch != nullptr) {

View File

@ -88,7 +88,7 @@ void DRW_view_data_default_lists_from_viewport(DRWViewData *view_data, GPUViewpo
});
}
static void draw_viewport_engines_data_clear(ViewportEngineData *data)
static void draw_viewport_engines_data_clear(ViewportEngineData *data, bool clear_instance_data)
{
DrawEngineType *engine_type = data->engine_type->draw_engine;
const DrawEngineDataSize *data_size = engine_type->vedata_size;
@ -103,7 +103,7 @@ static void draw_viewport_engines_data_clear(ViewportEngineData *data)
MEM_SAFE_FREE(data->stl->storage[i]);
}
if (data->instance_data) {
if (clear_instance_data && data->instance_data) {
BLI_assert(engine_type->instance_free != nullptr);
engine_type->instance_free(data->instance_data);
data->instance_data = nullptr;
@ -120,7 +120,7 @@ static void draw_viewport_engines_data_clear(ViewportEngineData *data)
}
}
static void draw_view_data_clear(DRWViewData *view_data)
static void draw_view_data_clear(DRWViewData *view_data, bool free_instance_data)
{
GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.default_fb);
GPU_FRAMEBUFFER_FREE_SAFE(view_data->dfbl.overlay_fb);
@ -137,23 +137,20 @@ static void draw_view_data_clear(DRWViewData *view_data)
GPU_TEXTURE_FREE_SAFE(view_data->dtxl.depth_in_front);
for (ViewportEngineData &engine : view_data->engines) {
draw_viewport_engines_data_clear(&engine);
draw_viewport_engines_data_clear(&engine, free_instance_data);
}
view_data->texture_list_size[0] = view_data->texture_list_size[1] = 0;
view_data->cache_time = 0.0f;
}
void DRW_view_data_free(DRWViewData *view_data)
{
draw_view_data_clear(view_data);
draw_view_data_clear(view_data, true);
delete view_data;
}
void DRW_view_data_texture_list_size_validate(DRWViewData *view_data, const int size[2])
{
if (!equals_v2v2_int(view_data->texture_list_size, size)) {
draw_view_data_clear(view_data);
draw_view_data_clear(view_data, false);
copy_v2_v2_int(view_data->texture_list_size, size);
}
}
@ -195,7 +192,7 @@ void DRW_view_data_free_unused(DRWViewData *view_data)
{
for (ViewportEngineData &engine : view_data->engines) {
if (view_data->enabled_engines.first_index_of_try(&engine) == -1) {
draw_viewport_engines_data_clear(&engine);
draw_viewport_engines_data_clear(&engine, false);
}
}
}