[RFC PATCH 1/3] drm: Add explict alignment for formats

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>

hsub and vsub are used to indicate format subsampling, and currently
framebuffers cannot be allocated with a width not aligned to this value.
However, for auxiliary compressed planes this is undesirable: the
generic userspace does not know to quantise width/height, but the
non-generic allocator can pad the stride/size in an acceptable way.

Add explicit halign/valign members which allow a particular format to
have more loose (or strict) alignment requirements than its subsampling.

Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
Signed-off-by: Daniel Stone <daniels@xxxxxxxxxxxxx>
---
 drivers/gpu/drm/drm_framebuffer.c | 7 +++++--
 include/drm/drm_fourcc.h          | 2 ++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
index fc8ef42203ec..7ab8ea7f7a9f 100644
--- a/drivers/gpu/drm/drm_framebuffer.c
+++ b/drivers/gpu/drm/drm_framebuffer.c
@@ -149,6 +149,7 @@ static int framebuffer_check(struct drm_device *dev,
 			     const struct drm_mode_fb_cmd2 *r)
 {
 	const struct drm_format_info *info;
+	int halign, valign;
 	int i;
 
 	/* check if the format is supported at all */
@@ -164,12 +165,14 @@ static int framebuffer_check(struct drm_device *dev,
 	/* now let the driver pick its own format info */
 	info = drm_get_format_info(dev, r);
 
-	if (r->width == 0) {
+	halign = info->halign ? : info->hsub;
+	if (r->width == 0 || r->width % halign){
 		DRM_DEBUG_KMS("bad framebuffer width %u\n", r->width);
 		return -EINVAL;
 	}
 
-	if (r->height == 0) {
+	valign = info->valign ? : info->vsub;
+	if (r->height == 0 || r->height % valign) {
 		DRM_DEBUG_KMS("bad framebuffer height %u\n", r->height);
 		return -EINVAL;
 	}
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index 6942e84b6edd..a6aff4d091e8 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -46,6 +46,8 @@ struct drm_format_info {
 	u8 cpp[3];
 	u8 hsub;
 	u8 vsub;
+	u8 halign; /* specified only if != hsub */
+	u8 valign; /* specified only if != vsub */
 };
 
 /**
-- 
2.11.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux