[libcamera-devel] [PATCH] qcam: Support OpenGL ES 2.0

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Aug 3 11:31:23 CEST 2021


Hi Laurent,

On 03/08/2021 10:23, Laurent Pinchart wrote:
> The GL_RG and GL_RED texture formats are not supported in OpenGL ES
> prior to 3.0. In order to be compatible with OpenGL ES 2.0, use
> GL_LUMINANCE_ALPHA and GL_LUMINANCE instead. The shader code needs to be
> updated accordingly for GL_RG, as the second component is now stored in

/in alpha/in the alpha/

> alpha component instead of the green component. Usage of the red
> component is fine, the luminance value is stored in the red, green and
> blue components.
> 

So these seem to be just fairly arbitrary identifiers of the texture
maps to use, which as long as they are consistently referenced that's
all that matters?


> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> Tested with vivid, using NV12, YV420, YVU420 and SGRBG8, which should
> cover all code paths.
> ---
>  src/qcam/assets/shader/YUV_2_planes.frag |  4 +--
>  src/qcam/viewfinder_gl.cpp               | 40 ++++++++++++------------
>  2 files changed, 22 insertions(+), 22 deletions(-)
> 
> diff --git a/src/qcam/assets/shader/YUV_2_planes.frag b/src/qcam/assets/shader/YUV_2_planes.frag
> index 125f1c850a33..254463c05cac 100644
> --- a/src/qcam/assets/shader/YUV_2_planes.frag
> +++ b/src/qcam/assets/shader/YUV_2_planes.frag
> @@ -26,9 +26,9 @@ 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;
> +	yuv.z = texture2D(tex_u, textureOut).a - 0.500;
>  #elif defined(YUV_PATTERN_VU)
> -	yuv.y = texture2D(tex_u, textureOut).g - 0.500;
> +	yuv.y = texture2D(tex_u, textureOut).a - 0.500;
>  	yuv.z = texture2D(tex_u, textureOut).r - 0.500;
>  #else
>  #error Invalid pattern
> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp
> index e7c8620c7024..77a6437e56fd 100644
> --- a/src/qcam/viewfinder_gl.cpp
> +++ b/src/qcam/viewfinder_gl.cpp
> @@ -481,11 +481,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width(),
>  			     size_.height(),
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_);
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
> @@ -495,11 +495,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[1]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RG,
> +			     GL_LUMINANCE_ALPHA,
>  			     size_.width() / horzSubSample_,
>  			     size_.height() / vertSubSample_,
>  			     0,
> -			     GL_RG,
> +			     GL_LUMINANCE_ALPHA,
>  			     GL_UNSIGNED_BYTE,
>  			     data_ + size_.width() * size_.height());
>  		shaderProgram_.setUniformValue(textureUniformU_, 1);
> @@ -511,11 +511,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width(),
>  			     size_.height(),
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_);
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
> @@ -525,11 +525,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[1]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width() / horzSubSample_,
>  			     size_.height() / vertSubSample_,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_ + size_.width() * size_.height());
>  		shaderProgram_.setUniformValue(textureUniformU_, 1);
> @@ -539,11 +539,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[2]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width() / horzSubSample_,
>  			     size_.height() / vertSubSample_,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_ + size_.width() * size_.height() * 5 / 4);
>  		shaderProgram_.setUniformValue(textureUniformV_, 2);
> @@ -555,11 +555,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width(),
>  			     size_.height(),
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_);
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
> @@ -569,11 +569,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[2]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width() / horzSubSample_,
>  			     size_.height() / vertSubSample_,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_ + size_.width() * size_.height());
>  		shaderProgram_.setUniformValue(textureUniformV_, 2);
> @@ -583,11 +583,11 @@ void ViewFinderGL::doRender()
>  		configureTexture(*textures_[1]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     size_.width() / horzSubSample_,
>  			     size_.height() / vertSubSample_,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_ + size_.width() * size_.height() * 5 / 4);
>  		shaderProgram_.setUniformValue(textureUniformU_, 1);
> @@ -674,18 +674,18 @@ void ViewFinderGL::doRender()
>  	case libcamera::formats::SRGGB12_CSI2P:
>  		/*
>  		 * Raw Bayer 8-bit, and packed raw Bayer 10-bit/12-bit formats
> -		 * are stored in GL_RED texture.
> -		 * The texture width is equal to the stride.
> +		 * are stored in GL_LUMINANCE texture. The texture width is

I know you're modifying an existing sentence, but should this read either:

 - are stored in a GL_LUMINANCE texture
or
 - are stored in the GL_LUMINANCE texture

depending on if there is only one GL_LUMINANCE texture, or if there
might be more and this is specifically allocated.

(That extra clarification would help me understand those identifiers
too... such power from a single word addition).

Anyway, aside from / with that:

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


> +		 * equal to the stride.
>  		 */
>  		glActiveTexture(GL_TEXTURE0);
>  		configureTexture(*textures_[0]);
>  		glTexImage2D(GL_TEXTURE_2D,
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     stride_,
>  			     size_.height(),
>  			     0,
> -			     GL_RED,
> +			     GL_LUMINANCE,
>  			     GL_UNSIGNED_BYTE,
>  			     data_);
>  		shaderProgram_.setUniformValue(textureUniformY_, 0);
> 


More information about the libcamera-devel mailing list