[libcamera-devel] [PATCH v6 1/4] qcam: add OpenGL shader code as Qt resource

Show Liu show.liu at linaro.org
Sat Sep 12 10:00:47 CEST 2020


Hi Laurent,



Laurent Pinchart <laurent.pinchart at ideasonboard.com> 於 2020年9月12日 週六 上午9:20
寫道:

> Hi Show,
>
> Thank you for the patch.
>
> On Fri, Sep 11, 2020 at 04:55:11PM +0800, Show Liu wrote:
> > Add OpenGL fragment and vertex shaders to convert two- and tri-planar
> > YUV formats to RGB. This will be used to accelerate YUV image rendering.
> >
> > Signed-off-by: Show Liu <show.liu at linaro.org>
> > ---
> >  src/qcam/assets/shader/NV_2_planes_UV_f.glsl | 32 +++++++++++++++++++
> >  src/qcam/assets/shader/NV_2_planes_VU_f.glsl | 32 +++++++++++++++++++
> >  src/qcam/assets/shader/NV_3_planes_f.glsl    | 33 ++++++++++++++++++++
> >  src/qcam/assets/shader/NV_vertex_shader.glsl | 16 ++++++++++
> >  src/qcam/assets/shader/shaders.qrc           |  9 ++++++
> >  src/qcam/meson.build                         |  1 +
> >  6 files changed, 123 insertions(+)
> >  create mode 100644 src/qcam/assets/shader/NV_2_planes_UV_f.glsl
> >  create mode 100644 src/qcam/assets/shader/NV_2_planes_VU_f.glsl
> >  create mode 100644 src/qcam/assets/shader/NV_3_planes_f.glsl
> >  create mode 100644 src/qcam/assets/shader/NV_vertex_shader.glsl
> >  create mode 100644 src/qcam/assets/shader/shaders.qrc
> >
> > diff --git a/src/qcam/assets/shader/NV_2_planes_UV_f.glsl
> b/src/qcam/assets/shader/NV_2_planes_UV_f.glsl
> > new file mode 100644
> > index 0000000..80478c5
> > --- /dev/null
> > +++ b/src/qcam/assets/shader/NV_2_planes_UV_f.glsl
> > @@ -0,0 +1,32 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2020, Linaro
> > + *
> > + * NV_2_planes_UV_f.glsl - Fragment shader code for NV12, NV16 and NV24
> formats
> > + */
> > +
> > +#ifdef GL_ES
> > +precision mediump float;
> > +#endif
> > +
> > +varying vec2 textureOut;
> > +uniform sampler2D tex_y;
> > +uniform sampler2D tex_u;
> > +
> > +void main(void)
> > +{
> > +     vec3 yuv;
> > +     vec3 rgb;
> > +     mat3 yuv2rgb_bt601_mat = mat3(
> > +                                   vec3(1.164,  1.164, 1.164),
> > +                                   vec3(0.000, -0.392, 2.017),
> > +                                   vec3(1.596, -0.813, 0.000)
> > +                              );
>
> Would this be more readable ?
>
>         mat3 yuv2rgb_bt601_mat = mat3(
>                 vec3(1.164,  1.164, 1.164),
>                 vec3(0.000, -0.392, 2.017),
>                 vec3(1.596, -0.813, 0.000)
>         );
>
> Apart from that,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> If you're fine with this change I'll handle it when applying the series,
> no need for a v7 just for this.
>
Sure. Please go ahead.

Thanks,
Show


> > +
> > +     yuv.x = texture2D(tex_y, textureOut).r - 0.063;
> > +     yuv.y = texture2D(tex_u, textureOut).r - 0.500;
> > +     yuv.z = texture2D(tex_u, textureOut).g - 0.500;
> > +
> > +     rgb = yuv2rgb_bt601_mat * yuv;
> > +     gl_FragColor = vec4(rgb, 1.0);
> > +}
> > diff --git a/src/qcam/assets/shader/NV_2_planes_VU_f.glsl
> b/src/qcam/assets/shader/NV_2_planes_VU_f.glsl
> > new file mode 100644
> > index 0000000..3794be8
> > --- /dev/null
> > +++ b/src/qcam/assets/shader/NV_2_planes_VU_f.glsl
> > @@ -0,0 +1,32 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2020, Linaro
> > + *
> > + * NV_2_planes_VU_f.glsl - Fragment shader code for NV21, NV61 and NV42
> formats
> > + */
> > +
> > +#ifdef GL_ES
> > +precision mediump float;
> > +#endif
> > +
> > +varying vec2 textureOut;
> > +uniform sampler2D tex_y;
> > +uniform sampler2D tex_u;
> > +
> > +void main(void)
> > +{
> > +     vec3 yuv;
> > +     vec3 rgb;
> > +     mat3 yuv2rgb_bt601_mat = mat3(
> > +                                   vec3(1.164,  1.164, 1.164),
> > +                                   vec3(0.000, -0.392, 2.017),
> > +                                   vec3(1.596, -0.813, 0.000)
> > +                              );
> > +
> > +     yuv.x = texture2D(tex_y, textureOut).r - 0.063;
> > +     yuv.y = texture2D(tex_u, textureOut).g - 0.500;
> > +     yuv.z = texture2D(tex_u, textureOut).r - 0.500;
> > +
> > +     rgb = yuv2rgb_bt601_mat * yuv;
> > +     gl_FragColor = vec4(rgb, 1.0);
> > +}
> > diff --git a/src/qcam/assets/shader/NV_3_planes_f.glsl
> b/src/qcam/assets/shader/NV_3_planes_f.glsl
> > new file mode 100644
> > index 0000000..fca9b65
> > --- /dev/null
> > +++ b/src/qcam/assets/shader/NV_3_planes_f.glsl
> > @@ -0,0 +1,33 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2020, Linaro
> > + *
> > + * NV_3_planes_UV_f.glsl - Fragment shader code for YUV420 format
> > + */
> > +
> > +#ifdef GL_ES
> > +precision mediump float;
> > +#endif
> > +
> > +varying vec2 textureOut;
> > +uniform sampler2D tex_y;
> > +uniform sampler2D tex_u;
> > +uniform sampler2D tex_v;
> > +
> > +void main(void)
> > +{
> > +     vec3 yuv;
> > +     vec3 rgb;
> > +     mat3 yuv2rgb_bt601_mat = mat3(
> > +                                   vec3(1.164,  1.164, 1.164),
> > +                                   vec3(0.000, -0.392, 2.017),
> > +                                   vec3(1.596, -0.813, 0.000)
> > +                              );
> > +
> > +     yuv.x = texture2D(tex_y, textureOut).r - 0.063;
> > +     yuv.y = texture2D(tex_u, textureOut).r - 0.500;
> > +     yuv.z = texture2D(tex_v, textureOut).r - 0.500;
> > +
> > +     rgb = yuv2rgb_bt601_mat * yuv;
> > +     gl_FragColor = vec4(rgb, 1.0);
> > +}
> > diff --git a/src/qcam/assets/shader/NV_vertex_shader.glsl
> b/src/qcam/assets/shader/NV_vertex_shader.glsl
> > new file mode 100644
> > index 0000000..12e791e
> > --- /dev/null
> > +++ b/src/qcam/assets/shader/NV_vertex_shader.glsl
> > @@ -0,0 +1,16 @@
> > +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > +/*
> > + * Copyright (C) 2020, Linaro
> > + *
> > + * NV_vertex_shader.glsl - Vertex shader code for NV family
> > + */
> > +
> > +attribute vec4 vertexIn;
> > +attribute vec2 textureIn;
> > +varying vec2 textureOut;
> > +
> > +void main(void)
> > +{
> > +     gl_Position = vertexIn;
> > +     textureOut = textureIn;
> > +}
> > diff --git a/src/qcam/assets/shader/shaders.qrc
> b/src/qcam/assets/shader/shaders.qrc
> > new file mode 100644
> > index 0000000..33eab27
> > --- /dev/null
> > +++ b/src/qcam/assets/shader/shaders.qrc
> > @@ -0,0 +1,9 @@
> > +<!-- SPDX-License-Identifier: LGPL-2.1-or-later -->
> > +<!DOCTYPE RCC><RCC version="1.0">
> > +<qresource>
> > +<file>./NV_vertex_shader.glsl</file>
> > +<file>./NV_2_planes_UV_f.glsl</file>
> > +<file>./NV_2_planes_VU_f.glsl</file>
> > +<file>./NV_3_planes_f.glsl</file>
> > +</qresource>
> > +</RCC>
> > diff --git a/src/qcam/meson.build b/src/qcam/meson.build
> > index 6ea886a..e0c6f26 100644
> > --- a/src/qcam/meson.build
> > +++ b/src/qcam/meson.build
> > @@ -16,6 +16,7 @@ qcam_moc_headers = files([
> >
> >  qcam_resources = files([
> >      'assets/feathericons/feathericons.qrc',
> > +    'assets/shader/shaders.qrc'
> >  ])
> >
> >  qt5 = import('qt5')
>
> --
> Regards,
>
> Laurent Pinchart
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20200912/d4cec2b2/attachment.htm>


More information about the libcamera-devel mailing list