* [PATCH RFC v7 01/10] drm: Introduce pixel_source DRM plane property
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 02/10] drm: Introduce solid fill " Jessica Zhang
` (9 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Pekka Paalanen,
Harry Wentland, Sebastian Wick, Jessica Zhang
Add support for pixel_source property to drm_plane and related
documentation. In addition, force pixel_source to
DRM_PLANE_PIXEL_SOURCE_FB in DRM_IOCTL_MODE_SETPLANE as to not break
legacy userspace.
This enum property will allow user to specify a pixel source for the
plane. Possible pixel sources will be defined in the
drm_plane_pixel_source enum.
Currently, the only pixel sources are DRM_PLANE_PIXEL_SOURCE_FB (the
default value) and DRM_PLANE_PIXEL_SOURCE_NONE.
Acked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
Acked-by: Simon Ser <contact@emersion.fr>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_atomic_state_helper.c | 1 +
drivers/gpu/drm/drm_atomic_uapi.c | 4 ++
drivers/gpu/drm/drm_blend.c | 94 +++++++++++++++++++++++++++++++
drivers/gpu/drm/drm_plane.c | 19 +++++--
include/drm/drm_blend.h | 2 +
include/drm/drm_plane.h | 21 +++++++
6 files changed, 137 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
index 784e63d70a42..01638c51ce0a 100644
--- a/drivers/gpu/drm/drm_atomic_state_helper.c
+++ b/drivers/gpu/drm/drm_atomic_state_helper.c
@@ -252,6 +252,7 @@ void __drm_atomic_helper_plane_state_reset(struct drm_plane_state *plane_state,
plane_state->alpha = DRM_BLEND_ALPHA_OPAQUE;
plane_state->pixel_blend_mode = DRM_MODE_BLEND_PREMULTI;
+ plane_state->pixel_source = DRM_PLANE_PIXEL_SOURCE_FB;
if (plane->color_encoding_property) {
if (!drm_object_property_get_default_value(&plane->base,
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 98d3b10c08ae..46c78b87803d 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -562,6 +562,8 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,
state->src_w = val;
} else if (property == config->prop_src_h) {
state->src_h = val;
+ } else if (property == plane->pixel_source_property) {
+ state->pixel_source = val;
} else if (property == plane->alpha_property) {
state->alpha = val;
} else if (property == plane->blend_mode_property) {
@@ -634,6 +636,8 @@ drm_atomic_plane_get_property(struct drm_plane *plane,
*val = state->src_w;
} else if (property == config->prop_src_h) {
*val = state->src_h;
+ } else if (property == plane->pixel_source_property) {
+ *val = state->pixel_source;
} else if (property == plane->alpha_property) {
*val = state->alpha;
} else if (property == plane->blend_mode_property) {
diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index 6e74de833466..fce734cdb85b 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -185,6 +185,25 @@
* plane does not expose the "alpha" property, then this is
* assumed to be 1.0
*
+ * pixel_source:
+ * pixel_source is set up with drm_plane_create_pixel_source_property().
+ * It is used to toggle the active source of pixel data for the plane.
+ * The plane will only display data from the set pixel_source -- any
+ * data from other sources will be ignored.
+ *
+ * For non-framebuffer sources, if pixel_source is set to a non-framebuffer
+ * and non-NONE source, and the corresponding source property is NULL, then
+ * the atomic commit should return an error.
+ *
+ * Possible values:
+ *
+ * "NONE":
+ * No active pixel source.
+ * Committing with a NONE pixel source will disable the plane.
+ *
+ * "FB":
+ * Framebuffer source set by the "FB_ID" property.
+ *
* Note that all the property extensions described here apply either to the
* plane or the CRTC (e.g. for the background color, which currently is not
* exposed and assumed to be black).
@@ -615,3 +634,78 @@ int drm_plane_create_blend_mode_property(struct drm_plane *plane,
return 0;
}
EXPORT_SYMBOL(drm_plane_create_blend_mode_property);
+
+static const struct drm_prop_enum_list drm_pixel_source_enum_list[] = {
+ { DRM_PLANE_PIXEL_SOURCE_NONE, "NONE" },
+ { DRM_PLANE_PIXEL_SOURCE_FB, "FB" },
+};
+
+/**
+ * drm_plane_create_pixel_source_property - create a new pixel source property
+ * @plane: DRM plane
+ * @extra_sources: Bitmask of additional supported pixel_sources for the driver.
+ * DRM_PLANE_PIXEL_SOURCE_FB and DRM_PLANE_PIXEL_SOURCE_NONE will
+ * always be enabled as supported sources.
+ *
+ * This creates a new property describing the current source of pixel data for the
+ * plane. The pixel_source will be initialized as DRM_PLANE_PIXEL_SOURCE_FB by default.
+ *
+ * Drivers can set a custom default source by overriding the pixel_source value in
+ * drm_plane_funcs.reset()
+ *
+ * The property is exposed to userspace as an enumeration property called
+ * "pixel_source" and has the following enumeration values:
+ *
+ * "NONE":
+ * No active pixel source
+ *
+ * "FB":
+ * Framebuffer pixel source
+ *
+ * Returns:
+ * Zero on success, negative errno on failure.
+ */
+int drm_plane_create_pixel_source_property(struct drm_plane *plane,
+ unsigned long extra_sources)
+{
+ struct drm_device *dev = plane->dev;
+ struct drm_property *prop;
+ static const unsigned int valid_source_mask = BIT(DRM_PLANE_PIXEL_SOURCE_FB) |
+ BIT(DRM_PLANE_PIXEL_SOURCE_NONE);
+ int i;
+
+ /* FB is supported by default */
+ unsigned long supported_sources = extra_sources |
+ BIT(DRM_PLANE_PIXEL_SOURCE_FB) |
+ BIT(DRM_PLANE_PIXEL_SOURCE_NONE);
+
+ if (WARN_ON(supported_sources & ~valid_source_mask))
+ return -EINVAL;
+
+ prop = drm_property_create(dev, DRM_MODE_PROP_ENUM | DRM_MODE_PROP_ATOMIC, "pixel_source",
+ hweight32(supported_sources));
+
+ if (!prop)
+ return -ENOMEM;
+
+ for (i = 0; i < ARRAY_SIZE(drm_pixel_source_enum_list); i++) {
+ int ret;
+
+ if (!test_bit(drm_pixel_source_enum_list[i].type, &supported_sources))
+ continue;
+
+ ret = drm_property_add_enum(prop, drm_pixel_source_enum_list[i].type,
+ drm_pixel_source_enum_list[i].name);
+ if (ret) {
+ drm_property_destroy(dev, prop);
+
+ return ret;
+ }
+ }
+
+ drm_object_attach_property(&plane->base, prop, DRM_PLANE_PIXEL_SOURCE_FB);
+ plane->pixel_source_property = prop;
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_plane_create_pixel_source_property);
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 24e7998d1731..559d101162ba 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -839,6 +839,14 @@ bool drm_any_plane_has_format(struct drm_device *dev,
}
EXPORT_SYMBOL(drm_any_plane_has_format);
+static bool drm_plane_needs_disable(struct drm_plane_state *state, struct drm_framebuffer *fb)
+{
+ if (state->pixel_source == DRM_PLANE_PIXEL_SOURCE_NONE)
+ return true;
+
+ return state->pixel_source == DRM_PLANE_PIXEL_SOURCE_FB && fb == NULL;
+}
+
/*
* __setplane_internal - setplane handler for internal callers
*
@@ -861,8 +869,8 @@ static int __setplane_internal(struct drm_plane *plane,
WARN_ON(drm_drv_uses_atomic_modeset(plane->dev));
- /* No fb means shut it down */
- if (!fb) {
+ /* No visible data means shut it down */
+ if (drm_plane_needs_disable(plane->state, fb)) {
plane->old_fb = plane->fb;
ret = plane->funcs->disable_plane(plane, ctx);
if (!ret) {
@@ -913,8 +921,8 @@ static int __setplane_atomic(struct drm_plane *plane,
WARN_ON(!drm_drv_uses_atomic_modeset(plane->dev));
- /* No fb means shut it down */
- if (!fb)
+ /* No visible data means shut it down */
+ if (drm_plane_needs_disable(plane->state, fb))
return plane->funcs->disable_plane(plane, ctx);
/*
@@ -987,6 +995,9 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
return -ENOENT;
}
+ if (plane->state)
+ plane->state->pixel_source = DRM_PLANE_PIXEL_SOURCE_FB;
+
if (plane_req->fb_id) {
fb = drm_framebuffer_lookup(dev, file_priv, plane_req->fb_id);
if (!fb) {
diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h
index 88bdfec3bd88..122bbfbaae33 100644
--- a/include/drm/drm_blend.h
+++ b/include/drm/drm_blend.h
@@ -58,4 +58,6 @@ int drm_atomic_normalize_zpos(struct drm_device *dev,
struct drm_atomic_state *state);
int drm_plane_create_blend_mode_property(struct drm_plane *plane,
unsigned int supported_modes);
+int drm_plane_create_pixel_source_property(struct drm_plane *plane,
+ unsigned long extra_sources);
#endif
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h
index 79d62856defb..0b24fae36304 100644
--- a/include/drm/drm_plane.h
+++ b/include/drm/drm_plane.h
@@ -40,6 +40,12 @@ enum drm_scaling_filter {
DRM_SCALING_FILTER_NEAREST_NEIGHBOR,
};
+enum drm_plane_pixel_source {
+ DRM_PLANE_PIXEL_SOURCE_NONE,
+ DRM_PLANE_PIXEL_SOURCE_FB,
+ DRM_PLANE_PIXEL_SOURCE_MAX
+};
+
/**
* struct drm_plane_state - mutable plane state
*
@@ -116,6 +122,14 @@ struct drm_plane_state {
/** @src_h: height of visible portion of plane (in 16.16) */
uint32_t src_h, src_w;
+ /**
+ * @pixel_source:
+ *
+ * Source of pixel information for the plane. See
+ * drm_plane_create_pixel_source_property() for more details.
+ */
+ enum drm_plane_pixel_source pixel_source;
+
/**
* @alpha:
* Opacity of the plane with 0 as completely transparent and 0xffff as
@@ -699,6 +713,13 @@ struct drm_plane {
*/
struct drm_plane_state *state;
+ /*
+ * @pixel_source_property:
+ * Optional pixel_source property for this plane. See
+ * drm_plane_create_pixel_source_property().
+ */
+ struct drm_property *pixel_source_property;
+
/**
* @alpha_property:
* Optional alpha property for this plane. See
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 02/10] drm: Introduce solid fill DRM plane property
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 01/10] drm: Introduce pixel_source DRM plane property Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-11-30 4:03 ` Dmitry Baryshkov
2023-10-27 22:32 ` [PATCH RFC v7 03/10] drm: Add solid fill pixel source Jessica Zhang
` (8 subsequent siblings)
10 siblings, 1 reply; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Harry Wentland,
Sebastian Wick, Jessica Zhang
Document and add support for solid_fill property to drm_plane. In
addition, add support for setting and getting the values for solid_fill.
To enable solid fill planes, userspace must assign a property blob to
the "solid_fill" plane property containing the following information:
struct drm_mode_solid_fill {
u32 r, g, b, pad;
};
Acked-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_atomic_state_helper.c | 9 ++++++++
drivers/gpu/drm/drm_atomic_uapi.c | 26 ++++++++++++++++++++++
drivers/gpu/drm/drm_blend.c | 30 ++++++++++++++++++++++++++
include/drm/drm_blend.h | 1 +
include/drm/drm_plane.h | 36 +++++++++++++++++++++++++++++++
include/uapi/drm/drm_mode.h | 24 +++++++++++++++++++++
6 files changed, 126 insertions(+)
diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
index 01638c51ce0a..86fb876efbe6 100644
--- a/drivers/gpu/drm/drm_atomic_state_helper.c
+++ b/drivers/gpu/drm/drm_atomic_state_helper.c
@@ -254,6 +254,11 @@ void __drm_atomic_helper_plane_state_reset(struct drm_plane_state *plane_state,
plane_state->pixel_blend_mode = DRM_MODE_BLEND_PREMULTI;
plane_state->pixel_source = DRM_PLANE_PIXEL_SOURCE_FB;
+ if (plane_state->solid_fill_blob) {
+ drm_property_blob_put(plane_state->solid_fill_blob);
+ plane_state->solid_fill_blob = NULL;
+ }
+
if (plane->color_encoding_property) {
if (!drm_object_property_get_default_value(&plane->base,
plane->color_encoding_property,
@@ -336,6 +341,9 @@ void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
if (state->fb)
drm_framebuffer_get(state->fb);
+ if (state->solid_fill_blob)
+ drm_property_blob_get(state->solid_fill_blob);
+
state->fence = NULL;
state->commit = NULL;
state->fb_damage_clips = NULL;
@@ -385,6 +393,7 @@ void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
drm_crtc_commit_put(state->commit);
drm_property_blob_put(state->fb_damage_clips);
+ drm_property_blob_put(state->solid_fill_blob);
}
EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 46c78b87803d..576acb34195f 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -316,6 +316,20 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
}
EXPORT_SYMBOL(drm_atomic_set_crtc_for_connector);
+static void drm_atomic_set_solid_fill_prop(struct drm_plane_state *state)
+{
+ struct drm_mode_solid_fill *user_info;
+
+ if (!state->solid_fill_blob)
+ return;
+
+ user_info = (struct drm_mode_solid_fill *)state->solid_fill_blob->data;
+
+ state->solid_fill.r = user_info->r;
+ state->solid_fill.g = user_info->g;
+ state->solid_fill.b = user_info->b;
+}
+
static void set_out_fence_for_crtc(struct drm_atomic_state *state,
struct drm_crtc *crtc, s32 __user *fence_ptr)
{
@@ -564,6 +578,15 @@ static int drm_atomic_plane_set_property(struct drm_plane *plane,
state->src_h = val;
} else if (property == plane->pixel_source_property) {
state->pixel_source = val;
+ } else if (property == plane->solid_fill_property) {
+ ret = drm_atomic_replace_property_blob_from_id(dev,
+ &state->solid_fill_blob,
+ val, sizeof(struct drm_mode_solid_fill),
+ -1, &replaced);
+ if (ret)
+ return ret;
+
+ drm_atomic_set_solid_fill_prop(state);
} else if (property == plane->alpha_property) {
state->alpha = val;
} else if (property == plane->blend_mode_property) {
@@ -638,6 +661,9 @@ drm_atomic_plane_get_property(struct drm_plane *plane,
*val = state->src_h;
} else if (property == plane->pixel_source_property) {
*val = state->pixel_source;
+ } else if (property == plane->solid_fill_property) {
+ *val = state->solid_fill_blob ?
+ state->solid_fill_blob->base.id : 0;
} else if (property == plane->alpha_property) {
*val = state->alpha;
} else if (property == plane->blend_mode_property) {
diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index fce734cdb85b..665c5d9b056f 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -204,6 +204,10 @@
* "FB":
* Framebuffer source set by the "FB_ID" property.
*
+ * solid_fill:
+ * solid_fill is set up with drm_plane_create_solid_fill_property(). It
+ * contains pixel data that drivers can use to fill a plane.
+ *
* Note that all the property extensions described here apply either to the
* plane or the CRTC (e.g. for the background color, which currently is not
* exposed and assumed to be black).
@@ -709,3 +713,29 @@ int drm_plane_create_pixel_source_property(struct drm_plane *plane,
return 0;
}
EXPORT_SYMBOL(drm_plane_create_pixel_source_property);
+
+/**
+ * drm_plane_create_solid_fill_property - create a new solid_fill property
+ * @plane: drm plane
+ *
+ * This creates a new property blob that holds pixel data for solid fill planes.
+ * The property is exposed to userspace as a property blob called "solid_fill".
+ *
+ * For information on what the blob contains, see `drm_mode_solid_fill`.
+ */
+int drm_plane_create_solid_fill_property(struct drm_plane *plane)
+{
+ struct drm_property *prop;
+
+ prop = drm_property_create(plane->dev,
+ DRM_MODE_PROP_ATOMIC | DRM_MODE_PROP_BLOB,
+ "solid_fill", 0);
+ if (!prop)
+ return -ENOMEM;
+
+ drm_object_attach_property(&plane->base, prop, 0);
+ plane->solid_fill_property = prop;
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_plane_create_solid_fill_property);
diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h
index 122bbfbaae33..e7158fbee389 100644
--- a/include/drm/drm_blend.h
+++ b/include/drm/drm_blend.h
@@ -60,4 +60,5 @@ int drm_plane_create_blend_mode_property(struct drm_plane *plane,
unsigned int supported_modes);
int drm_plane_create_pixel_source_property(struct drm_plane *plane,
unsigned long extra_sources);
+int drm_plane_create_solid_fill_property(struct drm_plane *plane);
#endif
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h
index 0b24fae36304..e2ae7c26cc57 100644
--- a/include/drm/drm_plane.h
+++ b/include/drm/drm_plane.h
@@ -46,6 +46,18 @@ enum drm_plane_pixel_source {
DRM_PLANE_PIXEL_SOURCE_MAX
};
+/**
+ * struct solid_fill_property - RGB values for solid fill plane
+ *
+ * TODO: Add solid fill source and corresponding pixel source
+ * that supports RGBA color
+ */
+struct drm_solid_fill {
+ uint32_t r;
+ uint32_t g;
+ uint32_t b;
+};
+
/**
* struct drm_plane_state - mutable plane state
*
@@ -130,6 +142,23 @@ struct drm_plane_state {
*/
enum drm_plane_pixel_source pixel_source;
+ /**
+ * @solid_fill_blob:
+ *
+ * Blob containing relevant information for a solid fill plane
+ * including RGB color values. See
+ * drm_plane_create_solid_fill_property() for more details.
+ */
+ struct drm_property_blob *solid_fill_blob;
+
+ /**
+ * @solid_fill:
+ *
+ * Pixel data for solid fill planes. See
+ * drm_plane_create_solid_fill_property() for more details.
+ */
+ struct drm_solid_fill solid_fill;
+
/**
* @alpha:
* Opacity of the plane with 0 as completely transparent and 0xffff as
@@ -720,6 +749,13 @@ struct drm_plane {
*/
struct drm_property *pixel_source_property;
+ /**
+ * @solid_fill_property:
+ * Optional solid_fill property for this plane. See
+ * drm_plane_create_solid_fill_property().
+ */
+ struct drm_property *solid_fill_property;
+
/**
* @alpha_property:
* Optional alpha property for this plane. See
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index ea1b639bcb28..3bf86406f10d 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -259,6 +259,30 @@ struct drm_mode_modeinfo {
char name[DRM_DISPLAY_MODE_LEN];
};
+/**
+ * struct drm_mode_solid_fill - User info for solid fill planes
+ *
+ * This is the userspace API solid fill information structure.
+ *
+ * Userspace can enable solid fill planes by assigning the plane "solid_fill"
+ * property to a blob containing a single drm_mode_solid_fill struct populated with an RGB323232
+ * color and setting the pixel source to "SOLID_FILL".
+ *
+ * For information on the plane property, see drm_plane_create_solid_fill_property()
+ *
+ * @r: Red color value of single pixel
+ * @g: Green color value of single pixel
+ * @b: Blue color value of single pixel
+ * @pad: padding, must be zero
+ */
+struct drm_mode_solid_fill {
+ __u32 r;
+ __u32 g;
+ __u32 b;
+ __u32 pad;
+};
+
+
struct drm_mode_card_res {
__u64 fb_id_ptr;
__u64 crtc_id_ptr;
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH RFC v7 02/10] drm: Introduce solid fill DRM plane property
2023-10-27 22:32 ` [PATCH RFC v7 02/10] drm: Introduce solid fill " Jessica Zhang
@ 2023-11-30 4:03 ` Dmitry Baryshkov
0 siblings, 0 replies; 21+ messages in thread
From: Dmitry Baryshkov @ 2023-11-30 4:03 UTC (permalink / raw)
To: Jessica Zhang
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Sean Paul,
Marijn Suijten, quic_abhinavk, ppaalanen, contact,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel,
Harry Wentland, Sebastian Wick
On Sat, 28 Oct 2023 at 01:33, Jessica Zhang <quic_jesszhan@quicinc.com> wrote:
>
> Document and add support for solid_fill property to drm_plane. In
> addition, add support for setting and getting the values for solid_fill.
>
> To enable solid fill planes, userspace must assign a property blob to
> the "solid_fill" plane property containing the following information:
>
> struct drm_mode_solid_fill {
> u32 r, g, b, pad;
> };
>
> Acked-by: Harry Wentland <harry.wentland@amd.com>
> Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
> Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/drm_atomic_state_helper.c | 9 ++++++++
> drivers/gpu/drm/drm_atomic_uapi.c | 26 ++++++++++++++++++++++
> drivers/gpu/drm/drm_blend.c | 30 ++++++++++++++++++++++++++
> include/drm/drm_blend.h | 1 +
> include/drm/drm_plane.h | 36 +++++++++++++++++++++++++++++++
> include/uapi/drm/drm_mode.h | 24 +++++++++++++++++++++
> 6 files changed, 126 insertions(+)
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH RFC v7 03/10] drm: Add solid fill pixel source
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 01/10] drm: Introduce pixel_source DRM plane property Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 02/10] drm: Introduce solid fill " Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 04/10] drm/atomic: Add pixel source to plane state dump Jessica Zhang
` (7 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Pekka Paalanen,
Harry Wentland, Sebastian Wick, Jessica Zhang
Add "SOLID_FILL" as a valid pixel source. If the pixel_source property is
set to "SOLID_FILL", it will display data from the drm_plane "solid_fill"
blob property.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_blend.c | 10 +++++++++-
include/drm/drm_plane.h | 1 +
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index 665c5d9b056f..37b31b7e5ce5 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -204,6 +204,9 @@
* "FB":
* Framebuffer source set by the "FB_ID" property.
*
+ * "SOLID_FILL":
+ * Solid fill color source set by the "solid_fill" property.
+ *
* solid_fill:
* solid_fill is set up with drm_plane_create_solid_fill_property(). It
* contains pixel data that drivers can use to fill a plane.
@@ -642,6 +645,7 @@ EXPORT_SYMBOL(drm_plane_create_blend_mode_property);
static const struct drm_prop_enum_list drm_pixel_source_enum_list[] = {
{ DRM_PLANE_PIXEL_SOURCE_NONE, "NONE" },
{ DRM_PLANE_PIXEL_SOURCE_FB, "FB" },
+ { DRM_PLANE_PIXEL_SOURCE_SOLID_FILL, "SOLID_FILL" },
};
/**
@@ -666,6 +670,9 @@ static const struct drm_prop_enum_list drm_pixel_source_enum_list[] = {
* "FB":
* Framebuffer pixel source
*
+ * "SOLID_FILL":
+ * Solid fill color pixel source
+ *
* Returns:
* Zero on success, negative errno on failure.
*/
@@ -675,7 +682,8 @@ int drm_plane_create_pixel_source_property(struct drm_plane *plane,
struct drm_device *dev = plane->dev;
struct drm_property *prop;
static const unsigned int valid_source_mask = BIT(DRM_PLANE_PIXEL_SOURCE_FB) |
- BIT(DRM_PLANE_PIXEL_SOURCE_NONE);
+ BIT(DRM_PLANE_PIXEL_SOURCE_NONE) |
+ BIT(DRM_PLANE_PIXEL_SOURCE_SOLID_FILL);
int i;
/* FB is supported by default */
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h
index e2ae7c26cc57..baaf737392bc 100644
--- a/include/drm/drm_plane.h
+++ b/include/drm/drm_plane.h
@@ -43,6 +43,7 @@ enum drm_scaling_filter {
enum drm_plane_pixel_source {
DRM_PLANE_PIXEL_SOURCE_NONE,
DRM_PLANE_PIXEL_SOURCE_FB,
+ DRM_PLANE_PIXEL_SOURCE_SOLID_FILL,
DRM_PLANE_PIXEL_SOURCE_MAX
};
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 04/10] drm/atomic: Add pixel source to plane state dump
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (2 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 03/10] drm: Add solid fill pixel source Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 05/10] drm/atomic: Add solid fill data " Jessica Zhang
` (6 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Harry Wentland,
Sebastian Wick, Jessica Zhang
Add pixel source to the atomic plane state dump
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_atomic.c | 1 +
drivers/gpu/drm/drm_blend.c | 1 +
drivers/gpu/drm/drm_crtc_internal.h | 1 +
3 files changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index c277b198fa3f..9f9abbe76369 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -722,6 +722,7 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
drm_printf(p, "plane[%u]: %s\n", plane->base.id, plane->name);
drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
+ drm_printf(p, "\tpixel-source=%s\n", drm_get_pixel_source_name(state->pixel_source));
drm_printf(p, "\tfb=%u\n", state->fb ? state->fb->base.id : 0);
if (state->fb)
drm_framebuffer_print_info(p, 2, state->fb);
diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index 37b31b7e5ce5..9c1608f7c1df 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -647,6 +647,7 @@ static const struct drm_prop_enum_list drm_pixel_source_enum_list[] = {
{ DRM_PLANE_PIXEL_SOURCE_FB, "FB" },
{ DRM_PLANE_PIXEL_SOURCE_SOLID_FILL, "SOLID_FILL" },
};
+DRM_ENUM_NAME_FN(drm_get_pixel_source_name, drm_pixel_source_enum_list);
/**
* drm_plane_create_pixel_source_property - create a new pixel source property
diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
index 501a10edd0e1..7bc93ba449d5 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -267,6 +267,7 @@ int drm_plane_check_pixel_format(struct drm_plane *plane,
u32 format, u64 modifier);
struct drm_mode_rect *
__drm_plane_get_damage_clips(const struct drm_plane_state *state);
+const char *drm_get_pixel_source_name(int val);
/* drm_bridge.c */
void drm_bridge_detach(struct drm_bridge *bridge);
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 05/10] drm/atomic: Add solid fill data to plane state dump
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (3 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 04/10] drm/atomic: Add pixel source to plane state dump Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 06/10] drm/atomic: Move framebuffer checks to helper Jessica Zhang
` (5 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Harry Wentland,
Sebastian Wick, Jessica Zhang
Add solid_fill property data to the atomic plane state dump.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_atomic.c | 4 ++++
drivers/gpu/drm/drm_plane.c | 8 ++++++++
include/drm/drm_plane.h | 3 +++
3 files changed, 15 insertions(+)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 9f9abbe76369..af778d32785b 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -726,6 +726,10 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
drm_printf(p, "\tfb=%u\n", state->fb ? state->fb->base.id : 0);
if (state->fb)
drm_framebuffer_print_info(p, 2, state->fb);
+ drm_printf(p, "\tsolid_fill=%u\n",
+ state->solid_fill_blob ? state->solid_fill_blob->base.id : 0);
+ if (state->solid_fill_blob)
+ drm_plane_solid_fill_print_info(p, 2, state);
drm_printf(p, "\tcrtc-pos=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&dest));
drm_printf(p, "\tsrc-pos=" DRM_RECT_FP_FMT "\n", DRM_RECT_FP_ARG(&src));
drm_printf(p, "\trotation=%x\n", state->rotation);
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 559d101162ba..289b3be86d52 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -1495,6 +1495,14 @@ __drm_plane_get_damage_clips(const struct drm_plane_state *state)
state->fb_damage_clips->data : NULL);
}
+void drm_plane_solid_fill_print_info(struct drm_printer *p, unsigned int indent,
+ const struct drm_plane_state *state)
+{
+ drm_printf_indent(p, indent, "r=0x%08x\n", state->solid_fill.r);
+ drm_printf_indent(p, indent, "g=0x%08x\n", state->solid_fill.g);
+ drm_printf_indent(p, indent, "b=0x%08x\n", state->solid_fill.b);
+}
+
/**
* drm_plane_get_damage_clips - Returns damage clips.
* @state: Plane state.
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h
index baaf737392bc..6171fb1a0b47 100644
--- a/include/drm/drm_plane.h
+++ b/include/drm/drm_plane.h
@@ -1001,6 +1001,9 @@ drm_plane_get_damage_clips_count(const struct drm_plane_state *state);
struct drm_mode_rect *
drm_plane_get_damage_clips(const struct drm_plane_state *state);
+void drm_plane_solid_fill_print_info(struct drm_printer *p, unsigned int indent,
+ const struct drm_plane_state *state);
+
int drm_plane_create_scaling_filter_property(struct drm_plane *plane,
unsigned int supported_filters);
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 06/10] drm/atomic: Move framebuffer checks to helper
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (4 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 05/10] drm/atomic: Add solid fill data " Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks Jessica Zhang
` (4 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Harry Wentland,
Sebastian Wick, Jessica Zhang
Currently framebuffer checks happen directly in
drm_atomic_plane_check(). Move these checks into their own helper
method.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Sebastian Wick <sebastian@sebastianwick.net>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_atomic.c | 130 ++++++++++++++++++++++++-------------------
1 file changed, 73 insertions(+), 57 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index af778d32785b..48a2df4e3d27 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -589,6 +589,76 @@ plane_switching_crtc(const struct drm_plane_state *old_plane_state,
return true;
}
+static int drm_atomic_plane_check_fb(const struct drm_plane_state *state)
+{
+ struct drm_plane *plane = state->plane;
+ const struct drm_framebuffer *fb = state->fb;
+ struct drm_mode_rect *clips;
+
+ uint32_t num_clips;
+ unsigned int fb_width, fb_height;
+ int ret;
+
+ /* Check whether this plane supports the fb pixel format. */
+ ret = drm_plane_check_pixel_format(plane, fb->format->format,
+ fb->modifier);
+
+ if (ret) {
+ drm_dbg_atomic(plane->dev,
+ "[PLANE:%d:%s] invalid pixel format %p4cc, modifier 0x%llx\n",
+ plane->base.id, plane->name,
+ &fb->format->format, fb->modifier);
+ return ret;
+ }
+
+ fb_width = fb->width << 16;
+ fb_height = fb->height << 16;
+
+ /* Make sure source coordinates are inside the fb. */
+ if (state->src_w > fb_width ||
+ state->src_x > fb_width - state->src_w ||
+ state->src_h > fb_height ||
+ state->src_y > fb_height - state->src_h) {
+ drm_dbg_atomic(plane->dev,
+ "[PLANE:%d:%s] invalid source coordinates "
+ "%u.%06ux%u.%06u+%u.%06u+%u.%06u (fb %ux%u)\n",
+ plane->base.id, plane->name,
+ state->src_w >> 16,
+ ((state->src_w & 0xffff) * 15625) >> 10,
+ state->src_h >> 16,
+ ((state->src_h & 0xffff) * 15625) >> 10,
+ state->src_x >> 16,
+ ((state->src_x & 0xffff) * 15625) >> 10,
+ state->src_y >> 16,
+ ((state->src_y & 0xffff) * 15625) >> 10,
+ fb->width, fb->height);
+ return -ENOSPC;
+ }
+
+ clips = __drm_plane_get_damage_clips(state);
+ num_clips = drm_plane_get_damage_clips_count(state);
+
+ /* Make sure damage clips are valid and inside the fb. */
+ while (num_clips > 0) {
+ if (clips->x1 >= clips->x2 ||
+ clips->y1 >= clips->y2 ||
+ clips->x1 < 0 ||
+ clips->y1 < 0 ||
+ clips->x2 > fb_width ||
+ clips->y2 > fb_height) {
+ drm_dbg_atomic(plane->dev,
+ "[PLANE:%d:%s] invalid damage clip %d %d %d %d\n",
+ plane->base.id, plane->name, clips->x1,
+ clips->y1, clips->x2, clips->y2);
+ return -EINVAL;
+ }
+ clips++;
+ num_clips--;
+ }
+
+ return 0;
+}
+
/**
* drm_atomic_plane_check - check plane state
* @old_plane_state: old plane state to check
@@ -605,9 +675,6 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
struct drm_plane *plane = new_plane_state->plane;
struct drm_crtc *crtc = new_plane_state->crtc;
const struct drm_framebuffer *fb = new_plane_state->fb;
- unsigned int fb_width, fb_height;
- struct drm_mode_rect *clips;
- uint32_t num_clips;
int ret;
/* either *both* CRTC and FB must be set, or neither */
@@ -634,17 +701,6 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
return -EINVAL;
}
- /* Check whether this plane supports the fb pixel format. */
- ret = drm_plane_check_pixel_format(plane, fb->format->format,
- fb->modifier);
- if (ret) {
- drm_dbg_atomic(plane->dev,
- "[PLANE:%d:%s] invalid pixel format %p4cc, modifier 0x%llx\n",
- plane->base.id, plane->name,
- &fb->format->format, fb->modifier);
- return ret;
- }
-
/* Give drivers some help against integer overflows */
if (new_plane_state->crtc_w > INT_MAX ||
new_plane_state->crtc_x > INT_MAX - (int32_t) new_plane_state->crtc_w ||
@@ -658,50 +714,10 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
return -ERANGE;
}
- fb_width = fb->width << 16;
- fb_height = fb->height << 16;
- /* Make sure source coordinates are inside the fb. */
- if (new_plane_state->src_w > fb_width ||
- new_plane_state->src_x > fb_width - new_plane_state->src_w ||
- new_plane_state->src_h > fb_height ||
- new_plane_state->src_y > fb_height - new_plane_state->src_h) {
- drm_dbg_atomic(plane->dev,
- "[PLANE:%d:%s] invalid source coordinates "
- "%u.%06ux%u.%06u+%u.%06u+%u.%06u (fb %ux%u)\n",
- plane->base.id, plane->name,
- new_plane_state->src_w >> 16,
- ((new_plane_state->src_w & 0xffff) * 15625) >> 10,
- new_plane_state->src_h >> 16,
- ((new_plane_state->src_h & 0xffff) * 15625) >> 10,
- new_plane_state->src_x >> 16,
- ((new_plane_state->src_x & 0xffff) * 15625) >> 10,
- new_plane_state->src_y >> 16,
- ((new_plane_state->src_y & 0xffff) * 15625) >> 10,
- fb->width, fb->height);
- return -ENOSPC;
- }
-
- clips = __drm_plane_get_damage_clips(new_plane_state);
- num_clips = drm_plane_get_damage_clips_count(new_plane_state);
-
- /* Make sure damage clips are valid and inside the fb. */
- while (num_clips > 0) {
- if (clips->x1 >= clips->x2 ||
- clips->y1 >= clips->y2 ||
- clips->x1 < 0 ||
- clips->y1 < 0 ||
- clips->x2 > fb_width ||
- clips->y2 > fb_height) {
- drm_dbg_atomic(plane->dev,
- "[PLANE:%d:%s] invalid damage clip %d %d %d %d\n",
- plane->base.id, plane->name, clips->x1,
- clips->y1, clips->x2, clips->y2);
- return -EINVAL;
- }
- clips++;
- num_clips--;
- }
+ ret = drm_atomic_plane_check_fb(new_plane_state);
+ if (ret)
+ return ret;
if (plane_switching_crtc(old_plane_state, new_plane_state)) {
drm_dbg_atomic(plane->dev,
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (5 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 06/10] drm/atomic: Move framebuffer checks to helper Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-11-30 4:06 ` Dmitry Baryshkov
2023-12-05 8:39 ` Maxime Ripard
2023-10-27 22:32 ` [PATCH RFC v7 08/10] drm/msm/dpu: Allow NULL FBs in atomic commit Jessica Zhang
` (3 subsequent siblings)
10 siblings, 2 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Jessica Zhang
Loosen the requirements for atomic and legacy commit so that, in cases
where pixel_source != FB, the commit can still go through.
This includes adding framebuffer NULL checks in other areas to account for
FB being NULL when non-FB pixel sources are enabled.
To disable a plane, the pixel_source must be NONE or the FB must be NULL
if pixel_source == FB.
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/drm_atomic.c | 21 ++++++++++----------
drivers/gpu/drm/drm_atomic_helper.c | 39 +++++++++++++++++++++----------------
include/drm/drm_atomic_helper.h | 4 ++--
include/drm/drm_plane.h | 29 +++++++++++++++++++++++++++
4 files changed, 64 insertions(+), 29 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 48a2df4e3d27..66e49c06aced 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -674,17 +674,16 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
{
struct drm_plane *plane = new_plane_state->plane;
struct drm_crtc *crtc = new_plane_state->crtc;
- const struct drm_framebuffer *fb = new_plane_state->fb;
int ret;
- /* either *both* CRTC and FB must be set, or neither */
- if (crtc && !fb) {
- drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] CRTC set but no FB\n",
+ /* either *both* CRTC and pixel source must be set, or neither */
+ if (crtc && !drm_plane_has_visible_data(new_plane_state)) {
+ drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] CRTC set but no visible data\n",
plane->base.id, plane->name);
return -EINVAL;
- } else if (fb && !crtc) {
- drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] FB set but no CRTC\n",
- plane->base.id, plane->name);
+ } else if (drm_plane_has_visible_data(new_plane_state) && !crtc) {
+ drm_dbg_atomic(plane->dev, "[PLANE:%d:%s] Source %d has visible data but no CRTC\n",
+ plane->base.id, plane->name, new_plane_state->pixel_source);
return -EINVAL;
}
@@ -715,9 +714,11 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
}
- ret = drm_atomic_plane_check_fb(new_plane_state);
- if (ret)
- return ret;
+ if (new_plane_state->pixel_source == DRM_PLANE_PIXEL_SOURCE_FB && new_plane_state->fb) {
+ ret = drm_atomic_plane_check_fb(new_plane_state);
+ if (ret)
+ return ret;
+ }
if (plane_switching_crtc(old_plane_state, new_plane_state)) {
drm_dbg_atomic(plane->dev,
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 292e38eb6218..27e8c8dd9324 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -852,7 +852,6 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
bool can_position,
bool can_update_disabled)
{
- struct drm_framebuffer *fb = plane_state->fb;
struct drm_rect *src = &plane_state->src;
struct drm_rect *dst = &plane_state->dst;
unsigned int rotation = plane_state->rotation;
@@ -864,7 +863,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
*src = drm_plane_state_src(plane_state);
*dst = drm_plane_state_dest(plane_state);
- if (!fb) {
+ if (!drm_plane_has_visible_data(plane_state)) {
plane_state->visible = false;
return 0;
}
@@ -881,25 +880,31 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
return -EINVAL;
}
- drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
+ /* Check that selected pixel source is valid */
+ if (plane_state->pixel_source == DRM_PLANE_PIXEL_SOURCE_FB && plane_state->fb) {
+ struct drm_framebuffer *fb = plane_state->fb;
+ drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
- /* Check scaling */
- hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
- vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
- if (hscale < 0 || vscale < 0) {
- drm_dbg_kms(plane_state->plane->dev,
- "Invalid scaling of plane\n");
- drm_rect_debug_print("src: ", &plane_state->src, true);
- drm_rect_debug_print("dst: ", &plane_state->dst, false);
- return -ERANGE;
- }
+ /* Check scaling */
+ hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
+ vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
- if (crtc_state->enable)
- drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
+ if (hscale < 0 || vscale < 0) {
+ drm_dbg_kms(plane_state->plane->dev,
+ "Invalid scaling of plane\n");
+ drm_rect_debug_print("src: ", &plane_state->src, true);
+ drm_rect_debug_print("dst: ", &plane_state->dst, false);
+ return -ERANGE;
+ }
- plane_state->visible = drm_rect_clip_scaled(src, dst, &clip);
+ if (crtc_state->enable)
+ drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
- drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
+ plane_state->visible = drm_rect_clip_scaled(src, dst, &clip);
+ drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
+ } else if (drm_plane_solid_fill_enabled(plane_state)) {
+ plane_state->visible = true;
+ }
if (!plane_state->visible)
/*
diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
index 536a0b0091c3..6d97f38ac1f6 100644
--- a/include/drm/drm_atomic_helper.h
+++ b/include/drm/drm_atomic_helper.h
@@ -256,8 +256,8 @@ drm_atomic_plane_disabling(struct drm_plane_state *old_plane_state,
* Anything else should be considered a bug in the atomic core, so we
* gently warn about it.
*/
- WARN_ON((new_plane_state->crtc == NULL && new_plane_state->fb != NULL) ||
- (new_plane_state->crtc != NULL && new_plane_state->fb == NULL));
+ WARN_ON((new_plane_state->crtc == NULL && drm_plane_has_visible_data(new_plane_state)) ||
+ (new_plane_state->crtc != NULL && !drm_plane_has_visible_data(new_plane_state)));
return old_plane_state->crtc && !new_plane_state->crtc;
}
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h
index 6171fb1a0b47..56b7a0acce74 100644
--- a/include/drm/drm_plane.h
+++ b/include/drm/drm_plane.h
@@ -992,6 +992,35 @@ static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
#define drm_for_each_plane(plane, dev) \
list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)
+/**
+ * drm_plane_solid_fill_enabled - Check if solid fill is enabled on plane
+ * @state: plane state
+ *
+ * Returns:
+ * Whether the plane has been assigned a solid_fill_blob
+ */
+static inline bool drm_plane_solid_fill_enabled(struct drm_plane_state *state)
+{
+ if (!state)
+ return false;
+ return state->pixel_source == DRM_PLANE_PIXEL_SOURCE_SOLID_FILL && state->solid_fill_blob;
+}
+
+static inline bool drm_plane_has_visible_data(const struct drm_plane_state *state)
+{
+ switch (state->pixel_source) {
+ case DRM_PLANE_PIXEL_SOURCE_NONE:
+ return false;
+ case DRM_PLANE_PIXEL_SOURCE_SOLID_FILL:
+ return state->solid_fill_blob != NULL;
+ case DRM_PLANE_PIXEL_SOURCE_FB:
+ default:
+ WARN_ON(state->pixel_source != DRM_PLANE_PIXEL_SOURCE_FB);
+ }
+
+ return state->fb != NULL;
+}
+
bool drm_any_plane_has_format(struct drm_device *dev,
u32 format, u64 modifier);
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks
2023-10-27 22:32 ` [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks Jessica Zhang
@ 2023-11-30 4:06 ` Dmitry Baryshkov
2023-12-05 8:39 ` Maxime Ripard
1 sibling, 0 replies; 21+ messages in thread
From: Dmitry Baryshkov @ 2023-11-30 4:06 UTC (permalink / raw)
To: Jessica Zhang
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Sean Paul,
Marijn Suijten, quic_abhinavk, ppaalanen, contact,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel
On Sat, 28 Oct 2023 at 01:33, Jessica Zhang <quic_jesszhan@quicinc.com> wrote:
>
> Loosen the requirements for atomic and legacy commit so that, in cases
> where pixel_source != FB, the commit can still go through.
>
> This includes adding framebuffer NULL checks in other areas to account for
> FB being NULL when non-FB pixel sources are enabled.
>
> To disable a plane, the pixel_source must be NONE or the FB must be NULL
> if pixel_source == FB.
>
> Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> drivers/gpu/drm/drm_atomic.c | 21 ++++++++++----------
> drivers/gpu/drm/drm_atomic_helper.c | 39 +++++++++++++++++++++----------------
> include/drm/drm_atomic_helper.h | 4 ++--
> include/drm/drm_plane.h | 29 +++++++++++++++++++++++++++
> 4 files changed, 64 insertions(+), 29 deletions(-)
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks
2023-10-27 22:32 ` [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks Jessica Zhang
2023-11-30 4:06 ` Dmitry Baryshkov
@ 2023-12-05 8:39 ` Maxime Ripard
1 sibling, 0 replies; 21+ messages in thread
From: Maxime Ripard @ 2023-12-05 8:39 UTC (permalink / raw)
To: Jessica Zhang
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Daniel Vetter, Rob Clark, Dmitry Baryshkov, Sean Paul,
Marijn Suijten, quic_abhinavk, ppaalanen, contact,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel
[-- Attachment #1: Type: text/plain, Size: 663 bytes --]
Hi,
On Fri, Oct 27, 2023 at 03:32:57PM -0700, Jessica Zhang wrote:
> Loosen the requirements for atomic and legacy commit so that, in cases
> where pixel_source != FB, the commit can still go through.
>
> This includes adding framebuffer NULL checks in other areas to account for
> FB being NULL when non-FB pixel sources are enabled.
>
> To disable a plane, the pixel_source must be NONE or the FB must be NULL
> if pixel_source == FB.
>
> Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
This breaks some plane kunit tests we have:
See https://lore.kernel.org/dri-devel/20231204173536.51003-1-naresh.kamboju@linaro.org/
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH RFC v7 08/10] drm/msm/dpu: Allow NULL FBs in atomic commit
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (6 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 07/10] drm/atomic: Loosen FB atomic checks Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:32 ` [PATCH RFC v7 09/10] drm/msm/dpu: Use DRM solid_fill property Jessica Zhang
` (2 subsequent siblings)
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Jessica Zhang
Since solid fill planes allow for a NULL framebuffer in a valid commit,
add NULL framebuffer checks to atomic commit calls within DPU.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 9 +++++++-
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 35 ++++++++++++++++++++-----------
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 3c475f8042b0..3b9648c679ad 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -451,6 +451,7 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
struct drm_plane_state *state;
struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
struct dpu_plane_state *pstate = NULL;
+ const struct msm_format *fmt;
struct dpu_format *format;
struct dpu_hw_ctl *ctl = mixer->lm_ctl;
@@ -470,7 +471,13 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,
pstate = to_dpu_plane_state(state);
fb = state->fb;
- format = to_dpu_format(msm_framebuffer_format(pstate->base.fb));
+ if (drm_plane_solid_fill_enabled(state))
+ fmt = dpu_get_msm_format(&_dpu_crtc_get_kms(crtc)->base,
+ DRM_FORMAT_ABGR8888, 0);
+ else
+ fmt = msm_framebuffer_format(pstate->base.fb);
+
+ format = to_dpu_format(fmt);
if (pstate->stage == DPU_STAGE_BASE && format->alpha_enable)
bg_alpha_enable = true;
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 3eef5e025e12..9615653db787 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -55,6 +55,8 @@
#define DEFAULT_REFRESH_RATE 60
+#define DPU_SOLID_FILL_FORMAT DRM_FORMAT_ABGR8888
+
static const uint32_t qcom_compressed_supported_formats[] = {
DRM_FORMAT_ABGR8888,
DRM_FORMAT_ARGB8888,
@@ -658,7 +660,7 @@ static void _dpu_plane_color_fill(struct dpu_plane *pdpu,
* select fill format to match user property expectation,
* h/w only supports RGB variants
*/
- fmt = dpu_get_dpu_format(DRM_FORMAT_ABGR8888);
+ fmt = dpu_get_dpu_format(DPU_SOLID_FILL_FORMAT);
/* should not happen ever */
if (!fmt)
return;
@@ -877,18 +879,23 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
pipe_cfg->dst_rect = new_plane_state->dst;
- fb_rect.x2 = new_plane_state->fb->width;
- fb_rect.y2 = new_plane_state->fb->height;
+ if (new_plane_state->pixel_source == DRM_PLANE_PIXEL_SOURCE_FB && new_plane_state->fb) {
+ fb_rect.x2 = new_plane_state->fb->width;
+ fb_rect.y2 = new_plane_state->fb->height;
- /* Ensure fb size is supported */
- if (drm_rect_width(&fb_rect) > MAX_IMG_WIDTH ||
- drm_rect_height(&fb_rect) > MAX_IMG_HEIGHT) {
- DPU_DEBUG_PLANE(pdpu, "invalid framebuffer " DRM_RECT_FMT "\n",
- DRM_RECT_ARG(&fb_rect));
- return -E2BIG;
+ /* Ensure fb size is supported */
+ if (drm_rect_width(&fb_rect) > MAX_IMG_WIDTH ||
+ drm_rect_height(&fb_rect) > MAX_IMG_HEIGHT) {
+ DPU_DEBUG_PLANE(pdpu, "invalid framebuffer " DRM_RECT_FMT "\n",
+ DRM_RECT_ARG(&fb_rect));
+ return -E2BIG;
+ }
}
- fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb));
+ if (drm_plane_solid_fill_enabled(new_plane_state))
+ fmt = dpu_get_dpu_format(DPU_SOLID_FILL_FORMAT);
+ else
+ fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb));
max_linewidth = pdpu->catalog->caps->max_linewidth;
@@ -1123,8 +1130,7 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)
struct drm_crtc *crtc = state->crtc;
struct drm_framebuffer *fb = state->fb;
bool is_rt_pipe;
- const struct dpu_format *fmt =
- to_dpu_format(msm_framebuffer_format(fb));
+ const struct dpu_format *fmt;
struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg;
struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg;
struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base);
@@ -1133,6 +1139,11 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)
bool layout_valid = false;
int ret;
+ if (drm_plane_solid_fill_enabled(state))
+ return;
+
+ fmt = to_dpu_format(msm_framebuffer_format(fb));
+
ret = dpu_format_populate_layout(aspace, fb, &layout);
if (ret)
DPU_ERROR_PLANE(pdpu, "failed to get format layout, %d\n", ret);
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 09/10] drm/msm/dpu: Use DRM solid_fill property
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (7 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 08/10] drm/msm/dpu: Allow NULL FBs in atomic commit Jessica Zhang
@ 2023-10-27 22:32 ` Jessica Zhang
2023-10-27 22:33 ` [PATCH RFC v7 10/10] drm/msm/dpu: Add solid fill and pixel source properties Jessica Zhang
2023-12-02 21:41 ` (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes Dmitry Baryshkov
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:32 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Jessica Zhang
Drop DPU_PLANE_COLOR_FILL_FLAG and check the DRM solid_fill property to
determine if the plane is solid fill. In addition drop the DPU plane
color_fill field as we can now use drm_plane_state.solid_fill instead,
and pass in drm_plane_state.alpha to _dpu_plane_color_fill_pipe() to
allow userspace to configure the alpha value for the solid fill color.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 38 ++++++++++++++++++++-----------
1 file changed, 25 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 9615653db787..832747080daf 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -42,7 +42,6 @@
#define SHARP_SMOOTH_THR_DEFAULT 8
#define SHARP_NOISE_THR_DEFAULT 2
-#define DPU_PLANE_COLOR_FILL_FLAG BIT(31)
#define DPU_ZPOS_MAX 255
/*
@@ -84,7 +83,6 @@ struct dpu_plane {
enum dpu_sspp pipe;
- uint32_t color_fill;
bool is_error;
bool is_rt_pipe;
const struct dpu_mdss_cfg *catalog;
@@ -640,19 +638,34 @@ static void _dpu_plane_color_fill_pipe(struct dpu_plane_state *pstate,
_dpu_plane_setup_scaler(pipe, fmt, true, &pipe_cfg, pstate->rotation);
}
+static uint32_t _dpu_plane_get_abgr_fill_color(struct drm_plane_state *state)
+{
+ struct drm_solid_fill solid_fill = state->solid_fill;
+
+ uint32_t ret = 0;
+ uint8_t a = state->alpha & 0xFF;
+ uint8_t b = solid_fill.b >> 24;
+ uint8_t g = solid_fill.g >> 24;
+ uint8_t r = solid_fill.r >> 24;
+
+ ret |= a << 24;
+ ret |= b << 16;
+ ret |= g << 8;
+ ret |= r;
+
+ return ret;
+}
+
/**
* _dpu_plane_color_fill - enables color fill on plane
* @pdpu: Pointer to DPU plane object
* @color: RGB fill color value, [23..16] Blue, [15..8] Green, [7..0] Red
- * @alpha: 8-bit fill alpha value, 255 selects 100% alpha
*/
-static void _dpu_plane_color_fill(struct dpu_plane *pdpu,
- uint32_t color, uint32_t alpha)
+static void _dpu_plane_color_fill(struct dpu_plane *pdpu, uint32_t color)
{
const struct dpu_format *fmt;
const struct drm_plane *plane = &pdpu->base;
struct dpu_plane_state *pstate = to_dpu_plane_state(plane->state);
- u32 fill_color = (color & 0xFFFFFF) | ((alpha & 0xFF) << 24);
DPU_DEBUG_PLANE(pdpu, "\n");
@@ -667,11 +680,11 @@ static void _dpu_plane_color_fill(struct dpu_plane *pdpu,
/* update sspp */
_dpu_plane_color_fill_pipe(pstate, &pstate->pipe, &pstate->pipe_cfg.dst_rect,
- fill_color, fmt);
+ color, fmt);
if (pstate->r_pipe.sspp)
_dpu_plane_color_fill_pipe(pstate, &pstate->r_pipe, &pstate->r_pipe_cfg.dst_rect,
- fill_color, fmt);
+ color, fmt);
}
static int dpu_plane_prepare_fb(struct drm_plane *plane,
@@ -1019,10 +1032,9 @@ void dpu_plane_flush(struct drm_plane *plane)
*/
if (pdpu->is_error)
/* force white frame with 100% alpha pipe output on error */
- _dpu_plane_color_fill(pdpu, 0xFFFFFF, 0xFF);
- else if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG)
- /* force 100% alpha */
- _dpu_plane_color_fill(pdpu, pdpu->color_fill, 0xFF);
+ _dpu_plane_color_fill(pdpu, 0xFFFFFFFF);
+ else if (drm_plane_solid_fill_enabled(plane->state))
+ _dpu_plane_color_fill(pdpu, _dpu_plane_get_abgr_fill_color(plane->state));
else {
dpu_plane_flush_csc(pdpu, &pstate->pipe);
dpu_plane_flush_csc(pdpu, &pstate->r_pipe);
@@ -1067,7 +1079,7 @@ static void dpu_plane_sspp_update_pipe(struct drm_plane *plane,
}
/* override for color fill */
- if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) {
+ if (drm_plane_solid_fill_enabled(plane->state)) {
_dpu_plane_set_qos_ctrl(plane, pipe, false);
/* skip remaining processing on color fill */
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH RFC v7 10/10] drm/msm/dpu: Add solid fill and pixel source properties
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (8 preceding siblings ...)
2023-10-27 22:32 ` [PATCH RFC v7 09/10] drm/msm/dpu: Use DRM solid_fill property Jessica Zhang
@ 2023-10-27 22:33 ` Jessica Zhang
2023-12-02 21:41 ` (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes Dmitry Baryshkov
10 siblings, 0 replies; 21+ messages in thread
From: Jessica Zhang @ 2023-10-27 22:33 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Dmitry Baryshkov,
Sean Paul, Marijn Suijten
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Jessica Zhang
Add solid_fill and pixel_source properties to DPU plane
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index 832747080daf..8e9fda541211 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -1493,6 +1493,8 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,
DPU_ERROR("failed to install zpos property, rc = %d\n", ret);
drm_plane_create_alpha_property(plane);
+ drm_plane_create_solid_fill_property(plane);
+ drm_plane_create_pixel_source_property(plane, BIT(DRM_PLANE_PIXEL_SOURCE_SOLID_FILL));
drm_plane_create_blend_mode_property(plane,
BIT(DRM_MODE_BLEND_PIXEL_NONE) |
BIT(DRM_MODE_BLEND_PREMULTI) |
--
2.42.0
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-10-27 22:32 [PATCH RFC v7 00/10] Support for Solid Fill Planes Jessica Zhang
` (9 preceding siblings ...)
2023-10-27 22:33 ` [PATCH RFC v7 10/10] drm/msm/dpu: Add solid fill and pixel source properties Jessica Zhang
@ 2023-12-02 21:41 ` Dmitry Baryshkov
2023-12-03 12:15 ` Simon Ser
10 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2023-12-02 21:41 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Sean Paul,
Marijn Suijten, Jessica Zhang
Cc: quic_abhinavk, ppaalanen, contact, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Pekka Paalanen,
Harry Wentland, Sebastian Wick
On Fri, 27 Oct 2023 15:32:50 -0700, Jessica Zhang wrote:
> Some drivers support hardware that have optimizations for solid fill
> planes. This series aims to expose these capabilities to userspace as
> some compositors have a solid fill flag (ex. SOLID_COLOR in the Android
> hardware composer HAL) that can be set by apps like the Android Gears
> test app.
>
> In order to expose this capability to userspace, this series will:
>
> [...]
Applied to drm-misc-next, thanks!
[01/10] drm: Introduce pixel_source DRM plane property
commit: e50e5fed41c7eed2db4119645bf3480ec43fec11
[02/10] drm: Introduce solid fill DRM plane property
commit: 85863a4e16e77079ee14865905ddc3ef9483a640
[03/10] drm: Add solid fill pixel source
commit: 4b64167042927531f4cfaf035b8f88c2f7a05f06
[04/10] drm/atomic: Add pixel source to plane state dump
commit: 8283ac7871a959848e09fc6593b8c12b8febfee6
[05/10] drm/atomic: Add solid fill data to plane state dump
commit: e86413f5442ee094e66b3e75f2d3419ed0df9520
[06/10] drm/atomic: Move framebuffer checks to helper
commit: 4ba6b7a646321e740c7f2d80c90505019c4e8fce
[07/10] drm/atomic: Loosen FB atomic checks
commit: f1e75da5364e780905d9cd6043f9c74cdcf84073
Best regards,
--
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-12-02 21:41 ` (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes Dmitry Baryshkov
@ 2023-12-03 12:15 ` Simon Ser
2023-12-03 18:10 ` Dmitry Baryshkov
2023-12-04 17:51 ` Abhinav Kumar
0 siblings, 2 replies; 21+ messages in thread
From: Simon Ser @ 2023-12-03 12:15 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Sean Paul,
Marijn Suijten, Jessica Zhang, quic_abhinavk, ppaalanen,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel,
Pekka Paalanen, Harry Wentland, Sebastian Wick
On Saturday, December 2nd, 2023 at 22:41, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote:
> On Fri, 27 Oct 2023 15:32:50 -0700, Jessica Zhang wrote:
>
> > Some drivers support hardware that have optimizations for solid fill
> > planes. This series aims to expose these capabilities to userspace as
> > some compositors have a solid fill flag (ex. SOLID_COLOR in the Android
> > hardware composer HAL) that can be set by apps like the Android Gears
> > test app.
> >
> > In order to expose this capability to userspace, this series will:
> >
> > [...]
>
>
> Applied to drm-misc-next, thanks!
Where are the IGT and userspace for this uAPI addition?
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-12-03 12:15 ` Simon Ser
@ 2023-12-03 18:10 ` Dmitry Baryshkov
2023-12-04 9:00 ` Maxime Ripard
2023-12-04 17:51 ` Abhinav Kumar
1 sibling, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2023-12-03 18:10 UTC (permalink / raw)
To: Simon Ser
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Sean Paul,
Marijn Suijten, Jessica Zhang, quic_abhinavk, ppaalanen,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel,
Pekka Paalanen, Harry Wentland, Sebastian Wick
On Sun, 3 Dec 2023 at 14:15, Simon Ser <contact@emersion.fr> wrote:
>
> On Saturday, December 2nd, 2023 at 22:41, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote:
>
> > On Fri, 27 Oct 2023 15:32:50 -0700, Jessica Zhang wrote:
> >
> > > Some drivers support hardware that have optimizations for solid fill
> > > planes. This series aims to expose these capabilities to userspace as
> > > some compositors have a solid fill flag (ex. SOLID_COLOR in the Android
> > > hardware composer HAL) that can be set by apps like the Android Gears
> > > test app.
> > >
> > > In order to expose this capability to userspace, this series will:
> > >
> > > [...]
> >
> >
> > Applied to drm-misc-next, thanks!
>
> Where are the IGT and userspace for this uAPI addition?
Indeed. I checked that there are uABI acks/reviews, but I didn't check
these requirements. Frankly speaking, I thought that they were handled
already, before giving the ack. How should we proceed? Should I land a
revert?
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-12-03 18:10 ` Dmitry Baryshkov
@ 2023-12-04 9:00 ` Maxime Ripard
0 siblings, 0 replies; 21+ messages in thread
From: Maxime Ripard @ 2023-12-04 9:00 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Simon Ser, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Daniel Vetter, Rob Clark, Sean Paul, Marijn Suijten,
Jessica Zhang, quic_abhinavk, ppaalanen, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Pekka Paalanen,
Harry Wentland, Sebastian Wick
[-- Attachment #1: Type: text/plain, Size: 1140 bytes --]
On Sun, Dec 03, 2023 at 08:10:31PM +0200, Dmitry Baryshkov wrote:
> On Sun, 3 Dec 2023 at 14:15, Simon Ser <contact@emersion.fr> wrote:
> >
> > On Saturday, December 2nd, 2023 at 22:41, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote:
> >
> > > On Fri, 27 Oct 2023 15:32:50 -0700, Jessica Zhang wrote:
> > >
> > > > Some drivers support hardware that have optimizations for solid fill
> > > > planes. This series aims to expose these capabilities to userspace as
> > > > some compositors have a solid fill flag (ex. SOLID_COLOR in the Android
> > > > hardware composer HAL) that can be set by apps like the Android Gears
> > > > test app.
> > > >
> > > > In order to expose this capability to userspace, this series will:
> > > >
> > > > [...]
> > >
> > >
> > > Applied to drm-misc-next, thanks!
> >
> > Where are the IGT and userspace for this uAPI addition?
>
> Indeed. I checked that there are uABI acks/reviews, but I didn't check
> these requirements. Frankly speaking, I thought that they were handled
> already, before giving the ack. How should we proceed? Should I land a
> revert?
Yes
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-12-03 12:15 ` Simon Ser
2023-12-03 18:10 ` Dmitry Baryshkov
@ 2023-12-04 17:51 ` Abhinav Kumar
2023-12-04 17:57 ` Simon Ser
1 sibling, 1 reply; 21+ messages in thread
From: Abhinav Kumar @ 2023-12-04 17:51 UTC (permalink / raw)
To: Simon Ser, Dmitry Baryshkov
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Daniel Vetter, Rob Clark, Sean Paul,
Marijn Suijten, Jessica Zhang, ppaalanen, laurent.pinchart,
sebastian.wick, ville.syrjala, dri-devel, linux-kernel,
linux-arm-msm, freedreno, wayland-devel, Pekka Paalanen,
Harry Wentland, Sebastian Wick
Hi Simon
On 12/3/2023 4:15 AM, Simon Ser wrote:
> On Saturday, December 2nd, 2023 at 22:41, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote:
>
>> On Fri, 27 Oct 2023 15:32:50 -0700, Jessica Zhang wrote:
>>
>>> Some drivers support hardware that have optimizations for solid fill
>>> planes. This series aims to expose these capabilities to userspace as
>>> some compositors have a solid fill flag (ex. SOLID_COLOR in the Android
>>> hardware composer HAL) that can be set by apps like the Android Gears
>>> test app.
>>>
>>> In order to expose this capability to userspace, this series will:
>>>
>>> [...]
>>
>>
>> Applied to drm-misc-next, thanks!
>
> Where are the IGT and userspace for this uAPI addition?
Yes, we made IGT changes to test and validate this. We will post them on
the IGT dev list shortly and CC you.
We do not have a compositor change yet for this as we primarily used IGT
to validate this.
Can we re-try to land this once IGT changes are accepted?
Thanks
Abhinav
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-12-04 17:51 ` Abhinav Kumar
@ 2023-12-04 17:57 ` Simon Ser
2023-12-04 17:58 ` Abhinav Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Simon Ser @ 2023-12-04 17:57 UTC (permalink / raw)
To: Abhinav Kumar
Cc: Dmitry Baryshkov, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Daniel Vetter, Rob Clark,
Sean Paul, Marijn Suijten, Jessica Zhang, ppaalanen,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel,
Pekka Paalanen, Harry Wentland, Sebastian Wick
On Monday, December 4th, 2023 at 18:51, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
> > Where are the IGT and userspace for this uAPI addition?
>
> Yes, we made IGT changes to test and validate this. We will post them on
> the IGT dev list shortly and CC you.
>
> We do not have a compositor change yet for this as we primarily used IGT
> to validate this.
Yes, please post the IGT.
> Can we re-try to land this once IGT changes are accepted?
There will need to be a user-space implementation as well, since this is
a hard requirement for new uAPI [1]. Maybe I'll give this a go if I have
time.
[1]: https://dri.freedesktop.org/docs/drm/gpu/drm-uapi.html#open-source-userspace-requirements
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: (subset) [PATCH RFC v7 00/10] Support for Solid Fill Planes
2023-12-04 17:57 ` Simon Ser
@ 2023-12-04 17:58 ` Abhinav Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Abhinav Kumar @ 2023-12-04 17:58 UTC (permalink / raw)
To: Simon Ser
Cc: Dmitry Baryshkov, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Daniel Vetter, Rob Clark,
Sean Paul, Marijn Suijten, Jessica Zhang, ppaalanen,
laurent.pinchart, sebastian.wick, ville.syrjala, dri-devel,
linux-kernel, linux-arm-msm, freedreno, wayland-devel,
Pekka Paalanen, Harry Wentland, Sebastian Wick
On 12/4/2023 9:57 AM, Simon Ser wrote:
> On Monday, December 4th, 2023 at 18:51, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
>
>>> Where are the IGT and userspace for this uAPI addition?
>>
>> Yes, we made IGT changes to test and validate this. We will post them on
>> the IGT dev list shortly and CC you.
>>
>> We do not have a compositor change yet for this as we primarily used IGT
>> to validate this.
>
> Yes, please post the IGT.
>
>> Can we re-try to land this once IGT changes are accepted?
>
> There will need to be a user-space implementation as well, since this is
> a hard requirement for new uAPI [1]. Maybe I'll give this a go if I have
> time.
>
Much appreciated.
> [1]: https://dri.freedesktop.org/docs/drm/gpu/drm-uapi.html#open-source-userspace-requirements
^ permalink raw reply [flat|nested] 21+ messages in thread