Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 1a89d0d

Browse files
committed
Scissor dmabufs based on buffer damage
1 parent f311c00 commit 1a89d0d

1 file changed

Lines changed: 23 additions & 3 deletions

File tree

types/wlr_zext_screencopy_v1.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
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

519521
static 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

566586
static bool surface_copy(struct wlr_zext_screencopy_surface_v1 *surface,

0 commit comments

Comments
 (0)