Message ID | 20200911085514.30021-2-show.liu@linaro.org |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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@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@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')
Hi Laurent, Laurent Pinchart <laurent.pinchart@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@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@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 >
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) + ); + + 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')
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@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