On Mon, Jun 07, 2021 at 08:46:47AM +0200, Werner Sembach wrote: > > Am 04.06.21 um 19:26 schrieb Ville Syrjälä: > > On Fri, Jun 04, 2021 at 07:17:21PM +0200, Werner Sembach wrote: > >> Add a new general drm property "active bpc" which can be used by graphic drivers > >> to report the applied bit depth per pixel back to userspace. > >> > >> While "max bpc" can be used to change the color depth, there was no way to check > >> which one actually got used. While in theory the driver chooses the best/highest > >> color depth within the max bpc setting a user might not be fully aware what his > >> hardware is or isn't capable off. This is meant as a quick way to double check > >> the setup. > >> > >> In the future, automatic color calibration for screens might also depend on this > >> information available. > >> > >> Signed-off-by: Werner Sembach <wse@xxxxxxxxxxxxxxxxxxx> > >> --- > >> drivers/gpu/drm/drm_atomic_uapi.c | 2 ++ > >> drivers/gpu/drm/drm_connector.c | 40 +++++++++++++++++++++++++++++++ > >> include/drm/drm_connector.h | 15 ++++++++++++ > >> 3 files changed, 57 insertions(+) > >> > >> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c > >> index 268bb69c2e2f..7ae4e40936b5 100644 > >> --- a/drivers/gpu/drm/drm_atomic_uapi.c > >> +++ b/drivers/gpu/drm/drm_atomic_uapi.c > >> @@ -873,6 +873,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, > >> *val = 0; > >> } else if (property == connector->max_bpc_property) { > >> *val = state->max_requested_bpc; > >> + } else if (property == connector->active_bpc_property) { > >> + *val = state->active_bpc; > >> } else if (connector->funcs->atomic_get_property) { > >> return connector->funcs->atomic_get_property(connector, > >> state, property, val); > >> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > >> index 7631f76e7f34..5f42a5be5822 100644 > >> --- a/drivers/gpu/drm/drm_connector.c > >> +++ b/drivers/gpu/drm/drm_connector.c > >> @@ -1195,6 +1195,13 @@ static const struct drm_prop_enum_list dp_colorspaces[] = { > >> * drm_connector_attach_max_bpc_property() to create and attach the > >> * property to the connector during initialization. > >> * > >> + * active bpc: > >> + * This read-only range property is used by userspace check the bit depth > >> + * actually applied by the GPU driver after evaluation all hardware > >> + * capabilities and max bpc. Drivers to use the function > >> + * drm_connector_attach_active_bpc_property() to create and attach the > >> + * property to the connector during initialization. > >> + * > >> * Connectors also have one standardized atomic property: > >> * > >> * CRTC_ID: > >> @@ -2150,6 +2157,39 @@ int drm_connector_attach_max_bpc_property(struct drm_connector *connector, > >> } > >> EXPORT_SYMBOL(drm_connector_attach_max_bpc_property); > >> > >> +/** > >> + * drm_connector_attach_active_bpc_property - attach "active bpc" property > >> + * @connector: connector to attach active bpc property on. > >> + * @min: The minimum bit depth supported by the connector. > >> + * @max: The maximum bit depth supported by the connector. > >> + * > >> + * This is used to check the applied bit depth on a connector. > >> + * > >> + * Returns: > >> + * Zero on success, negative errno on failure. > >> + */ > >> +int drm_connector_attach_active_bpc_property(struct drm_connector *connector, > >> + int min, int max) > >> +{ > >> + struct drm_device *dev = connector->dev; > >> + struct drm_property *prop; > >> + > >> + prop = connector->active_bpc_property; > >> + if (!prop) { > >> + prop = drm_property_create_range(dev, 0, "active bpc", min, max); > > Should be immutable. > Yes. I didn't know if there is a way to do this (or just don't define a > set-function), but I think I found the define for this. > > > > Also wondering what the semantics of this should be when eg. DSC > > is active? > I'm unfamiliar how the inner workings of DSC (I guess Display Stream > Compression?) are. But doesn't it also have color depth? Some number of bits go into the compressor, smaller/equal number of bits come out. Not sure if the choice of the input bpc affects what the sink does when decompressing or not. > > The active bpc should be what the GPU tells the display to actually show > the user when he looks at just one pixel. > > So dithering computed on the host should not be included (aka when the > gpu sends a premade picture to the screen and tells it the lesser pbc), > while FRC dithering computed in the display firmware should be included > (since the GPU can't really tell the difference between FRC displays and > True 10-Bit displays, can't it?) Not sure. Haven't checked if there's something in some standard for that. -- Ville Syrjälä Intel