Bug 484353

Summary: Animation playback gets stuck when there is a clone of a group containing a layer with multiple transform masks
Product: [Applications] krita Reporter: Krzysztof Jajeśnica <krzysztof.jajesnica>
Component: AnimationAssignee: Dmitry Kazakov <dimula73>
Status: RESOLVED FIXED    
Severity: normal CC: dimula73
Priority: NOR    
Version: 5.2.2   
Target Milestone: ---   
Platform: Appimage   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:
Attachments: Example .kra file which reproduces the bug.
Video recording of the bug

Description Krzysztof Jajeśnica 2024-03-23 23:31:13 UTC
Created attachment 167681 [details]
Example .kra file which reproduces the bug.

SUMMARY
The following layer structure breaks animation playback:
- Clone of Group 1
- Group 1
    - Paint layer / Fill layer
        - Transform Mask 1 (animated using animation curves)
        - Transform Mask 2 (not animated)

The animation playback will work fine for about 1-5 repetitions of the animation and then get stuck displaying a single frame.

STEPS TO REPRODUCE
1. Create the layer structure mentioned in the summary (or open the attached .kra file).
2. Play the animation.
3. The animation plays correctly for a few repetitions and then gets stuck.

The bug occurs 100% on the time on my machine when playing the animation from the attached .kra file. The only thing that changes is the amount of time from start of playback until the bug occurs.

AFAIK the aforementioned layer structure is a minimum reproducible example for this bug; any of the following changes stop the bug from occurring:
- Removing the non-animated transform mask
- Removing the clone layer
- Removing the group and instead cloning the paint layer directly

OBSERVED RESULT
Animation playback works fine for about 1-5 repetitions, then it gets stuck on a single frame (it stops changing between frames). The UI is still responsive and Krita things the animation is still playing (the cursor in the Animation Timeline docker is moving).  Sometimes the frame on which playback gets stuck is a mixture of 2 seemingly random frames with screen tearing-like artifacts.

EXPECTED RESULT
Animation playback continues playing (and repeating) the animation until user stops the playback.

SOFTWARE/OS VERSIONS
Linux 6.8.1-arch1-1 (EndeavourOS)
KDE Plasma Version:  6.0.2
KDE Frameworks Version:  6.0.0
Qt Version:  6.6.2
Not sure if KDE/Qt versions matter since I'm running the AppImage version of Krita.

ADDITIONAL INFORMATION
The bug only affects animation playback inside Krita, exporting animations works fine.
Tested on 2 different machines (same OS & Krita version, one machine has an Nvidia GPU with proprietary drivers, the other has an Intel iGPU), so it's probably not something hardware-related.

OUTPUT FROM KRITA'S "REPORT BUG" FUNCTION (truncated to last session due to character limit):

Krita

 Version: 5.2.2
 Hidpi: true

Qt

  Version (compiled): 5.15.7
  Version (loaded): 5.15.7

OS Information

  Build ABI: x86_64-little_endian-lp64
  Build CPU: x86_64
  CPU: x86_64
  Kernel Type: linux
  Kernel Version: 6.8.1-arch1-1
  Pretty Productname: EndeavourOS
  Product Type: endeavouros
  Product Version: unknown
  Desktop: KDE
  Appimage build: Yes

Locale

  Languages: en_GB, en_Latn_GB
  C locale: LC_CTYPE=en_GB.UTF-8;LC_NUMERIC=en_GB.UTF-8;LC_TIME=C;LC_COLLATE=en_GB.UTF-8;LC_MONETARY=pl_PL.UTF-8;LC_MESSAGES=en_GB.UTF-8;LC_PAPER=pl_PL.UTF-8;LC_NAME=pl_PL.UTF-8;LC_ADDRESS=pl_PL.UTF-8;LC_TELEPHONE=pl_PL.UTF-8;LC_MEASUREMENT=pl_PL.UTF-8;LC_IDENTIFICATION=pl_PL.UTF-8
  QLocale current: en-GB
  QLocale system: en-GB
  QTextCodec for locale: UTF-8

OpenGL Info
 
  Vendor:  "NVIDIA Corporation" 
  Renderer:  "NVIDIA GeForce RTX 3060 Ti/PCIe/SSE2" 
  Driver version:  "4.6.0 NVIDIA 550.67" 
  Shading language:  "4.60 NVIDIA" 
  Requested format:  QSurfaceFormat(version 3.3, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 0, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::CompatibilityProfile) 
  Current format:  QSurfaceFormat(version 4.6, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 0, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::CompatibilityProfile) 
  GL version: 4.6 
  Supports deprecated functions false 
  Is OpenGL ES: false 
  supportsBufferMapping: true 
  supportsBufferInvalidation: true 
  forceDisableTextureBuffers: false 
  Extensions: 
     GL_ARB_compatibility 
     GL_EXT_raster_multisample 
     GL_ARB_texture_cube_map 
     GL_NV_multisample_filter_hint 
     GL_EXT_pixel_buffer_object 
     GL_NV_conservative_raster_dilate 
     GL_ARB_texture_buffer_range 
     GL_ARB_sparse_texture2 
     GL_ARB_gpu_shader_int64 
     GL_ARB_shader_precision 
     GL_ARB_texture_buffer_object 
     GL_EXTX_framebuffer_mixed_formats 
     GL_ARB_draw_buffers 
     GL_ARB_separate_shader_objects 
     GL_NV_primitive_restart 
     GL_EXT_bgra 
     GL_EXT_blend_equation_separate 
     GL_ARB_sparse_texture_clamp 
     GL_EXT_vertex_array 
     GL_ARB_pipeline_statistics_query 
     GL_NV_clip_space_w_scaling 
     GL_NV_half_float 
     GL_ARB_debug_output 
     GL_ARB_multitexture 
     GL_EXT_sparse_texture2 
     GL_ARB_window_pos 
     GL_EXT_depth_bounds_test 
     GL_EXT_texture_shadow_lod 
     GL_ARB_texture_query_lod 
     GL_EXT_vertex_attrib_64bit 
     GL_ARB_draw_buffers_blend 
     GL_ARB_timer_query 
     GL_NV_register_combiners 
     GL_SUN_slice_accum 
     GL_NV_shader_storage_buffer_object 
     GL_EXT_texture_array 
     GL_ARB_texture_view 
     GL_ARB_shader_storage_buffer_object 
     GL_ARB_instanced_arrays 
     GL_ARB_gl_spirv 
     GL_EXT_memory_object 
     GL_NV_representative_fragment_test 
     GL_EXT_direct_state_access 
     GL_OVR_multiview2 
     GL_ARB_compute_variable_group_size 
     GL_NV_bindless_texture 
     GL_NV_texgen_reflection 
     GL_EXT_framebuffer_multisample_blit_scaled 
     GL_NV_shader_thread_shuffle 
     GL_ARB_provoking_vertex 
     GL_ARB_point_parameters 
     GL_NV_texture_shader2 
     GL_ARB_multisample 
     GL_NV_texture_shader3 
     GL_ARB_half_float_vertex 
     GL_EXT_shader_image_load_formatted 
     GL_ARB_shader_draw_parameters 
     GL_ARB_texture_rg 
     GL_NV_mesh_shader 
     GL_NV_conservative_raster_pre_snap_triangles 
     GL_NV_fragment_program_option 
     GL_ARB_map_buffer_range 
     GL_NV_fog_distance 
     GL_ARB_texture_storage 
     GL_ARB_texture_non_power_of_two 
     GL_NV_sample_mask_override_coverage 
     GL_EXT_texture_sRGB 
     GL_NV_memory_attachment 
     GL_ARB_texture_env_add 
     GL_ARB_shader_texture_lod 
     GL_NV_sample_locations 
     GL_ARB_vertex_buffer_object 
     GL_ARB_robust_buffer_access_behavior 
     GL_NV_gpu_program4 
     GL_NV_scissor_exclusive 
     GL_ARB_texture_buffer_object_rgb32 
     GL_EXT_semaphore_fd 
     GL_NV_texture_multisample 
     GL_EXT_draw_buffers2 
     GL_ARB_draw_indirect 
     GL_ARB_framebuffer_no_attachments 
     GL_NV_fence 
     GL_ARB_ES2_compatibility 
     GL_ARB_ES3_compatibility 
     GL_ARB_sparse_buffer 
     GL_EXT_texture_storage 
     GL_EXT_texture_integer 
     GL_ARB_clear_texture 
     GL_EXT_texture_cube_map 
     GL_EXT_texture_filter_anisotropic 
     GL_ARB_texture_barrier 
     GL_ARB_shader_objects 
     GL_EXT_multiview_texture_multisample 
     GL_EXT_secondary_color 
     GL_ARB_framebuffer_object 
     GL_ARB_vertex_type_10f_11f_11f_rev 
     GL_EXT_texture_buffer_object 
     GL_EXT_semaphore 
     GL_EXT_shadow_funcs 
     GL_EXT_post_depth_coverage 
     GL_ARB_fragment_layer_viewport 
     GL_EXT_abgr 
     GL_AMD_vertex_shader_viewport_index 
     GL_EXT_stencil_wrap 
     GL_EXT_import_sync_object 
     GL_NV_path_rendering 
     GL_ARB_post_depth_coverage 
     GL_ATI_texture_mirror_once 
     GL_EXT_vertex_array_bgra 
     GL_NV_conservative_raster_pre_snap 
     GL_ARB_shading_language_include 
     GL_ARB_buffer_storage 
     GL_ARB_texture_env_combine 
     GL_EXT_x11_sync_object 
     GL_EXT_shader_image_load_store 
     GL_OVR_multiview 
     GL_EXT_texture_env_dot3 
     GL_NV_blend_square 
     GL_NV_texture_dirty_tile_map 
     GL_NV_shader_atomic_counters 
     GL_ARB_vertex_attrib_64bit 
     GL_NV_pixel_data_range 
     GL_ARB_transform_feedback_instanced 
     GL_NV_shader_atomic_fp16_vector 
     GL_EXT_shader_integer_mix 
     GL_ARB_explicit_attrib_location 
     GL_ARB_draw_elements_base_vertex 
     GL_KHR_blend_equation_advanced 
     GL_NV_blend_equation_advanced_coherent 
     GL_ARB_occlusion_query2 
     GL_EXT_gpu_shader4 
     GL_KHR_parallel_shader_compile 
     GL_EXT_blend_minmax 
     GL_ARB_shader_image_load_store 
     GL_ARB_viewport_array 
     GL_NV_draw_texture 
     GL_EXT_gpu_program_parameters 
     GL_NV_blend_equation_advanced 
     GL_ARB_tessellation_shader 
     GL_ARB_base_instance 
     GL_NV_geometry_shader4 
     GL_NVX_gpu_memory_info 
     GL_ARB_transpose_matrix 
     GL_ARB_texture_filter_minmax 
     GL_EXT_draw_range_elements 
     GL_NV_vertex_attrib_integer_64bit 
     GL_NV_feature_query 
     GL_AMD_seamless_cubemap_per_texture 
     GL_ARB_program_interface_query 
     GL_ARB_sampler_objects 
     GL_ARB_texture_filter_anisotropic 
     GL_ARB_fragment_program_shadow 
     GL_NV_vertex_array_range 
     GL_ARB_cull_distance 
     GL_EXT_texture_env_combine 
     GL_NV_copy_image 
     GL_NV_shader_subgroup_partitioned 
     GL_ARB_half_float_pixel 
     GL_NV_gpu_program5_mem_extended 
     GL_ARB_ES3_2_compatibility 
     GL_ARB_texture_gather 
     GL_EXT_stencil_two_side 
     GL_NV_fragment_coverage_to_color 
     GL_AMD_multi_draw_indirect 
     GL_EXT_texture_mirror_clamp 
     GL_EXT_texture_compression_latc 
     GL_ARB_shader_atomic_counters 
     GL_NV_framebuffer_multisample_coverage 
     GL_EXT_Cg_shader 
     GL_NV_gpu_multicast 
     GL_SGIX_shadow 
     GL_NV_ES1_1_compatibility 
     GL_ARB_conditional_render_inverted 
     GL_NV_alpha_to_coverage_dither_control 
     GL_ARB_sample_locations 
     GL_NV_copy_depth_to_color 
     GL_NV_shader_thread_group 
     GL_ARB_gpu_shader5 
     GL_NV_transform_feedback 
     GL_NV_vertex_program1_1 
     GL_ATI_draw_buffers 
     GL_ARB_internalformat_query2 
     GL_EXT_texture_shared_exponent 
     GL_ARB_shader_ballot 
     GL_NV_vertex_program 
     GL_EXT_separate_specular_color 
     GL_ARB_sync 
     GL_NV_gpu_program4_1 
     GL_ARB_fragment_coord_conventions 
     GL_NV_gpu_program5 
     GL_EXT_blend_func_separate 
     GL_EXT_framebuffer_blit 
     GL_ARB_texture_float 
     GL_NV_depth_clamp 
     GL_NV_uniform_buffer_unified_memory 
     GL_ARB_explicit_uniform_location 
     GL_ARB_fragment_shader 
     GL_NV_texture_rectangle_compressed 
     GL_KHR_blend_equation_advanced_coherent 
     GL_ARB_draw_instanced 
     GL_EXT_compiled_vertex_array 
     GL_ARB_compute_shader 
     GL_NV_path_rendering_shared_edge 
     GL_ATI_texture_float 
     GL_ARB_texture_rectangle 
     GL_KHR_robustness 
     GL_ARB_geometry_shader4 
     GL_KHR_no_error 
     GL_ARB_texture_compression 
     GL_EXT_texture3D 
     GL_ARB_texture_multisample 
     GL_ARB_imaging 
     GL_S3_s3tc 
     GL_NV_shading_rate_image 
     GL_ARB_shader_group_vote 
     GL_NV_bindless_multi_draw_indirect_count 
     GL_NV_compute_program5 
     GL_NV_vertex_program3 
     GL_NV_conditional_render 
     GL_EXT_framebuffer_sRGB 
     GL_ARB_shading_language_packing 
     GL_NV_ES3_1_compatibility 
     GL_ARB_shading_language_420pack 
     GL_NV_parameter_buffer_object2 
     GL_ARB_copy_image 
     GL_NV_fill_rectangle 
     GL_EXT_bindable_uniform 
     GL_IBM_rasterpos_clip 
     GL_EXT_point_parameters 
     GL_KHR_debug 
     GL_NV_gpu_shader5 
     GL_NV_shader_atomic_float64 
     GL_NV_conservative_raster 
     GL_EXT_texture_lod_bias 
     GL_ARB_get_program_binary 
     GL_ARB_texture_mirror_clamp_to_edge 
     GL_ARB_ES3_1_compatibility 
     GL_ARB_clear_buffer_object 
     GL_NV_packed_depth_stencil 
     GL_ARB_robustness 
     GL_NV_vertex_program2_option 
     GL_ARB_seamless_cubemap_per_texture 
     GL_ARB_shading_language_100 
     GL_EXT_texture_lod 
     GL_NV_fragment_shader_barycentric 
     GL_ARB_depth_clamp 
     GL_NV_gpu_program_fp64 
     GL_NV_vertex_program2 
     GL_ARB_seamless_cube_map 
     GL_EXT_polygon_offset_clamp 
     GL_NV_depth_buffer_float 
     GL_EXT_framebuffer_multisample 
     GL_ARB_spirv_extensions 
     GL_ARB_stencil_texturing 
     GL_NVX_conditional_render 
     GL_EXT_blend_subtract 
     GL_NV_register_combiners2 
     GL_ARB_invalidate_subdata 
     GL_ARB_vertex_array_object 
     GL_ARB_vertex_program 
     GL_ARB_texture_rgb10_a2ui 
     GL_ARB_shader_texture_image_samples 
     GL_NV_shader_atomic_int64 
     GL_NV_geometry_shader_passthrough 
     GL_ARB_compressed_texture_pixel_storage 
     GL_EXT_window_rectangles 
     GL_EXT_framebuffer_object 
     GL_ARB_vertex_shader 
     GL_ARB_direct_state_access 
     GL_ARB_texture_cube_map_array 
     GL_EXT_draw_instanced 
     GL_EXT_provoking_vertex 
     GL_NV_viewport_array2 
     GL_ARB_texture_env_dot3 
     GL_EXT_multi_draw_arrays 
     GL_ARB_uniform_buffer_object 
     GL_NV_vdpau_interop2 
     GL_EXT_blend_color 
     GL_AMD_vertex_shader_layer 
     GL_NV_internalformat_sample_query 
     GL_NV_transform_feedback2 
     GL_NV_shader_buffer_load 
     GL_ARB_sparse_texture 
     GL_NV_point_sprite 
     GL_ARB_depth_texture 
     GL_ARB_polygon_offset_clamp 
     GL_NV_explicit_multisample 
     GL_ARB_conservative_depth 
     GL_EXT_texture_object 
     GL_ARB_fragment_shader_interlock 
     GL_KTX_buffer_region 
     GL_NV_float_buffer 
     GL_NV_vdpau_interop 
     GL_NVX_nvenc_interop 
     GL_EXT_texture_env_add 
     GL_ARB_shader_bit_encoding 
     GL_EXT_packed_float 
     GL_ARB_copy_buffer 
     GL_NV_light_max_exponent 
     GL_ARB_multi_draw_indirect 
     GL_ARB_derivative_control 
     GL_ARB_shader_atomic_counter_ops 
     GL_ARB_texture_border_clamp 
     GL_KHR_shader_subgroup 
     GL_SGIX_depth_texture 
     GL_EXT_timer_query 
     GL_EXT_texture_compression_rgtc 
     GL_ARB_texture_swizzle 
     GL_EXT_packed_depth_stencil 
     GL_SGIS_generate_mipmap 
     GL_ARB_transform_feedback3 
     GL_ARB_shader_viewport_layer_array 
     GL_NV_draw_vulkan_image 
     GL_ARB_framebuffer_sRGB 
     GL_ARB_multi_bind 
     GL_EXT_texture_edge_clamp 
     GL_ARB_vertex_array_bgra 
     GL_NV_shader_atomic_float 
     GL_ARB_point_sprite 
     GL_ARB_get_texture_sub_image 
     GL_ARB_fragment_program 
     GL_IBM_texture_mirrored_repeat 
     GL_EXT_texture_sRGB_decode 
     GL_ARB_arrays_of_arrays 
     GL_ARB_shader_image_size 
     GL_ARB_shader_clock 
     GL_ARB_bindless_texture 
     GL_NV_primitive_shading_rate 
     GL_EXT_texture_compression_dxt1 
     GL_NV_memory_object_sparse 
     GL_EXT_rescale_normal 
     GL_EXT_packed_pixels 
     GL_ARB_internalformat_query 
     GL_ARB_query_buffer_object 
     GL_NV_command_list 
     GL_NV_robustness_video_memory_purge 
     GL_EXT_texture_swizzle 
     GL_ARB_shader_subroutine 
     GL_ARB_blend_func_extended 
     GL_NV_shader_texture_footprint 
     GL_NV_texture_barrier 
     GL_NV_vertex_buffer_unified_memory 
     GL_ARB_pixel_buffer_object 
     GL_ARB_map_buffer_alignment 
     GL_NV_texture_rectangle 
     GL_ARB_clip_control 
     GL_ARB_transform_feedback2 
     GL_ARB_gpu_shader_fp64 
     GL_KHR_robust_buffer_access_behavior 
     GL_NV_uniform_buffer_std430_layout 
     GL_NV_conservative_raster_underestimation 
     GL_EXT_texture_compression_s3tc 
     GL_ARB_transform_feedback_overflow_query 
     GL_ARB_enhanced_layouts 
     GL_ARB_shadow 
     GL_ARB_sample_shading 
     GL_NV_fragment_shader_interlock 
     GL_NV_framebuffer_mixed_samples 
     GL_ARB_texture_mirrored_repeat 
     GL_ARB_texture_stencil8 
     GL_ARB_texture_env_crossbar 
     GL_ARB_texture_compression_rgtc 
     GL_ARB_texture_query_levels 
     GL_NV_fragment_program2 
     GL_NVX_blend_equation_advanced_multi_draw_buffers 
     GL_NV_query_resource 
     GL_NV_timeline_semaphore 
     GL_ARB_vertex_attrib_binding 
     GL_ARB_indirect_parameters 
     GL_ARB_color_buffer_float 
     GL_ARB_texture_compression_bptc 
     GL_NV_stereo_view_rendering 
     GL_ARB_occlusion_query 
     GL_NV_viewport_swizzle 
     GL_ARB_texture_storage_multisample 
     GL_SGIS_texture_lod 
     GL_EXT_fog_coord 
     GL_EXT_geometry_shader4 
     GL_ARB_vertex_type_2_10_10_10_rev 
     GL_NV_texture_shader 
     GL_ARB_depth_buffer_float 
     GL_NV_query_resource_tag 
     GL_EXT_separate_shader_objects 
     GL_KHR_context_flush_control 
     GL_NV_parameter_buffer_object 
     GL_EXT_transform_feedback2 
     GL_NV_multisample_coverage 
     GL_EXT_memory_object_fd 
     GL_NV_vertex_array_range2 
     GL_EXT_multiview_timer_query 
     GL_NV_compute_shader_derivatives 
     GL_NV_fragment_program 
     GL_EXT_texture_filter_minmax 
     GL_NV_occlusion_query 
     GL_NV_blend_minmax_factor 
     GL_NV_bindless_multi_draw_indirect 
     GL_ARB_parallel_shader_compile 
     GL_NVX_progress_fence 
     GL_NV_texture_compression_vtc 
     GL_NV_texture_env_combine4 
     GL_EXT_texture_sRGB_R8 

QPA OpenGL Detection Info 
  supportsDesktopGL: true 
  supportsOpenGLES: true 
  isQtPreferOpenGLES: false 
  Detected renderers: 
    (Supported) NVIDIA GeForce RTX 3060 Ti/PCIe/SSE2 (OpenGL ES 3.2 NVIDIA 550.67) 
    (Supported) NVIDIA GeForce RTX 3060 Ti/PCIe/SSE2 (4.6.0 NVIDIA 550.67)  

useBufferInvalidation (config option): false


Hardware Information

  GPU Acceleration: auto
  Memory: 32004 Mb
  Number of Cores: 24
  Swap Location: /tmp
  Built for: sse2
  Base instruction set: fma3+avx2
  Supported instruction sets: fma3+avx2 avx2 fma3+avx avx fma4 fma3+sse4.2 sse4.2 sse4.1 ssse3 sse3 sse2 

Current Settings

  Current Swap Location: /tmp
  Current Swap Location writable: true
  Undo Enabled: true
  Undo Stack Limit: 200
  Use OpenGL: true
  Use OpenGL Texture Buffer: true
  Disable Vector Optimizations: false
  Disable AVX Optimizations: false
  Canvas State: OPENGL_SUCCESS
  Autosave Interval: 420
  Use Backup Files: false
  Number of Backups Kept: 1
  Backup File Suffix: ~
  Backup Location: Same Folder as the File
  Backup Location writable: false
  Resource Location: /home/k2aj/.local/share/krita
  Use Win8 Pointer Input: false
  Use RightMiddleTabletButton Workaround: false
  Levels of Detail Enabled: false
  Use Zip64: true


Loaded Python Plugins
	colorspace
	comics_project_management_tools
	documenttools
	exportlayers
	filtermanager
	lastdocumentsdocker
	plugin_importer
	quick_settings_docker
	scripter
	tenbrushes
	tenscripts
	colorspace
	comics_project_management_tools
	documenttools
	exportlayers
	filtermanager
	lastdocumentsdocker
	plugin_importer
	quick_settings_docker
	scripter
	tenbrushes
	tenscripts


Display Information
Number of screens: 2
	Screen: 0
		Name: HDMI-0
		Depth: 24
		Scale: 1.25
		Physical DPI111.958
		Logical DPI96
		Physical Size: 697, 392
		Position: 0, 0
		Resolution in pixels: 3072x1728
		Manufacturer: LG Electronics
		Model: LG HDR 4K
		Refresh Rate: 59.9966
		Serial Number: 204NTDV77762
	Screen: 1
		Name: HDMI-1
		Depth: 24
		Scale: 1.25
		Physical DPI98.7811
		Logical DPI96
		Physical Size: 527, 296
		Position: 3840, 360
		Resolution in pixels: 2048x1152
		Manufacturer: Philips Consumer Electronics Company
		Model: PHL 245E1
		Refresh Rate: 59.9506
		Serial Number: 22641


---------------------
================================================================================
SESSION: 24 Mar 2024 00:16:45 +0100. Executing /tmp/.mount_krita-26uqcv/usr/bin/krita

Krita Version: 5.2.2, Qt version compiled: 5.15.7, loaded: 5.15.7. Process ID: 51731
-- -- -- -- -- -- -- --
24 Mar 2024 00:16:45 +0100: Style: fusion. Available styles: Windows, Fusion
24 Mar 2024 00:16:46 +0100: Database is up to date. Version: 0.0.17, created by Krita 5.1.5, at Wed Jun 28 16:19:47 2023
24 Mar 2024 00:16:50 +0100: Importing application/x-krita to application/x-krita. Location: /home/k2aj/a/pictures/art/practice/2024-03-22-candle-bugreport.kra. Real location: /home/k2aj/a/pictures/art/practice/2024-03-22-candle-bugreport.kra. Batchmode: 0
24 Mar 2024 00:16:50 +0100: Loaded image from application/x-krita. Size: 1080 * 1080 pixels, 4.16667 dpi. Color model: 8-bit integer/channel RGB/Alpha (sRGB-elle-V2-srgbtrc.icc). Layers: 4

---------------------
Comment 1 Krzysztof Jajeśnica 2024-03-23 23:38:35 UTC
Created attachment 167682 [details]
Video recording of the bug
Comment 2 Dmitry Kazakov 2024-09-11 08:44:14 UTC
Hi, Krzysztof!

Thank you for the report, I can reproduce the problem!

The problem seems to be twofold: 
1) Changing time resets transform mask cache
2) Starting the playback (or animation cache regeneration) resets transform mask cache
3) When transform mask tries to recalculate the cache, it stops the animation playback
Comment 3 Dmitry Kazakov 2024-09-12 14:21:14 UTC
Git commit 0dd3c7bf03ac7eddb59a84d0c67849c3571ae76b by Dmitry Kazakov.
Committed on 12/09/2024 at 13:07.
Pushed by dkazakov into branch 'master'.

Fix clone layers resetting the animation cache

KisLayer::updateClones() used to emit an update signal that used
to reset the animation cache. The resetting happened in a three-fold
way:

1) In LoD mode, KisSuspendProjectionUpdatesStrokeStrategy compressed the
   clone's update and issued it after the the actual stroke is finished.
   That caused the clone update to happen outside the frames lock and
   reset the cache.

2) When switching time KisRegenerateFrameStrokeStrategy used to issue
   an update under a lock, but the request leaked in LoD mode.

3) KisRecalculateTransformMaskJob::run() used to request projection
   update with the frames locked. But this lock didn't cover the updates
   issued for clones.

The actual solution of this patch is to forward the "don't invalidate frames"
flag down to the merge walkers, so that they could forward this flag to
the clones and make sure that clones don't reset frames.

TODO: we still need to properly split the walkers to avoid that nasty
      virtual inheritance and double-setting of the flags in the
      constructor.

A  +35   -0    libs/image/KisProjectionUpdateFlags.h     [License: GPL(v2.0+)]
M  +2    -2    libs/image/commands/kis_image_layer_move_command.cpp
M  +17   -4    libs/image/kis_base_rects_walker.h
M  +6    -2    libs/image/kis_clone_layer.cpp
M  +1    -1    libs/image/kis_clone_layer.h
M  +1    -1    libs/image/kis_full_refresh_walker.h
M  +24   -69   libs/image/kis_image.cc
M  +9    -27   libs/image/kis_image.h
M  +19   -0    libs/image/kis_image_interfaces.cpp
M  +5    -12   libs/image/kis_image_interfaces.h
M  +4    -4    libs/image/kis_layer.cc
M  +1    -1    libs/image/kis_layer.h
M  +4    -3    libs/image/kis_merge_walker.cc
M  +6    -2    libs/image/kis_merge_walker.h
M  +2    -2    libs/image/kis_node.cpp
M  +1    -1    libs/image/kis_node_graph_listener.cpp
M  +2    -1    libs/image/kis_node_graph_listener.h
M  +3    -13   libs/image/kis_projection_updates_filter.cpp
M  +4    -6    libs/image/kis_projection_updates_filter.h
M  +5    -2    libs/image/kis_recalculate_transform_mask_job.cpp
M  +3    -1    libs/image/kis_refresh_subtree_walker.h
M  +1    -1    libs/image/kis_regenerate_frame_stroke_strategy.cpp
M  +55   -31   libs/image/kis_simple_update_queue.cpp
M  +11   -8    libs/image/kis_simple_update_queue.h
M  +37   -110  libs/image/kis_suspend_projection_updates_stroke_strategy.cpp
M  +0    -10   libs/image/kis_suspend_projection_updates_stroke_strategy.h
M  +8    -22   libs/image/kis_update_scheduler.cpp
M  +10   -5    libs/image/kis_update_scheduler.h
M  +14   -6    libs/image/tests/kis_simple_update_queue_test.cpp
M  +2    -2    libs/ui/kis_node_juggler_compressed.cpp
M  +2    -2    libs/ui/widgets/kis_scratch_pad.cpp

https://invent.kde.org/graphics/krita/-/commit/0dd3c7bf03ac7eddb59a84d0c67849c3571ae76b
Comment 4 Dmitry Kazakov 2024-09-12 14:26:08 UTC
Git commit 2c57b948e4e8810934147ceb0c90ed8a5d5d5645 by Dmitry Kazakov.
Committed on 12/09/2024 at 14:25.
Pushed by dkazakov into branch 'krita/5.2'.

Fix clone layers resetting the animation cache

KisLayer::updateClones() used to emit an update signal that used
to reset the animation cache. The resetting happened in a three-fold
way:

1) In LoD mode, KisSuspendProjectionUpdatesStrokeStrategy compressed the
   clone's update and issued it after the the actual stroke is finished.
   That caused the clone update to happen outside the frames lock and
   reset the cache.

2) When switching time KisRegenerateFrameStrokeStrategy used to issue
   an update under a lock, but the request leaked in LoD mode.

3) KisRecalculateTransformMaskJob::run() used to request projection
   update with the frames locked. But this lock didn't cover the updates
   issued for clones.

The actual solution of this patch is to forward the "don't invalidate frames"
flag down to the merge walkers, so that they could forward this flag to
the clones and make sure that clones don't reset frames.

TODO: we still need to properly split the walkers to avoid that nasty
      virtual inheritance and double-setting of the flags in the
      constructor.

A  +35   -0    libs/image/KisProjectionUpdateFlags.h     [License: GPL(v2.0+)]
M  +2    -2    libs/image/commands/kis_image_layer_move_command.cpp
M  +17   -4    libs/image/kis_base_rects_walker.h
M  +6    -2    libs/image/kis_clone_layer.cpp
M  +1    -1    libs/image/kis_clone_layer.h
M  +1    -1    libs/image/kis_full_refresh_walker.h
M  +24   -69   libs/image/kis_image.cc
M  +9    -27   libs/image/kis_image.h
M  +19   -0    libs/image/kis_image_interfaces.cpp
M  +5    -12   libs/image/kis_image_interfaces.h
M  +4    -4    libs/image/kis_layer.cc
M  +1    -1    libs/image/kis_layer.h
M  +4    -3    libs/image/kis_merge_walker.cc
M  +6    -2    libs/image/kis_merge_walker.h
M  +2    -2    libs/image/kis_node.cpp
M  +1    -1    libs/image/kis_node_graph_listener.cpp
M  +2    -1    libs/image/kis_node_graph_listener.h
M  +3    -13   libs/image/kis_projection_updates_filter.cpp
M  +4    -6    libs/image/kis_projection_updates_filter.h
M  +5    -2    libs/image/kis_recalculate_transform_mask_job.cpp
M  +3    -1    libs/image/kis_refresh_subtree_walker.h
M  +1    -1    libs/image/kis_regenerate_frame_stroke_strategy.cpp
M  +55   -31   libs/image/kis_simple_update_queue.cpp
M  +11   -8    libs/image/kis_simple_update_queue.h
M  +37   -110  libs/image/kis_suspend_projection_updates_stroke_strategy.cpp
M  +0    -10   libs/image/kis_suspend_projection_updates_stroke_strategy.h
M  +8    -22   libs/image/kis_update_scheduler.cpp
M  +10   -5    libs/image/kis_update_scheduler.h
M  +14   -6    libs/image/tests/kis_simple_update_queue_test.cpp
M  +2    -2    libs/ui/kis_node_juggler_compressed.cpp
M  +2    -2    libs/ui/widgets/kis_scratch_pad.cpp

https://invent.kde.org/graphics/krita/-/commit/2c57b948e4e8810934147ceb0c90ed8a5d5d5645