diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index e1110f8f2..6e469f8d5 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -205,6 +205,8 @@ struct weston_testsuite_quirks { bool gl_force_full_upload; /** Ensure GL shadow fb is used, and always repaint it fully. */ bool gl_force_full_redraw_of_shadow_fb; + /** Force GL-renderer to use the internal YUV->RGB shader */ + bool gl_force_import_yuv_fallback; /** Required enum weston_capability bit mask, otherwise skip run. */ uint32_t required_capabilities; }; diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 3fe26e0fa..c06e12782 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -3441,8 +3441,11 @@ import_dmabuf(struct gl_renderer *gr, { EGLImageKHR egl_image; struct gl_buffer_state *gb; + const struct pixel_format_info *info; + const struct weston_testsuite_quirks *quirks; - if (!pixel_format_get_info(dmabuf->attributes.format)) + info = pixel_format_get_info(dmabuf->attributes.format); + if (!info) return NULL; gb = zalloc(sizeof(*gb)); @@ -3453,6 +3456,11 @@ import_dmabuf(struct gl_renderer *gr, pixman_region32_init(&gb->texture_damage); wl_list_init(&gb->destroy_listener.link); + quirks = &gr->compositor->test_data.test_quirks; + if (quirks->gl_force_import_yuv_fallback && + info->color_model == COLOR_MODEL_YUV) + goto import_yuv; + egl_image = import_simple_dmabuf(gr, &dmabuf->attributes); if (egl_image != EGL_NO_IMAGE_KHR) { const GLint swizzles[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; @@ -3478,6 +3486,7 @@ import_dmabuf(struct gl_renderer *gr, return gb; } +import_yuv: if (!import_yuv_dmabuf(gr, gb, &dmabuf->attributes)) { destroy_buffer_state(gb); return NULL;