[libcamera-devel] [PATCH v6 1/4] qcam: add OpenGL shader code as Qt resource
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Sep 12 03:20:15 CEST 2020
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.
> +
> + 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
More information about the libcamera-devel
mailing list