Hi Ville, Thank you for the patch. On Thursday 17 Nov 2016 18:14:13 ville.syrjala@xxxxxxxxxxxxxxx wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Stuff something semi-reasonable into fb->pixel_format. I had to guess > as to which formats we should pick. Did I guess correctly? > > We can't quite use drm_mode_legacy_fb_format() due to the ARGB1555 > vs. XRGB155 mess. However use of 'A' formats should imply per-pixel > alpha blending as far as KMS is concerned so I'm not at all sure we > want to have any 'A' formats exposed as opposed to just 'X' formats. > OTOH vmvgfx doesn't do planes, and so the core won't enforce that > these formats match any list of supported formats, so the choice > shouldn't be super important at this point. The vmgfx driver should really be converted to using struct drm_mode_fb_cmd2 through the whole code instead of converting struct drm_mode_fb_cmd2 to struct drm_mode_fb_cmd in vmw_kms_fb_create(). I gave it a go a few months back but the structure is passed around so many functions that conversion requires more knowledge about the driver than I have. I don't expect you to fix that, but it would be nice if Sinclair or Thomas could give it a go. > Cc: linux-graphics-maintainer@xxxxxxxxxx > Cc: Sinclair Yeh <syeh@xxxxxxxxxx> > Cc: Thomas Hellstrom <thellstrom@xxxxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c > b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 7d92ab56961b..5788913ca8f9 > 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c > @@ -524,6 +524,7 @@ static int vmw_kms_new_framebuffer_surface(struct > vmw_private *dev_priv, struct drm_device *dev = dev_priv->dev; > struct vmw_framebuffer_surface *vfbs; > enum SVGA3dSurfaceFormat format; > + u32 pixel_format; > int ret; > > /* 3D is only supported on HWv8 and newer hosts */ > @@ -548,17 +549,22 @@ static int vmw_kms_new_framebuffer_surface(struct > vmw_private *dev_priv, return -EINVAL; > } > > + /* FIXME 'A' format implies per-pixel alpha blending for KMS */ > switch (mode_cmd->depth) { > case 32: > + pixel_format = DRM_FORMAT_ARGB8888; > format = SVGA3D_A8R8G8B8; > break; > case 24: > + pixel_format = DRM_FORMAT_XRGB8888; > format = SVGA3D_X8R8G8B8; > break; > case 16: > + pixel_format = DRM_FORMAT_RGB565; > format = SVGA3D_R5G6B5; > break; > case 15: > + pixel_format = DRM_FORMAT_ARGB1555; > format = SVGA3D_A1R5G5B5; > break; > default: > @@ -582,7 +588,8 @@ static int vmw_kms_new_framebuffer_surface(struct > vmw_private *dev_priv, } > > vfbs->base.base.dev = dev; > - /* XXX get the first 3 from the surface info */ > + /* XXX get the first 4 from the surface info */ > + vfbs->base.base.pixel_format = pixel_format; > vfbs->base.base.bits_per_pixel = mode_cmd->bpp; > vfbs->base.base.pitches[0] = mode_cmd->pitch; > vfbs->base.base.depth = mode_cmd->depth; > @@ -834,6 +841,7 @@ static int vmw_kms_new_framebuffer_dmabuf(struct > vmw_private *dev_priv, struct drm_device *dev = dev_priv->dev; > struct vmw_framebuffer_dmabuf *vfbd; > unsigned int requested_size; > + u32 pixel_format; > int ret; > > requested_size = mode_cmd->height * mode_cmd->pitch; > @@ -852,6 +860,12 @@ static int vmw_kms_new_framebuffer_dmabuf(struct > vmw_private *dev_priv, if (mode_cmd->bpp == 32) > break; > > + /* FIXME 'A' format implies per-pixel alpha blending for KMS */ > + if (mode_cmd->depth == 32) > + pixel_format = DRM_FORMAT_ARGB8888; > + else > + pixel_format = DRM_FORMAT_XRGB8888; > + > DRM_ERROR("Invalid color depth/bbp: %d %d\n", > mode_cmd->depth, mode_cmd->bpp); > return -EINVAL; > @@ -861,6 +875,12 @@ static int vmw_kms_new_framebuffer_dmabuf(struct > vmw_private *dev_priv, if (mode_cmd->bpp == 16) > break; > > + /* FIXME 'A' format implies per-pixel alpha blending for KMS */ > + if (mode_cmd->depth == 16) > + pixel_format = DRM_FORMAT_RGB565; > + else > + pixel_format = DRM_FORMAT_ARGB1555; > + > DRM_ERROR("Invalid color depth/bbp: %d %d\n", > mode_cmd->depth, mode_cmd->bpp); > return -EINVAL; > @@ -877,6 +897,7 @@ static int vmw_kms_new_framebuffer_dmabuf(struct > vmw_private *dev_priv, } > > vfbd->base.base.dev = dev; > + vfbd->base.base.pixel_format = pixel_format; > vfbd->base.base.bits_per_pixel = mode_cmd->bpp; > vfbd->base.base.pitches[0] = mode_cmd->pitch; > vfbd->base.base.depth = mode_cmd->depth; -- Regards, Laurent Pinchart _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel