[PATCH 09/12] drm: Track the number of buffers that compose a framebuffer

Damien Lespiau
2013-09-16T17:48:52Z

DRM has supported multiple-buffers fbs since the introduction of ADDFB2.
Let's track the number of buffers in a drm_framebuffer in the common
structure so we can use it in the DRM core.

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
drivers/gpu/drm/drm_crtc_helper.c | 20 ++++++++++++++++++++
include/drm/drm_crtc.h | 9 +++++++++
2 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index 6a64749..32985c0 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -901,6 +901,25 @@ void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
}
EXPORT_SYMBOL(drm_helper_connector_dpms);

+static int drm_helper_mode_fb_num_buffers(struct drm_mode_fb_cmd2 *mode_cmd)
+{
+ int count = 0, i, j;
+
+ for (i = 0; i < 4; i++) {
+ if (!mode_cmd->handles[i])
+ continue;
+
+ for (j = 0; j < i; j++)
+ if (mode_cmd->handles[i] == mode_cmd->handles[j])
+ break;
+
+ if (j == i)
+ count++;
+ }
+
+ return count;
+}
+
int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
struct drm_mode_fb_cmd2 *mode_cmd)
{
@@ -915,6 +934,7 @@ int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth,
&fb->bits_per_pixel);
fb->pixel_format = mode_cmd->pixel_format;
+ fb->num_buffers = drm_helper_mode_fb_num_buffers(mode_cmd);

return 0;
}
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index bf242ac..e685baf 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -286,6 +286,15 @@ struct drm_framebuffer {
int flags;
uint32_t pixel_format; /* fourcc format */
struct list_head filp_head;
+ /*
+ * A framebuffer can be made of several planes (eg. planar YUV
+ * formats). These planes can either share the same buffer (in which
+ * case 'offsets' will tell us where they are within that buffer) or
+ * be in separate buffers (in which case offsets[i] will generally be
+ * 0). We track in the common DRM code how many different buffers the
+ * framebuffer consists of.
+ */
+ int num_buffers;
/* if you are using the helper */
void *helper_private;
};
--
1.8.3.1