@@ -164,6 +164,8 @@ static void ((*get_line_fmt_transform_function(u32 format))
return &ARGB8888_to_ARGB16161616;
else if (format == DRM_FORMAT_ARGB16161616)
return &get_ARGB16161616;
+ else if (format == DRM_FORMAT_XRGB16161616)
+ return &XRGB16161616_to_ARGB16161616;
else
return &XRGB8888_to_ARGB16161616;
}
@@ -175,6 +177,8 @@ static void ((*get_output_line_function(u32 format))
return &convert_to_ARGB8888;
else if (format == DRM_FORMAT_ARGB16161616)
return &convert_to_ARGB16161616;
+ else if (format == DRM_FORMAT_XRGB16161616)
+ return &convert_to_XRGB16161616;
else
return &convert_to_XRGB8888;
}
@@ -89,6 +89,19 @@ static void get_ARGB16161616(void *pixels_addr, int length, u64 *line_buffer)
}
}
+static void XRGB16161616_to_ARGB16161616(void *pixels_addr, int length,
+ u64 *line_buffer)
+{
+ __le64 *src_pixels = pixels_addr;
+ int i;
+
+ for (i = 0; i < length; i++) {
+ line_buffer[i] = le64_to_cpu(*src_pixels) | (0xffffllu << 48);
+
+ src_pixels++;
+ }
+}
+
/*
* The following functions are used as blend operations. But unlike the
* `alpha_blend`, these functions take an ARGB16161616 pixel from the
@@ -152,4 +165,16 @@ static void convert_to_ARGB16161616(void *pixels_addr, int length,
}
}
+static void convert_to_XRGB16161616(void *pixels_addr, int length,
+ u64 *line_buffer)
+{
+ __le64 *dst_pixels = pixels_addr;
+ int i;
+
+ for (i = 0; i < length; i++) {
+ *dst_pixels = cpu_to_le64(line_buffer[i] | (0xffffllu << 48));
+ dst_pixels++;
+ }
+}
+
#endif /* _VKMS_FORMATS_H_ */
@@ -13,11 +13,14 @@
static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_XRGB16161616
};
static const u32 vkms_plane_formats[] = {
DRM_FORMAT_ARGB8888,
- DRM_FORMAT_XRGB8888
+ DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_XRGB16161616,
+ DRM_FORMAT_ARGB16161616
};
static struct drm_plane_state *
@@ -14,6 +14,8 @@
static const u32 vkms_wb_formats[] = {
DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_XRGB16161616,
+ DRM_FORMAT_ARGB16161616
};
static const struct drm_connector_funcs vkms_wb_connector_funcs = {
This will be useful to write tests that depends on these formats. ARGB format is already used as the universal format for internal uses. Here we are just exposing it to the user space. XRGB follows the a similar implementation of the former format. Just overwriting the alpha channel. Signed-off-by: Igor Torrente <igormtorrente@gmail.com> --- drivers/gpu/drm/vkms/vkms_composer.c | 4 ++++ drivers/gpu/drm/vkms/vkms_formats.h | 25 +++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_plane.c | 5 ++++- drivers/gpu/drm/vkms/vkms_writeback.c | 2 ++ 4 files changed, 35 insertions(+), 1 deletion(-)