summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-09-13 01:04:20 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-10-04 22:51:45 +0300
commitae9e7fbf3a8bf45b08951b650aec3f91997fafc3 (patch)
tree0509a8e0dd18f5456a341f936d53d93bb55df621
parent0bc03960daf0d7e28d45513873e3d1feecbedbf6 (diff)
qcam: viewfinder_gl: Merge the semi-planar UV and VU shaders
Use macros to select the U and V pattern, to avoid code duplication between the two semi-planar shaders. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r--src/qcam/assets/shader/YUV_2_planes.frag (renamed from src/qcam/assets/shader/YUV_2_planes_UV.frag)9
-rw-r--r--src/qcam/assets/shader/YUV_2_planes_VU.frag32
-rw-r--r--src/qcam/assets/shader/shaders.qrc3
-rw-r--r--src/qcam/viewfinder_gl.cpp18
4 files changed, 21 insertions, 41 deletions
diff --git a/src/qcam/assets/shader/YUV_2_planes_UV.frag b/src/qcam/assets/shader/YUV_2_planes.frag
index 081caea9..125f1c85 100644
--- a/src/qcam/assets/shader/YUV_2_planes_UV.frag
+++ b/src/qcam/assets/shader/YUV_2_planes.frag
@@ -2,7 +2,7 @@
/*
* Copyright (C) 2020, Linaro
*
- * YUV_2_planes_UV.frag - Fragment shader code for NV12, NV16 and NV24 formats
+ * YUV_2_planes.frag - Fragment shader code for NV12, NV16 and NV24 formats
*/
#ifdef GL_ES
@@ -24,8 +24,15 @@ void main(void)
);
yuv.x = texture2D(tex_y, textureOut).r - 0.063;
+#if defined(YUV_PATTERN_UV)
yuv.y = texture2D(tex_u, textureOut).r - 0.500;
yuv.z = texture2D(tex_u, textureOut).g - 0.500;
+#elif defined(YUV_PATTERN_VU)
+ yuv.y = texture2D(tex_u, textureOut).g - 0.500;
+ yuv.z = texture2D(tex_u, textureOut).r - 0.500;
+#else
+#error Invalid pattern
+#endif
rgb = yuv2rgb_bt601_mat * yuv;
gl_FragColor = vec4(rgb, 1.0);
diff --git a/src/qcam/assets/shader/YUV_2_planes_VU.frag b/src/qcam/assets/shader/YUV_2_planes_VU.frag
deleted file mode 100644
index f4a5a5ac..00000000
--- a/src/qcam/assets/shader/YUV_2_planes_VU.frag
+++ /dev/null
@@ -1,32 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2020, Linaro
- *
- * YUV_2_planes_VU.frag - 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/shaders.qrc b/src/qcam/assets/shader/shaders.qrc
index 533396d1..7010d843 100644
--- a/src/qcam/assets/shader/shaders.qrc
+++ b/src/qcam/assets/shader/shaders.qrc
@@ -2,8 +2,7 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>YUV.vert</file>
- <file>YUV_2_planes_UV.frag</file>
- <file>YUV_2_planes_VU.frag</file>
+ <file>YUV_2_planes.frag</file>
<file>YUV_3_planes.frag</file>
</qresource>
</RCC>
diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
index 7cb5fb63..b8a48272 100644
--- a/src/qcam/viewfinder_gl.cpp
+++ b/src/qcam/viewfinder_gl.cpp
@@ -106,32 +106,38 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
case libcamera::formats::NV12:
horzSubSample_ = 2;
vertSubSample_ = 2;
- fragmentShaderFile_ = ":YUV_2_planes_UV.frag";
+ fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
+ fragmentShaderFile_ = ":YUV_2_planes.frag";
break;
case libcamera::formats::NV21:
horzSubSample_ = 2;
vertSubSample_ = 2;
- fragmentShaderFile_ = ":YUV_2_planes_VU.frag";
+ fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
+ fragmentShaderFile_ = ":YUV_2_planes.frag";
break;
case libcamera::formats::NV16:
horzSubSample_ = 2;
vertSubSample_ = 1;
- fragmentShaderFile_ = ":YUV_2_planes_UV.frag";
+ fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
+ fragmentShaderFile_ = ":YUV_2_planes.frag";
break;
case libcamera::formats::NV61:
horzSubSample_ = 2;
vertSubSample_ = 1;
- fragmentShaderFile_ = ":YUV_2_planes_VU.frag";
+ fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
+ fragmentShaderFile_ = ":YUV_2_planes.frag";
break;
case libcamera::formats::NV24:
horzSubSample_ = 1;
vertSubSample_ = 1;
- fragmentShaderFile_ = ":YUV_2_planes_UV.frag";
+ fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
+ fragmentShaderFile_ = ":YUV_2_planes.frag";
break;
case libcamera::formats::NV42:
horzSubSample_ = 1;
vertSubSample_ = 1;
- fragmentShaderFile_ = ":YUV_2_planes_VU.frag";
+ fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
+ fragmentShaderFile_ = ":YUV_2_planes.frag";
break;
case libcamera::formats::YUV420:
horzSubSample_ = 2;