diff options
-rw-r--r-- | types/wlr_screencopy_v1.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/types/wlr_screencopy_v1.c b/types/wlr_screencopy_v1.c index f5bd74ad..34f6c5b6 100644 --- a/types/wlr_screencopy_v1.c +++ b/types/wlr_screencopy_v1.c @@ -3,6 +3,7 @@ #include <drm_fourcc.h> #include <wlr/interfaces/wlr_output.h> #include <wlr/render/allocator.h> +#include <wlr/render/swapchain.h> #include <wlr/render/wlr_renderer.h> #include <wlr/types/wlr_screencopy_v1.h> #include <wlr/backend.h> @@ -194,11 +195,6 @@ static bool frame_shm_copy(struct wlr_screencopy_frame_v1 *frame, struct wlr_renderer *renderer = output->renderer; assert(renderer); - int x = frame->box.x; - int y = frame->box.y; - int width = frame->box.width; - int height = frame->box.height; - void *data; uint32_t format; size_t stride; @@ -208,12 +204,20 @@ static bool frame_shm_copy(struct wlr_screencopy_frame_v1 *frame, } bool ok = false; - if (!renderer_bind_buffer(renderer, src_buffer)) { + + struct wlr_texture *texture = wlr_texture_from_buffer(renderer, src_buffer); + if (!texture) { goto out; } - ok = wlr_renderer_read_pixels(renderer, format, - stride, width, height, x, y, 0, 0, data); - renderer_bind_buffer(renderer, NULL); + + ok = wlr_texture_read_pixels(texture, &(struct wlr_texture_read_pixels_options) { + .data = data, + .format = format, + .stride = stride, + .src_box = frame->box, + }); + + wlr_texture_destroy(texture); out: wlr_buffer_end_data_ptr_access(frame->buffer); @@ -525,7 +529,25 @@ static void capture_output(struct wl_client *wl_client, struct wlr_renderer *renderer = output->renderer; assert(renderer); - frame->shm_format = wlr_output_preferred_read_format(frame->output); + if (!wlr_output_configure_primary_swapchain(output, NULL, &output->swapchain)) { + goto error; + } + + int buffer_age; + struct wlr_buffer *buffer = wlr_swapchain_acquire(output->swapchain, &buffer_age); + if (buffer == NULL) { + goto error; + } + + struct wlr_texture *texture = wlr_texture_from_buffer(renderer, buffer); + wlr_buffer_unlock(buffer); + if (!texture) { + goto error; + } + + frame->shm_format = wlr_texture_preferred_read_format(texture); + wlr_texture_destroy(texture); + if (frame->shm_format == DRM_FORMAT_INVALID) { wlr_log(WLR_ERROR, "Failed to capture output: no read format supported by renderer"); |