[v13,1/7] libcamera: software_isp: egl: Add filter parameter to createTexture2D()
diff mbox series

Message ID 20260810201957.19623-2-mzamazal@redhat.com
State Superseded
Headers show
Series
  • LSC for SoftISP simple pipeline
Related show

Commit Message

Milan Zamazal Aug. 10, 2026, 8:19 p.m. UTC
From: Xander Pronk <xander.c.pronk@gmail.com>

Add `filter' parameter to createTexture2D() to allow overriding
the currently hardcoded GL_NEAREST value.  This is needed for
grid-based lens shading interpolation, which is implemented in followup
patches.

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Co-developed-by: Rick ten Wolde <rick_libcamera@wolde.info>
Signed-off-by: Rick ten Wolde <rick_libcamera@wolde.info>
Signed-off-by: Xander Pronk <xander.c.pronk@gmail.com>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
---
 include/libcamera/internal/egl.h           |  2 +-
 src/libcamera/egl.cpp                      | 11 ++++++-----
 src/libcamera/software_isp/debayer_egl.cpp |  2 +-
 3 files changed, 8 insertions(+), 7 deletions(-)

Comments

Barnabás Pőcze Aug. 18, 2026, 10:12 a.m. UTC | #1
2026. 08. 10. 22:19 keltezéssel, Milan Zamazal írta:
> From: Xander Pronk <xander.c.pronk@gmail.com>
> 
> Add `filter' parameter to createTexture2D() to allow overriding
> the currently hardcoded GL_NEAREST value.  This is needed for
> grid-based lens shading interpolation, which is implemented in followup
> patches.
> 
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> Co-developed-by: Rick ten Wolde <rick_libcamera@wolde.info>
> Signed-off-by: Rick ten Wolde <rick_libcamera@wolde.info>
> Signed-off-by: Xander Pronk <xander.c.pronk@gmail.com>
> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
> ---

Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>


>   include/libcamera/internal/egl.h           |  2 +-
>   src/libcamera/egl.cpp                      | 11 ++++++-----
>   src/libcamera/software_isp/debayer_egl.cpp |  2 +-
>   3 files changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/include/libcamera/internal/egl.h b/include/libcamera/internal/egl.h
> index 7ef1ca0d9..790ec4b22 100644
> --- a/include/libcamera/internal/egl.h
> +++ b/include/libcamera/internal/egl.h
> @@ -107,7 +107,7 @@ public:
>   
>   	int createInputDMABufTexture2D(eGLImage &eglImage, int fd);
>   	int createOutputDMABufTexture2D(eGLImage &eglImage, int fd);
> -	void createTexture2D(eGLImage &eglImage, void *data);
> +	void createTexture2D(eGLImage &eglImage, void *data, GLint filter);
>   	void updateTexture2D(eGLImage &eglImage, void *data);
>   	void createOutputTexture2D(eGLImage &eglImage);
>   
> diff --git a/src/libcamera/egl.cpp b/src/libcamera/egl.cpp
> index 01e51cda8..32e7e0e9c 100644
> --- a/src/libcamera/egl.cpp
> +++ b/src/libcamera/egl.cpp
> @@ -278,13 +278,14 @@ int eGL::createOutputDMABufTexture2D(eGLImage &eglImage, int fd)
>    * \brief Create a 2D texture from a memory buffer
>    * \param[in,out] eglImage EGL image to associate with the texture
>    * \param[in] data Pointer to pixel data, or nullptr for uninitialised texture
> + * \param[in] filter GL texture filter setting
>    *
>    * Creates a 2D texture from a CPU-accessible memory buffer. The texture
> - * is configured with nearest filtering and clamp-to-edge wrapping. This
> + * is configured the specified filtering and clamp-to-edge wrapping. This
>    * is useful for uploading static data like lookup tables or uniform color
>    * matrices to the GPU.
>    */
> -void eGL::createTexture2D(eGLImage &eglImage, void *data)
> +void eGL::createTexture2D(eGLImage &eglImage, void *data, GLint filter)
>   {
>   	ASSERT(tid_ == Thread::currentId());
>   
> @@ -294,8 +295,8 @@ void eGL::createTexture2D(eGLImage &eglImage, void *data)
>   	glTexImage2D(GL_TEXTURE_2D, 0, eglImage.format_, eglImage.width_, eglImage.height_, 0, eglImage.format_, GL_UNSIGNED_BYTE, data);
>   
>   	// Nearest filtering
> -	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
> -	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
> +	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
> +	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
>   
>   	// Wrap to edge to avoid edge artifacts
>   	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
> @@ -356,7 +357,7 @@ void eGL::updateTexture2D(eGLImage &eglImage, void *data)
>    */
>   void eGL::createOutputTexture2D(eGLImage &eglImage)
>   {
> -	createTexture2D(eglImage, NULL);
> +	createTexture2D(eglImage, NULL, GL_NEAREST);
>   	attachTextureToFBO(eglImage);
>   }
>   
> diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp
> index 20b478b1c..c7f27508a 100644
> --- a/src/libcamera/software_isp/debayer_egl.cpp
> +++ b/src/libcamera/software_isp/debayer_egl.cpp
> @@ -533,7 +533,7 @@ eGLImage *DebayerEGL::getCachedInputFrameBuffer(FrameBuffer *input, std::optiona
>   		return nullptr;
>   	}
>   	if (cache_miss)
> -		egl_.createTexture2D(*eglImageIn, inMapped->value().planes()[0].data());
> +		egl_.createTexture2D(*eglImageIn, inMapped->value().planes()[0].data(), GL_NEAREST);
>   	else
>   		egl_.updateTexture2D(*eglImageIn, inMapped->value().planes()[0].data());
>

Patch
diff mbox series

diff --git a/include/libcamera/internal/egl.h b/include/libcamera/internal/egl.h
index 7ef1ca0d9..790ec4b22 100644
--- a/include/libcamera/internal/egl.h
+++ b/include/libcamera/internal/egl.h
@@ -107,7 +107,7 @@  public:
 
 	int createInputDMABufTexture2D(eGLImage &eglImage, int fd);
 	int createOutputDMABufTexture2D(eGLImage &eglImage, int fd);
-	void createTexture2D(eGLImage &eglImage, void *data);
+	void createTexture2D(eGLImage &eglImage, void *data, GLint filter);
 	void updateTexture2D(eGLImage &eglImage, void *data);
 	void createOutputTexture2D(eGLImage &eglImage);
 
diff --git a/src/libcamera/egl.cpp b/src/libcamera/egl.cpp
index 01e51cda8..32e7e0e9c 100644
--- a/src/libcamera/egl.cpp
+++ b/src/libcamera/egl.cpp
@@ -278,13 +278,14 @@  int eGL::createOutputDMABufTexture2D(eGLImage &eglImage, int fd)
  * \brief Create a 2D texture from a memory buffer
  * \param[in,out] eglImage EGL image to associate with the texture
  * \param[in] data Pointer to pixel data, or nullptr for uninitialised texture
+ * \param[in] filter GL texture filter setting
  *
  * Creates a 2D texture from a CPU-accessible memory buffer. The texture
- * is configured with nearest filtering and clamp-to-edge wrapping. This
+ * is configured the specified filtering and clamp-to-edge wrapping. This
  * is useful for uploading static data like lookup tables or uniform color
  * matrices to the GPU.
  */
-void eGL::createTexture2D(eGLImage &eglImage, void *data)
+void eGL::createTexture2D(eGLImage &eglImage, void *data, GLint filter)
 {
 	ASSERT(tid_ == Thread::currentId());
 
@@ -294,8 +295,8 @@  void eGL::createTexture2D(eGLImage &eglImage, void *data)
 	glTexImage2D(GL_TEXTURE_2D, 0, eglImage.format_, eglImage.width_, eglImage.height_, 0, eglImage.format_, GL_UNSIGNED_BYTE, data);
 
 	// Nearest filtering
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
 
 	// Wrap to edge to avoid edge artifacts
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -356,7 +357,7 @@  void eGL::updateTexture2D(eGLImage &eglImage, void *data)
  */
 void eGL::createOutputTexture2D(eGLImage &eglImage)
 {
-	createTexture2D(eglImage, NULL);
+	createTexture2D(eglImage, NULL, GL_NEAREST);
 	attachTextureToFBO(eglImage);
 }
 
diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp
index 20b478b1c..c7f27508a 100644
--- a/src/libcamera/software_isp/debayer_egl.cpp
+++ b/src/libcamera/software_isp/debayer_egl.cpp
@@ -533,7 +533,7 @@  eGLImage *DebayerEGL::getCachedInputFrameBuffer(FrameBuffer *input, std::optiona
 		return nullptr;
 	}
 	if (cache_miss)
-		egl_.createTexture2D(*eglImageIn, inMapped->value().planes()[0].data());
+		egl_.createTexture2D(*eglImageIn, inMapped->value().planes()[0].data(), GL_NEAREST);
 	else
 		egl_.updateTexture2D(*eglImageIn, inMapped->value().planes()[0].data());