44#include <wlr/types/wlr_matrix.h>
55#include <wlr/render/wlr_renderer.h>
66#include <wlr/render/interface.h>
7+ #include <wlr/util/box.h>
78
89#include "util/signal.h"
910#include "render/wlr_renderer.h"
@@ -503,6 +504,7 @@ static bool surface_copy_wl_shm(struct wlr_zext_screencopy_surface_v1 *surface,
503504 return false;
504505 }
505506
507+ // TODO: Only copy damaged region
506508 uint32_t renderer_flags = 0 ;
507509 bool ok ;
508510 ok = wlr_renderer_begin_with_buffer (renderer , src_buffer );
@@ -518,7 +520,7 @@ static bool surface_copy_wl_shm(struct wlr_zext_screencopy_surface_v1 *surface,
518520
519521static bool blit_dmabuf (struct wlr_renderer * renderer ,
520522 struct wlr_buffer * dst_buffer ,
521- struct wlr_buffer * src_buffer ) {
523+ struct wlr_buffer * src_buffer , struct wlr_box * clip_box ) {
522524 struct wlr_texture * src_tex =
523525 wlr_texture_from_buffer (renderer , src_buffer );
524526 if (!src_tex ) {
@@ -533,8 +535,9 @@ static bool blit_dmabuf(struct wlr_renderer *renderer,
533535 goto error_renderer_begin ;
534536 }
535537
536- wlr_renderer_clear (renderer , ( float []){ 0.0 , 0.0 , 0.0 , 0.0 } );
538+ wlr_renderer_scissor (renderer , clip_box );
537539 wlr_render_texture_with_matrix (renderer , src_tex , mat , 1.0f );
540+ wlr_renderer_scissor (renderer , NULL );
538541
539542 wlr_renderer_end (renderer );
540543
@@ -560,7 +563,24 @@ static bool surface_copy_dmabuf(struct wlr_zext_screencopy_surface_v1 *surface,
560563 if (attr -> format != format )
561564 return false;
562565
563- return blit_dmabuf (renderer , dst_buffer , src_buffer );
566+ // TODO: More fine grained damage regions
567+ struct pixman_region32 damage ;
568+
569+ pixman_region32_init (& damage );
570+ pixman_region32_union (& damage , & surface -> frame_damage ,
571+ & surface -> current_buffer .damage );
572+
573+ pixman_box32_t * extents = pixman_region32_extents (& damage );
574+ struct wlr_box clip_box = {
575+ .x = extents -> x1 ,
576+ .y = extents -> y1 ,
577+ .width = extents -> x2 - extents -> x1 ,
578+ .height = extents -> y2 - extents -> y1 ,
579+ };
580+
581+ pixman_region32_fini (& damage );
582+
583+ return blit_dmabuf (renderer , dst_buffer , src_buffer , & clip_box );
564584}
565585
566586static bool surface_copy (struct wlr_zext_screencopy_surface_v1 * surface ,
0 commit comments