Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp3430072lqp; Tue, 26 Mar 2024 08:58:28 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUQou8aHtWpX0myYEWa31hXN5grdGgtbG5Cu52pDBzpmhGuu7wvIXwTIExKI0+G7VN0GsWPiAUEsuJfzzCbxknBvXRwkxxY9HW0VvNUcQ== X-Google-Smtp-Source: AGHT+IFmThZhzFpkG5rE9qz+cjuZvs8+cw6i8bY6QbZgbsIY9BTkzSFjH4bdYxL37kl1FXG0xDcY X-Received: by 2002:ac2:491d:0:b0:515:b595:27e3 with SMTP id n29-20020ac2491d000000b00515b59527e3mr1294412lfi.61.1711468708116; Tue, 26 Mar 2024 08:58:28 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711468708; cv=pass; d=google.com; s=arc-20160816; b=cBZrS9gqJFfuJbxSW1VZeT3QEfoJ3q5IYEnG0QtUr2mV62HA1lQvj3s5i4w1LR2il6 cFPcBXIVk86Q6TvCPdJHubQTNduWFYh8QNfZ9I8vO1cS8LTU35B19+mpczmZoEUNzsJ5 9XH7fd8Oxg2xmWC+7fvWe4EAJiqB1GN+k++a0JdE2IzfIDMbPDrKI+xGOAi8qPk8hQ3Q qOV6ArnTzF06xJbrKKqnsk/Z9mha8OsmAGXDj/O65TTipFORF9W4RKPaOswjEmV44yY+ KByW/WqODbl+CvSKqpxHamq4GsFs8KJJFJsw5ONSy6A2/HyJ38iFFvdC2SigRISHlpwM 4fxg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:mail-followup-to:message-id:subject:cc:to:from:date :dkim-signature; bh=8ySP+32Xi+ieNusqglEznhxyxCYILkrvd1cThtfLygM=; fh=cwUBeHQ3ezus3RwQuH9AHNS4lDJrjXpRlC9h9x2ursM=; b=SR+pUlFoLhC/QKNnuTJNDDy/Wcw43WSaqLZgkX6EbeaoIVq/t0klarHft5ZS+WSbK9 0Yo2XyN7xKnkMiUFr4TYzjfs8wngQtmmIOChiTEuclpsAFOGgzWvxZ/xXaJBaqVLvCjT gw6X+EkFVMRW90RVfKSYnBseD16m93A1Hf4H0qQxIEYKCmIibtmvxau/1HdQXLVO4TEm Fx5UN0yVy2FIhVd+/jgk0gjxYQ0Qx7wpiCurVoQujSxBeD52o7JnVLNURktmutKzbA4w 0F1fss1LrQ1yRtZ4Eycji6EBRZa6jyar/qaRvk2983PG2H/b+LPkEI0SAs2PoN5/Pu5D U9kw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@bootlin.com header.s=gm1 header.b=PMDn71Rc; arc=pass (i=1 spf=pass spfdomain=bootlin.com dkim=pass dkdomain=bootlin.com dmarc=pass fromdomain=bootlin.com); spf=pass (google.com: domain of linux-kernel+bounces-119398-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-119398-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bootlin.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id hp15-20020a1709073e0f00b00a4a3cad3515si1728523ejc.262.2024.03.26.08.58.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Mar 2024 08:58:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-119398-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@bootlin.com header.s=gm1 header.b=PMDn71Rc; arc=pass (i=1 spf=pass spfdomain=bootlin.com dkim=pass dkdomain=bootlin.com dmarc=pass fromdomain=bootlin.com); spf=pass (google.com: domain of linux-kernel+bounces-119398-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-119398-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bootlin.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id DCE8F1F8032E for ; Tue, 26 Mar 2024 15:57:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9FBBE13C90F; Tue, 26 Mar 2024 15:57:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="PMDn71Rc" Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6351213C804 for ; Tue, 26 Mar 2024 15:57:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.197 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711468625; cv=none; b=memNbDmM5F/hJle0uSjEAYWYNSZn3AgZKcfWK2M1qJPjA/AwVkK/PEQpQMBNWJAEbrpUw/DUBKo5HbjOzSvgeXl2ECQeg91LkU1eCZSTK9C5mNptFXQ7BwL2V3OV8FMVJII7NX3u/KImr9RQnHcwLq8aKCxV6h5MJ1QiWt/KAeQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711468625; c=relaxed/simple; bh=FchUo7W1+Wn4/KFTRc6JqAxyssykeOiu2l8JIaP5Dkg=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=EzjOPFny8qKHNK4gLVHMfq17ekKnkJboW91z957IqDcyUYLF/oJV/G29V0uwV1V+JEOGPj7RJ7+4g0EVdGBNKaaSaXnT0A9ug9zG99VnG9+9ahj65KHXMh0QaQ2urnkH+cT2Fwbi0EEoacx3VDvo7YYas63tldFbnWQ7Rz83WNM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=PMDn71Rc; arc=none smtp.client-ip=217.70.183.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id C203B1C0009; Tue, 26 Mar 2024 15:56:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1711468620; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8ySP+32Xi+ieNusqglEznhxyxCYILkrvd1cThtfLygM=; b=PMDn71RcT9iZv7ihEn5hyCDHHP0te7tWVzNDg5eV/Q3+XarjmJQMnqDdQfs0oyk8P8XKmn rHfbcQW/KTeRWeO1HHm6qmX8dJdKdsgtiUjlvfJbUwmwKSvz6GOSiKyxXedSJ69W6jcw03 mvoTHK0Hjl7BjNuS2lir/r45YDr/Hz8RnWPh5TTORH9CcoQGAW3xk1MORdpaEdSfEYsjeT rTt4tPrgq1YIVBWlPMSqafNW20CUA4meDN5ePyeyJbnsX4E6iXWrtizD6XIsdNt3s6/JWM YuHWTtnMeIRzRdZnKhODqPUgmjG7g4+qzLpzeICDLz/Yh5je/5bzqDszmnMChQ== Date: Tue, 26 Mar 2024 16:56:56 +0100 From: Louis Chauvet To: =?iso-8859-1?Q?Ma=EDra?= Canal Cc: Rodrigo Siqueira , Melissa Wen , Haneen Mohammed , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , arthurgrillo@riseup.net, Jonathan Corbet , pekka.paalanen@haloniitty.fi, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, jeremie.dautheribes@bootlin.com, miquel.raynal@bootlin.com, thomas.petazzoni@bootlin.com, seanpaul@google.com, marcheu@google.com, nicolejadeyee@google.com Subject: Re: [PATCH v5 03/16] drm/vkms: write/update the documentation for pixel conversion and pixel write functions Message-ID: Mail-Followup-To: =?iso-8859-1?Q?Ma=EDra?= Canal , Rodrigo Siqueira , Melissa Wen , Haneen Mohammed , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , arthurgrillo@riseup.net, Jonathan Corbet , pekka.paalanen@haloniitty.fi, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, jeremie.dautheribes@bootlin.com, miquel.raynal@bootlin.com, thomas.petazzoni@bootlin.com, seanpaul@google.com, marcheu@google.com, nicolejadeyee@google.com References: <20240313-yuv-v5-0-e610cbd03f52@bootlin.com> <20240313-yuv-v5-3-e610cbd03f52@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-GND-Sasl: louis.chauvet@bootlin.com Le 25/03/24 - 10:32, Ma?ra Canal a ?crit : > On 3/13/24 14:44, Louis Chauvet wrote: > > Add some documentation on pixel conversion functions. > > Update of outdated comments for pixel_write functions. > > > > Signed-off-by: Louis Chauvet > > --- > > drivers/gpu/drm/vkms/vkms_composer.c | 7 ++++ > > drivers/gpu/drm/vkms/vkms_drv.h | 13 ++++++++ > > drivers/gpu/drm/vkms/vkms_formats.c | 62 ++++++++++++++++++++++++++++++------ > > 3 files changed, 73 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c > > index c6d9b4a65809..da0651a94c9b 100644 > > --- a/drivers/gpu/drm/vkms/vkms_composer.c > > +++ b/drivers/gpu/drm/vkms/vkms_composer.c > > @@ -189,6 +189,13 @@ static void blend(struct vkms_writeback_job *wb, > > > > size_t crtc_y_limit = crtc_state->base.crtc->mode.vdisplay; > > > > + /* > > + * The planes are composed line-by-line to avoid heavy memory usage. It is a necessary > > + * complexity to avoid poor blending performance. > > + * > > + * The function vkms_compose_row is used to read a line, pixel-by-pixel, into the staging > > + * buffer. > > + */ > > for (size_t y = 0; y < crtc_y_limit; y++) { > > fill_background(&background_color, output_buffer); > > > > diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h > > index b4b357447292..18086423a3a7 100644 > > --- a/drivers/gpu/drm/vkms/vkms_drv.h > > +++ b/drivers/gpu/drm/vkms/vkms_drv.h > > @@ -25,6 +25,17 @@ > > > > #define VKMS_LUT_SIZE 256 > > > > +/** > > + * struct vkms_frame_info - structure to store the state of a frame > > + * > > + * @fb: backing drm framebuffer > > + * @src: source rectangle of this frame in the source framebuffer > > + * @dst: destination rectangle in the crtc buffer > > + * @map: see drm_shadow_plane_state@data > > + * @rotation: rotation applied to the source. > > + * > > + * @src and @dst should have the same size modulo the rotation. > > + */ > > struct vkms_frame_info { > > struct drm_framebuffer *fb; > > struct drm_rect src, dst; > > @@ -52,6 +63,8 @@ struct vkms_writeback_job { > > * vkms_plane_state - Driver specific plane state > > It should be "* struct vkms_plane_state - Driver specific plane state". Fixed in v6. > > * @base: base plane state > > * @frame_info: data required for composing computation > > + * @pixel_read: function to read a pixel in this plane. The creator of a vkms_plane_state must > > + * ensure that this pointer is valid > > */ > > struct vkms_plane_state { > > struct drm_shadow_plane_state base; > > diff --git a/drivers/gpu/drm/vkms/vkms_formats.c b/drivers/gpu/drm/vkms/vkms_formats.c > > index 172830a3936a..6e3dc8682ff9 100644 > > --- a/drivers/gpu/drm/vkms/vkms_formats.c > > +++ b/drivers/gpu/drm/vkms/vkms_formats.c > > @@ -9,6 +9,18 @@ > > > > #include "vkms_formats.h" > > > > +/** > > + * pixel_offset() - Get the offset of the pixel at coordinates x/y in the first plane > > + * > > + * @frame_info: Buffer metadata > > + * @x: The x coordinate of the wanted pixel in the buffer > > + * @y: The y coordinate of the wanted pixel in the buffer > > + * > > + * The caller must ensure that the framebuffer associated with this request uses a pixel format > > + * where block_h == block_w == 1. > > + * If this requirement is not fulfilled, the resulting offset can point to an other pixel or > > + * outside of the buffer. > > + */ > > static size_t pixel_offset(const struct vkms_frame_info *frame_info, int x, int y) > > { > > struct drm_framebuffer *fb = frame_info->fb; > > @@ -17,18 +29,22 @@ static size_t pixel_offset(const struct vkms_frame_info *frame_info, int x, int > > + (x * fb->format->cpp[0]); > > } > > > > -/* > > - * packed_pixels_addr - Get the pointer to pixel of a given pair of coordinates > > +/** > > + * packed_pixels_addr() - Get the pointer to the block containing the pixel at the given > > + * coordinates > > * > > * @frame_info: Buffer metadata > > - * @x: The x(width) coordinate of the 2D buffer > > - * @y: The y(Heigth) coordinate of the 2D buffer > > + * @x: The x(width) coordinate inside the plane > > + * @y: The y(height) coordinate inside the plane > > I would add a space after x and y. I just followed what was here before, fixed for the v6. > > * > > * Takes the information stored in the frame_info, a pair of coordinates, and > > * returns the address of the first color channel. > > * This function assumes the channels are packed together, i.e. a color channel > > * comes immediately after another in the memory. And therefore, this function > > * doesn't work for YUV with chroma subsampling (e.g. YUV420 and NV21). > > + * > > + * The caller must ensure that the framebuffer associated with this request uses a pixel format > > + * where block_h == block_w == 1, otherwise the returned pointer can be outside the buffer. > > */ > > static void *packed_pixels_addr(const struct vkms_frame_info *frame_info, > > int x, int y) > > @@ -53,6 +69,13 @@ static int get_x_position(const struct vkms_frame_info *frame_info, int limit, i > > return x; > > } > > > > +/* > > + * The following functions take pixel data from the buffer and convert them to the format > > Double-spacing. Fixed in v6. > > + * ARGB16161616 in out_pixel. > > + * > > + * They are used in the `vkms_compose_row` function to handle multiple formats. > > For cross-referencing functions, we use vkms_compose_row() [1]. > > [1] > https://docs.kernel.org/doc-guide/kernel-doc.html#highlights-and-cross-references Thanks for this reference, fixed for the v6 > > + */ > > + > > static void ARGB8888_to_argb_u16(u8 *src_pixels, struct pixel_argb_u16 *out_pixel) > > { > > /* > > @@ -145,12 +168,11 @@ void vkms_compose_row(struct line_buffer *stage_buffer, struct vkms_plane_state > > } > > > > /* > > - * The following functions take an line of argb_u16 pixels from the > > - * src_buffer, convert them to a specific format, and store them in the > > - * destination. > > + * The following functions take one argb_u16 pixel and convert it to a specific format. The > > For cross-referencing structs, look here [1]. Fixed in v6. > > + * result is stored in @dst_pixels. > > * > > - * They are used in the `compose_active_planes` to convert and store a line > > - * from the src_buffer to the writeback buffer. > > + * They are used in the `vkms_writeback_row` to convert and store a pixel from the src_buffer to > > Same. Fixed in v6. > > + * the writeback buffer. > > */ > > static void argb_u16_to_ARGB8888(u8 *dst_pixels, struct pixel_argb_u16 *in_pixel) > > { > > @@ -216,6 +238,14 @@ static void argb_u16_to_RGB565(u8 *dst_pixels, struct pixel_argb_u16 *in_pixel) > > *pixels = cpu_to_le16(r << 11 | g << 5 | b); > > } > > > > +/** > > + * Generic loop for all supported writeback format. It is executed just after the blending to > > + * write a line in the writeback buffer. > > + * > > + * @wb: Job where to insert the final image > > + * @src_buffer: Line to write > > + * @y: Row to write in the writeback buffer > > + */ > > void vkms_writeback_row(struct vkms_writeback_job *wb, > > const struct line_buffer *src_buffer, int y) > > { > > @@ -229,6 +259,13 @@ void vkms_writeback_row(struct vkms_writeback_job *wb, > > wb->pixel_write(dst_pixels, &in_pixels[x]); > > } > > > > +/** > > Where is the function name? Fixed for the v6. > > + * Retrieve the correct read_pixel function for a specific format. > > + * The returned pointer is NULL for unsupported pixel formats. The caller must ensure that the > > + * pointer is valid before using it in a vkms_plane_state. > > + * > > + * @format: DRM_FORMAT_* value for which to obtain a conversion function (see [drm_fourcc.h]) > > + */ > > void *get_pixel_conversion_function(u32 format) > > { > > switch (format) { > > @@ -247,6 +284,13 @@ void *get_pixel_conversion_function(u32 format) > > } > > } > > > > +/** > > Same. Fixed for the v6. Thanks, Louis Chauvet > Best Regards, > - Ma?ra > > > + * Retrieve the correct write_pixel function for a specific format. > > + * The returned pointer is NULL for unsupported pixel formats. The caller must ensure that the > > + * pointer is valid before using it in a vkms_writeback_job. > > + * > > + * @format: DRM_FORMAT_* value for which to obtain a conversion function (see [drm_fourcc.h]) > > + */ > > void *get_pixel_write_function(u32 format) > > { > > switch (format) { > > -- Louis Chauvet, Bootlin Embedded Linux and Kernel engineering https://bootlin.com