@@ -1933,11 +1933,27 @@ bool win_process_animation_and_state_change(struct session *ps, struct win *w, d
1933
1933
w -> saved_win_image );
1934
1934
w -> saved_win_image = NULL ;
1935
1935
}
1936
- // TODO(yshui): might need to copy for NVIDIA. because acquiring a new
1937
- // window image before freeing the old one could be problematic with
1938
- // NVIDIA.
1939
- w -> saved_win_image = w -> win_image ;
1940
- w -> win_image = NULL ;
1936
+ if (ps -> drivers & DRIVER_NVIDIA ) {
1937
+ if (w -> win_image != NULL ) {
1938
+ w -> saved_win_image = ps -> backend_data -> ops .new_image (
1939
+ ps -> backend_data , BACKEND_IMAGE_FORMAT_PIXMAP ,
1940
+ (ivec2 ){
1941
+ .width = (int )win_ctx .width_before ,
1942
+ .height = (int )win_ctx .height_before ,
1943
+ });
1944
+ region_t copy_region ;
1945
+ pixman_region32_init_rect (& copy_region , 0 , 0 ,
1946
+ (uint )win_ctx .width_before ,
1947
+ (uint )win_ctx .height_before );
1948
+ ps -> backend_data -> ops .copy_area (
1949
+ ps -> backend_data , (ivec2 ){}, w -> saved_win_image ,
1950
+ w -> win_image , & copy_region );
1951
+ pixman_region32_fini (& copy_region );
1952
+ }
1953
+ } else {
1954
+ w -> saved_win_image = w -> win_image ;
1955
+ w -> win_image = NULL ;
1956
+ }
1941
1957
w -> saved_win_image_scale = (vec2 ){
1942
1958
.x = win_ctx .width / win_ctx .width_before ,
1943
1959
.y = win_ctx .height / win_ctx .height_before ,
0 commit comments