diff options
author | Arnaud Vrac <avrac@freebox.fr> | 2017-11-29 15:25:34 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-12-11 09:34:26 +0000 |
commit | 49a8d9997b1e65b15bf069c061f366740b2a1222 (patch) | |
tree | 34846df67ba8452e5e3c4fd1d531ef7f345587d8 | |
parent | 8e8fa8e885306f32342bfe19256c4df540273fc8 (diff) |
gl-renderer: fix pixel format used in texture uploads when using R/RG textures
In glTexImage2D / glTexSubImage2D calls, the only pixel formats allowed
for the GL_R8 and GL_RG internal formats are respectively GL_RED and
GL_RG [1].
Make sure we match this requirement, as some drivers will fail with the
current code.
[1] https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml, Table 2
Signed-off-by: Arnaud Vrac <rawoul@gmail.com>
Fixes: 00a03d2f724 ("gl-renderer: add support of WL_SHM_FORMAT_NV12")
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | libweston/gl-renderer.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c index 6fd3641f..8726c340 100644 --- a/libweston/gl-renderer.c +++ b/libweston/gl-renderer.c @@ -1388,6 +1388,18 @@ gl_renderer_read_pixels(struct weston_output *output, return 0; } +static GLenum gl_format_from_internal(GLenum internal_format) +{ + switch (internal_format) { + case GL_R8_EXT: + return GL_RED_EXT; + case GL_RG8_EXT: + return GL_RG_EXT; + default: + return internal_format; + } +} + static void gl_renderer_flush_damage(struct weston_surface *surface) { @@ -1436,7 +1448,7 @@ gl_renderer_flush_damage(struct weston_surface *surface) gs->pitch / gs->hsub[j], buffer->height / gs->vsub[j], 0, - gs->gl_format[j], + gl_format_from_internal(gs->gl_format[j]), gs->gl_pixel_type, data + gs->offset[j]); } @@ -1458,7 +1470,7 @@ gl_renderer_flush_damage(struct weston_surface *surface) gs->pitch / gs->hsub[j], buffer->height / gs->vsub[j], 0, - gs->gl_format[j], + gl_format_from_internal(gs->gl_format[j]), gs->gl_pixel_type, data + gs->offset[j]); } @@ -1486,7 +1498,7 @@ gl_renderer_flush_damage(struct weston_surface *surface) r.y1 / gs->vsub[j], (r.x2 - r.x1) / gs->hsub[j], (r.y2 - r.y1) / gs->vsub[j], - gs->gl_format[j], + gl_format_from_internal(gs->gl_format[j]), gs->gl_pixel_type, data + gs->offset[j]); } |