diff --git a/src/backends/native/meta-renderer-native-gles3.c b/src/backends/native/meta-renderer-native-gles3.c index dbc59b6f6..49832ff7e 100644 --- a/src/backends/native/meta-renderer-native-gles3.c +++ b/src/backends/native/meta-renderer-native-gles3.c @@ -2,6 +2,7 @@ /* * Copyright (C) 2017 Red Hat + * Copyright (c) 2018 DisplayLink (UK) Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -243,16 +244,19 @@ meta_renderer_native_gles3_read_pixels (MetaEgl *egl, MetaGles3 *gles3, int width, int height, - uint8_t *target_data) + uint8_t *target_data, + int target_stride_bytes) { int y; + g_assert (target_stride_bytes >= 0); + GLBAS (gles3, glFinish, ()); for (y = 0; y < height; y++) { GLBAS (gles3, glReadPixels, (0, height - y, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, - target_data + width * y * 4)); + target_data + y * target_stride_bytes)); } } diff --git a/src/backends/native/meta-renderer-native-gles3.h b/src/backends/native/meta-renderer-native-gles3.h index b4ca19285..ecd0d29de 100644 --- a/src/backends/native/meta-renderer-native-gles3.h +++ b/src/backends/native/meta-renderer-native-gles3.h @@ -2,6 +2,7 @@ /* * Copyright (C) 2017 Red Hat + * Copyright (c) 2018 DisplayLink (UK) Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -40,6 +41,7 @@ void meta_renderer_native_gles3_read_pixels (MetaEgl *egl, MetaGles3 *gles3, int width, int height, - uint8_t *target_data); + uint8_t *target_data, + int target_stride_bytes); #endif /* META_RENDERER_NATIVE_GLES3_H */ diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index eb7f087d0..f58e6b3e0 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -126,6 +126,7 @@ typedef struct _MetaDumbBuffer uint64_t map_size; int width; int height; + int stride_bytes; } MetaDumbBuffer; typedef struct _MetaOnscreenNativeSecondaryGpuState @@ -1786,6 +1787,7 @@ copy_shared_framebuffer_cpu (CoglOnscreen *onscreen, MetaEgl *egl = meta_renderer_native_get_egl (renderer_native); int width, height; uint8_t *target_data; + int target_stride_bytes; uint32_t target_fb_id; MetaDumbBuffer *next_dumb_fb; MetaDumbBuffer *current_dumb_fb; @@ -1804,12 +1806,14 @@ copy_shared_framebuffer_cpu (CoglOnscreen *onscreen, g_assert (height == secondary_gpu_state->cpu.dumb_fb->height); target_data = secondary_gpu_state->cpu.dumb_fb->map; + target_stride_bytes = secondary_gpu_state->cpu.dumb_fb->stride_bytes; target_fb_id = secondary_gpu_state->cpu.dumb_fb->fb_id; meta_renderer_native_gles3_read_pixels (egl, renderer_native->gles3, width, height, - target_data); + target_data, + target_stride_bytes); secondary_gpu_state->gbm.next_fb_id = target_fb_id; } @@ -2306,6 +2310,7 @@ init_dumb_fb (MetaDumbBuffer *dumb_fb, dumb_fb->map_size = create_arg.size; dumb_fb->width = width; dumb_fb->height = height; + dumb_fb->stride_bytes = create_arg.pitch; return TRUE;