@@ -3204,6 +3204,16 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
}
}
+ if (r->flags & DRM_MODE_FB_AUX_PLANE) {
+ num_planes++;
+
+ if (num_planes == 4) {
+ DRM_DEBUG_KMS("Number of planes cannot exceed 3"
+ "(including aux plane)\n");
+ return -EINVAL;
+ }
+ }
+
for (i = num_planes; i < 4; i++) {
if (r->modifier[i]) {
DRM_DEBUG_KMS("non-zero modifier for unused plane %d\n", i);
@@ -3242,7 +3252,8 @@ internal_framebuffer_create(struct drm_device *dev,
struct drm_framebuffer *fb;
int ret;
- if (r->flags & ~(DRM_MODE_FB_INTERLACED | DRM_MODE_FB_MODIFIERS)) {
+ if (r->flags & ~(DRM_MODE_FB_INTERLACED | DRM_MODE_FB_MODIFIERS |
+ DRM_MODE_FB_AUX_PLANE)) {
DRM_DEBUG_KMS("bad framebuffer flags 0x%08x\n", r->flags);
return ERR_PTR(-EINVAL);
}
@@ -3264,6 +3275,12 @@ internal_framebuffer_create(struct drm_device *dev,
return ERR_PTR(-EINVAL);
}
+ if (r->flags & DRM_MODE_FB_AUX_PLANE &&
+ !dev->mode_config.allow_aux_plane) {
+ DRM_DEBUG_KMS("driver does not support render compression\n");
+ return ERR_PTR(-EINVAL);
+ }
+
ret = framebuffer_check(r);
if (ret)
return ERR_PTR(ret);
@@ -312,6 +312,9 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
case DRM_CAP_ADDFB2_MODIFIERS:
req->value = dev->mode_config.allow_fb_modifiers;
break;
+ case DRM_CAP_RENDER_COMPRESSION:
+ req->value = dev->mode_config.allow_aux_plane;
+ break;
default:
return -EINVAL;
}
@@ -1156,6 +1156,9 @@ struct drm_mode_config {
/* whether the driver supports fb modifiers */
bool allow_fb_modifiers;
+ /* whether the driver supports render compression */
+ bool allow_aux_plane;
+
/* cursor size */
uint32_t cursor_width, cursor_height;
};
@@ -631,6 +631,7 @@ struct drm_gem_open {
#define DRM_CAP_CURSOR_WIDTH 0x8
#define DRM_CAP_CURSOR_HEIGHT 0x9
#define DRM_CAP_ADDFB2_MODIFIERS 0x10
+#define DRM_CAP_RENDER_COMPRESSION 0x11
/** DRM_IOCTL_GET_CAP ioctl argument type */
struct drm_get_cap {
@@ -354,6 +354,7 @@ struct drm_mode_fb_cmd {
#define DRM_MODE_FB_INTERLACED (1<<0) /* for interlaced framebuffers */
#define DRM_MODE_FB_MODIFIERS (1<<1) /* enables ->modifer[] */
+#define DRM_MODE_FB_AUX_PLANE (1<<2) /* for compressed buffer */
struct drm_mode_fb_cmd2 {
__u32 fb_id;