[libcamera-devel] [PATCH 2/7] qcam: viewfinder_gl: Keep fragment shader when format doesn't change
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Nov 3 16:50:20 CET 2020
When ViewFinderGL::setFormat() is called, the fragment shader is deleted
and recreated for the new format. This results in unnecessary shader
recompilation if only the size is changed and the pixel format remains
the same. Keep the existing shader in that case.
The null test for fragmentShader_ can be removed, as if the shader
program is linked, the fragment shader is guaranteed to exist.
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
src/qcam/viewfinder_gl.cpp | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
index 03a576ba89d2..c07292523504 100644
--- a/src/qcam/viewfinder_gl.cpp
+++ b/src/qcam/viewfinder_gl.cpp
@@ -53,19 +53,23 @@ const QList<libcamera::PixelFormat> &ViewFinderGL::nativeFormats() const
int ViewFinderGL::setFormat(const libcamera::PixelFormat &format,
const QSize &size)
{
- /* If the fragment is created remove it and create a new one. */
- if (fragmentShader_) {
+ if (format != format_) {
+ /*
+ * If the fragment already exists, remove it and create a new
+ * one for the new format.
+ */
if (shaderProgram_.isLinked()) {
shaderProgram_.release();
shaderProgram_.removeShader(fragmentShader_.get());
fragmentShader_.reset();
}
+
+ if (!selectFormat(format))
+ return -1;
+
+ format_ = format;
}
- if (!selectFormat(format))
- return -1;
-
- format_ = format;
size_ = size;
updateGeometry();
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list