summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoïc Molinari <loic.molinari@collabora.com>2023-11-28 18:17:31 +0100
committerDerek Foreman <derek.foreman@collabora.com>2024-03-08 13:12:13 +0000
commitf1f921b8cfe36599052cf38e7a8dd94c46fb7785 (patch)
tree276ee8e19193373514dea74afacdf6b44dcf396b
parentb9be532b27dd8ee38b531fa8ed40ad020a51ab43 (diff)
gl-renderer: Validate SHM stride in common output capture path
SHM buffer stride validation is duplicated in sync and async output capture paths. Move it into a common path to avoid duplication. Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
-rw-r--r--libweston/renderer-gl/gl-renderer.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
index b38634e5..2de8d839 100644
--- a/libweston/renderer-gl/gl-renderer.c
+++ b/libweston/renderer-gl/gl-renderer.c
@@ -776,22 +776,15 @@ gl_renderer_do_capture(struct gl_renderer *gr, struct weston_buffer *into,
{
struct wl_shm_buffer *shm = into->shm_buffer;
const struct pixel_format_info *fmt = into->pixel_format;
- void *shm_pixels;
- int32_t stride;
bool ret;
assert(into->type == WESTON_BUFFER_SHM);
assert(shm);
- shm_pixels = wl_shm_buffer_get_data(shm);
-
- stride = wl_shm_buffer_get_stride(shm);
- if (stride % 4 != 0)
- return false;
-
wl_shm_buffer_begin_access(shm);
- ret = gl_renderer_do_read_pixels(gr, fmt, shm_pixels, stride, rect);
+ ret = gl_renderer_do_read_pixels(gr, fmt, wl_shm_buffer_get_data(shm),
+ wl_shm_buffer_get_stride(shm), rect);
wl_shm_buffer_end_access(shm);
@@ -841,7 +834,7 @@ async_capture_handler(void *data)
return 0;
}
-static bool
+static void
gl_renderer_do_read_pixels_async(struct gl_renderer *gr,
struct weston_output *output,
struct weston_capture_task *task,
@@ -856,13 +849,9 @@ gl_renderer_do_read_pixels_async(struct gl_renderer *gr,
assert(gr->has_pbo);
assert(output->current_mode->refresh > 0);
assert(buffer->type == WESTON_BUFFER_SHM);
- assert(buffer->shm_buffer);
assert(fmt->gl_type != 0);
assert(fmt->gl_format != 0);
- if (wl_shm_buffer_get_stride(buffer->shm_buffer) % 4 != 0)
- return false;
-
glPixelStorei(GL_PACK_ALIGNMENT, 4);
if (gr->has_pack_reverse)
glPixelStorei(GL_PACK_REVERSE_ROW_ORDER_ANGLE, GL_TRUE);
@@ -892,8 +881,6 @@ gl_renderer_do_read_pixels_async(struct gl_renderer *gr,
wl_event_source_timer_update(gl_task->source, 5 * refresh_msec);
wl_list_insert(&gr->pending_capture_list, &gl_task->link);
-
- return true;
}
static void
@@ -939,9 +926,13 @@ gl_renderer_do_capture_tasks(struct gl_renderer *gr,
continue;
}
+ if (wl_shm_buffer_get_stride(buffer->shm_buffer) % 4 != 0) {
+ weston_capture_task_retire_failed(ct, "GL: buffer stride not multiple of 4");
+ continue;
+ }
+
if (gr->has_pbo) {
- if (!gl_renderer_do_read_pixels_async(gr, output, ct, &rect))
- weston_capture_task_retire_failed(ct, "GL: capture failed");
+ gl_renderer_do_read_pixels_async(gr, output, ct, &rect);
continue;
}