All of lore.kernel.org
 help / color / mirror / Atom feed
From: Emil Velikov <emil.l.velikov@gmail.com>
To: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Cc: Brian Starkey <brian.starkey@arm.com>,
	Liviu Dudau <liviu.dudau@arm.com>,
	Daniel Vetter <daniel@ffwll.ch>, Simon Ser <contact@emersion.fr>,
	Leandro Ribeiro <leandro.ribeiro@collabora.com>,
	Helen Koike <helen.koike@collabora.com>,
	Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>,
	"Linux-Kernel@Vger. Kernel. Org" <linux-kernel@vger.kernel.org>,
	ML dri-devel <dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH V4 2/3] drm/vkms: Compute CRC without change input data
Date: Tue, 12 May 2020 12:34:47 +0100	[thread overview]
Message-ID: <CACvgo53KfLkTg4UvT5E+afX+z4FjMcpdctD5=v32WJs6TS5s5g@mail.gmail.com> (raw)
In-Reply-To: <20200511115524.22602-3-Rodrigo.Siqueira@amd.com>

Hi Rodrigo,

On Mon, 11 May 2020 at 12:55, Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> wrote:
>
> From: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
>
> The compute_crc() function is responsible for calculating the
> framebuffer CRC value; due to the XRGB format, this function has to
> ignore the alpha channel during the CRC computation. Therefore,
> compute_crc() set zero to the alpha channel directly in the input
> framebuffer, which is not a problem since this function receives a copy
> of the original buffer. However, if we want to use this function in a
> context without a buffer copy, it will change the initial value. This
> patch makes compute_crc() calculate the CRC value without modifying the
> input framebuffer.
>
> Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
> ---
>  drivers/gpu/drm/vkms/vkms_composer.c | 31 +++++++++++++++++-----------
>  1 file changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> index 258e659ecfba..686d25e7b01d 100644
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c
> @@ -9,33 +9,40 @@
>
>  #include "vkms_drv.h"
>
> +static u32 get_pixel_from_buffer(int x, int y, const u8 *buffer,
> +                                const struct vkms_composer *composer)
> +{
> +       int src_offset = composer->offset + (y * composer->pitch)
> +                                         + (x * composer->cpp);
> +
> +       return *(u32 *)&buffer[src_offset];
> +}
> +
>  /**
>   * compute_crc - Compute CRC value on output frame
>   *
> - * @vaddr_out: address to final framebuffer
> + * @vaddr: address to final framebuffer
>   * @composer: framebuffer's metadata
>   *
>   * returns CRC value computed using crc32 on the visible portion of
>   * the final framebuffer at vaddr_out
>   */
> -static uint32_t compute_crc(void *vaddr_out, struct vkms_composer *composer)
> +static uint32_t compute_crc(const u8 *vaddr,
> +                           const struct vkms_composer *composer)
>  {
> -       int i, j, src_offset;
> +       int x, y;
>         int x_src = composer->src.x1 >> 16;
>         int y_src = composer->src.y1 >> 16;
>         int h_src = drm_rect_height(&composer->src) >> 16;
>         int w_src = drm_rect_width(&composer->src) >> 16;
> -       u32 crc = 0;
> +       u32 crc = 0, pixel = 0;
>
> -       for (i = y_src; i < y_src + h_src; ++i) {
> -               for (j = x_src; j < x_src + w_src; ++j) {
> -                       src_offset = composer->offset
> -                                    + (i * composer->pitch)
> -                                    + (j * composer->cpp);
> +       for (y = y_src; y < y_src + h_src; ++y) {
> +               for (x = x_src; x < x_src + w_src; ++x) {
>                         /* XRGB format ignores Alpha channel */
> -                       memset(vaddr_out + src_offset + 24, 0,  8);
> -                       crc = crc32_le(crc, vaddr_out + src_offset,
> -                                      sizeof(u32));
> +                       pixel = get_pixel_from_buffer(x, y, vaddr, composer);
> +                       bitmap_clear((void *)&pixel, 0, 8);
> +                       crc = crc32_le(crc, (void *)&pixel, sizeof(u32));
>                 }
>         }
>
IMHO using something like the following makes the code far simpler and clearer.

offset = composer->offset + (y_src * composer->pitch) + (x_src * composer->cpp);

for (i = 0; i < h_src; i++, offset += composer->pitch) {
   for (j = 0; j < w_src; j++, offset += composer->cpp) {
      pixel = get_pixel_from_buffer(vaddr, offset);
      crc = crc32_le(crc, &pixel, sizeof(u32); // cast should not be needed
   }
}

With the bitmap_clear() and related comment moved into get_pixel_from_buffer().

-Emil

WARNING: multiple messages have this Message-ID (diff)
From: Emil Velikov <emil.l.velikov@gmail.com>
To: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>,
	Liviu Dudau <liviu.dudau@arm.com>,
	"Linux-Kernel@Vger. Kernel. Org" <linux-kernel@vger.kernel.org>,
	Leandro Ribeiro <leandro.ribeiro@collabora.com>,
	Helen Koike <helen.koike@collabora.com>,
	ML dri-devel <dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH V4 2/3] drm/vkms: Compute CRC without change input data
Date: Tue, 12 May 2020 12:34:47 +0100	[thread overview]
Message-ID: <CACvgo53KfLkTg4UvT5E+afX+z4FjMcpdctD5=v32WJs6TS5s5g@mail.gmail.com> (raw)
In-Reply-To: <20200511115524.22602-3-Rodrigo.Siqueira@amd.com>

Hi Rodrigo,

On Mon, 11 May 2020 at 12:55, Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> wrote:
>
> From: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
>
> The compute_crc() function is responsible for calculating the
> framebuffer CRC value; due to the XRGB format, this function has to
> ignore the alpha channel during the CRC computation. Therefore,
> compute_crc() set zero to the alpha channel directly in the input
> framebuffer, which is not a problem since this function receives a copy
> of the original buffer. However, if we want to use this function in a
> context without a buffer copy, it will change the initial value. This
> patch makes compute_crc() calculate the CRC value without modifying the
> input framebuffer.
>
> Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
> ---
>  drivers/gpu/drm/vkms/vkms_composer.c | 31 +++++++++++++++++-----------
>  1 file changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> index 258e659ecfba..686d25e7b01d 100644
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c
> @@ -9,33 +9,40 @@
>
>  #include "vkms_drv.h"
>
> +static u32 get_pixel_from_buffer(int x, int y, const u8 *buffer,
> +                                const struct vkms_composer *composer)
> +{
> +       int src_offset = composer->offset + (y * composer->pitch)
> +                                         + (x * composer->cpp);
> +
> +       return *(u32 *)&buffer[src_offset];
> +}
> +
>  /**
>   * compute_crc - Compute CRC value on output frame
>   *
> - * @vaddr_out: address to final framebuffer
> + * @vaddr: address to final framebuffer
>   * @composer: framebuffer's metadata
>   *
>   * returns CRC value computed using crc32 on the visible portion of
>   * the final framebuffer at vaddr_out
>   */
> -static uint32_t compute_crc(void *vaddr_out, struct vkms_composer *composer)
> +static uint32_t compute_crc(const u8 *vaddr,
> +                           const struct vkms_composer *composer)
>  {
> -       int i, j, src_offset;
> +       int x, y;
>         int x_src = composer->src.x1 >> 16;
>         int y_src = composer->src.y1 >> 16;
>         int h_src = drm_rect_height(&composer->src) >> 16;
>         int w_src = drm_rect_width(&composer->src) >> 16;
> -       u32 crc = 0;
> +       u32 crc = 0, pixel = 0;
>
> -       for (i = y_src; i < y_src + h_src; ++i) {
> -               for (j = x_src; j < x_src + w_src; ++j) {
> -                       src_offset = composer->offset
> -                                    + (i * composer->pitch)
> -                                    + (j * composer->cpp);
> +       for (y = y_src; y < y_src + h_src; ++y) {
> +               for (x = x_src; x < x_src + w_src; ++x) {
>                         /* XRGB format ignores Alpha channel */
> -                       memset(vaddr_out + src_offset + 24, 0,  8);
> -                       crc = crc32_le(crc, vaddr_out + src_offset,
> -                                      sizeof(u32));
> +                       pixel = get_pixel_from_buffer(x, y, vaddr, composer);
> +                       bitmap_clear((void *)&pixel, 0, 8);
> +                       crc = crc32_le(crc, (void *)&pixel, sizeof(u32));
>                 }
>         }
>
IMHO using something like the following makes the code far simpler and clearer.

offset = composer->offset + (y_src * composer->pitch) + (x_src * composer->cpp);

for (i = 0; i < h_src; i++, offset += composer->pitch) {
   for (j = 0; j < w_src; j++, offset += composer->cpp) {
      pixel = get_pixel_from_buffer(vaddr, offset);
      crc = crc32_le(crc, &pixel, sizeof(u32); // cast should not be needed
   }
}

With the bitmap_clear() and related comment moved into get_pixel_from_buffer().

-Emil
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2020-05-12 11:37 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-11 11:55 [PATCH V4 0/3] drm/vkms: Introduces writeback support Rodrigo Siqueira
2020-05-11 11:55 ` Rodrigo Siqueira
2020-05-11 11:55 ` [PATCH V4 1/3] drm/vkms: Decouple crc operations from composer Rodrigo Siqueira
2020-05-11 11:55   ` Rodrigo Siqueira
2020-06-02 11:19   ` Emil Velikov
2020-06-02 11:19     ` Emil Velikov
2020-05-11 11:55 ` [PATCH V4 2/3] drm/vkms: Compute CRC without change input data Rodrigo Siqueira
2020-05-11 11:55   ` Rodrigo Siqueira
2020-05-12 11:34   ` Emil Velikov [this message]
2020-05-12 11:34     ` Emil Velikov
2020-06-02 11:24     ` Emil Velikov
2020-06-02 11:24       ` Emil Velikov
2020-05-11 11:55 ` [PATCH V4 3/3] drm/vkms: Add support for writeback Rodrigo Siqueira
2020-05-11 11:55   ` Rodrigo Siqueira
2020-06-02 12:14   ` Emil Velikov
2020-06-02 12:14     ` Emil Velikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CACvgo53KfLkTg4UvT5E+afX+z4FjMcpdctD5=v32WJs6TS5s5g@mail.gmail.com' \
    --to=emil.l.velikov@gmail.com \
    --cc=Rodrigo.Siqueira@amd.com \
    --cc=brian.starkey@arm.com \
    --cc=contact@emersion.fr \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=helen.koike@collabora.com \
    --cc=leandro.ribeiro@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=liviu.dudau@arm.com \
    --cc=rodrigosiqueiramelo@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.