On Mon, 2019-01-07 at 11:08 +0100, Daniel Vetter wrote:
@@ -1654,6 +1712,40 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, return -EINVAL; }
- /*
* Workaround for SDL 1.2, which is known to be setting all pixel format
* fields values to zero in some cases. We treat this situation as a
* kind of "use some reasonable autodetected values".
*/
- if (!var->red.offset && !var->green.offset &&
!var->blue.offset && !var->transp.offset &&
!var->red.length && !var->green.length &&
!var->blue.length && !var->transp.length &&
!var->red.msb_right && !var->green.msb_right &&
!var->blue.msb_right && !var->transp.msb_right) {
u8 depth;
/*
* There is no way to guess the right value for depth when
* bpp is 16 or 32. So we just restore the behaviour previously
* introduced here by commit . In fact, this was
* implemented even earlier in various device drivers.
*/
switch (var->bits_per_pixel) {
case 16:
depth = 15;
break;
case 32:
depth = 24;
break;
default:
depth = var->bits_per_pixel;
break;
}
drm_fb_helper_fill_pixel_fmt(var, depth);
Please use fb->format->depth here instead of guessing. -Daniel
I do not think that this is the right way.
Without guessing, if SDL1 makes a request with bits_per_pixel == 16 (for example) and current fb->format->depth == 24, ioctl() will succeed while actual pixel format will remain the same. As a result, SDL1 will display garbage because of invalid pixel format.
Or am I missing something here?
This is supposed to be the case where SDL didn't set any of this stuff. Guess is definitely not what we want to do, we should use the actual depth, which is stored in fb->format->depth. Older code did guess, but we fixed that, and shouldn't reintroduce that guess game. -Daniel
Done. See the v2 patch series.