From patchwork Tue Aug 3 09:23:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 13176 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id F3FCAC3232 for ; Tue, 3 Aug 2021 09:23:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4B3EA687D8; Tue, 3 Aug 2021 11:23:29 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="aulJ0heh"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C44AB6026D for ; Tue, 3 Aug 2021 11:23:27 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2908ADD; Tue, 3 Aug 2021 11:23:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1627982607; bh=w1PYeySMWK/P4PQu2BoAssinVMj0TfaD9O0UhfW9gJg=; h=From:To:Cc:Subject:Date:From; b=aulJ0hehGwVFcjl8NLNhwPdwLhtYDr/aSfIuRY44jd+5jT9QygKwhjESknxlvhqGM yUmC4oDLaZ7r/ldszw9shyL2kzgUdq2Xb3ztvHtqtDImGtpXIVATsmEPOLYUTi6oS2 3f+DcKb51ttyJsG/ZqdlpDk7YAWxW8nPdoHEA2X8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 3 Aug 2021 12:23:10 +0300 Message-Id: <20210803092310.11956-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] qcam: Support OpenGL ES 2.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 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. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Andrey Konovalov --- 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 + * 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);