From patchwork Sun Aug 30 11:51:19 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Murphy X-Patchwork-Id: 28150 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 BBCB6C3344 for ; Sun, 30 Aug 2026 12:10:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9DF6D684BC; Sun, 30 Aug 2026 14:10:20 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=themurphys.eu header.i=christian@themurphys.eu header.b="W73xIbSW"; dkim-atps=neutral Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.10]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4B08B68493 for ; Sun, 30 Aug 2026 13:51:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=themurphys.eu; s=s1-ionos; t=1788090688; x=1788695488; i=christian@themurphys.eu; bh=vK0VsCdiY+gf2FsB6gX91BRD05JCqNDOCnmsBgCAWBw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID: MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=W73xIbSWXkpgjqDub+5/HvAxB1ZJQxD/pSad/JXUaWpvss87g+vsrybrGMCJrJgP LKe8td1oXkh5jEStbYlXDk7SvJC0R0/z33BRQj+MPT+t2DW81Qf4CMFIABWUo6lMi sjAVbIsf9a+ncKT0hMDsFHGeQcx+mFUGt1wfYka9SIk+5Eq7JqTsQVEbLa8khMeLV wKOvtq3VaWTVcVaiPsxqJt5F6TqSeaYiqwhps8SeXttH8gXnpEdCzU/FbWPhUlsyq XigFPvIcgB15ytGmr9eXL9hBi2cOe6YktYVIay1aeVM5VCpDxwLrKx3OgeBMXYbD4 auf2TGw3XDCgEHl1/Q== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from client.hidden.invalid by mrelayeu.kundenserver.de (mreue106 [213.165.67.119]) with ESMTPSA (Nemesis) id 1M7bND-1wxb8n2i69-007JDT; Sun, 30 Aug 2026 13:51:28 +0200 From: Christian Murphy To: libcamera-devel@lists.libcamera.org Cc: Bryan O'Donoghue , Milan Zamazal , Hans de Goede , Kieran Bingham , Laurent Pinchart , Robert Mader , =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= , Christian Murphy Subject: [PATCH 1/2] qcam: viewfinder_gl: Take the stride into account for unpacked Bayer Date: Sun, 30 Aug 2026 12:51:19 +0100 Message-ID: <20260830115120.255815-1-christian@themurphys.eu> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 X-Provags-ID: V03:K1:OpxSq4cKGaDGBCawOzKqk5Kkoa+Nst46SKeRRYVv3HKL55PKzk+ 0MWAfr2RtaEU4U9/mx+FK8iIwwt+XGD5V7qeY1x8z+AxN8wqBuBlLJsuwaIx5sPhSEJGkSY KhNcNCPwyMiprgMHqyVUOP31iuGfvA6K1W429hWrt8LN86uxwKUA+Br+9fZoD7KjwXWMT/g EZb5J3teuhBjnAj+RKLHw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1; M01:P0:xcXOdP17KSM=; HHofLUZQrMHA4+MVk8ZWmTlie+9 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 XO53eUzxw== X-Mailman-Approved-At: Sun, 30 Aug 2026 14:10:16 +0200 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 unpacked Bayer formats upload the frame to a GL_LUMINANCE texture whose width is the stride, but compute the generic stride factor from stridePixels = width, yielding 1.0. The bayer_unpacked shaders then stretch the full stride width across the image width whenever stride != width. Commit 5b609e7a44f1 ("libcamera: shaders: Fix input sampling when width != stride") makes the equivalent correction for the software ISP GPU debayer path. Compute the stride factor from the texture width for the unpacked formats. The packed formats keep stridePixels = width: their fragment shader samples in byte units and handles the stride via tex_step. Compile-tested only. No 8-bit Bayer source was available to exercise qcam's unpacked raw path. Assisted by Claude Code (claude-fable-5). Signed-off-by: Christian Murphy --- src/apps/qcam/viewfinder_gl.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/apps/qcam/viewfinder_gl.cpp b/src/apps/qcam/viewfinder_gl.cpp index 1d3f48917..138f259f0 100644 --- a/src/apps/qcam/viewfinder_gl.cpp +++ b/src/apps/qcam/viewfinder_gl.cpp @@ -546,6 +546,9 @@ void ViewFinderGL::doRender() /* Stride of the first plane, in pixels. */ unsigned int stridePixels; + /* Whether the raw Bayer format is unpacked. */ + bool unpacked = false; + /* Identity CCM */ float ccm[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, @@ -763,6 +766,8 @@ void ViewFinderGL::doRender() case libcamera::formats::SGBRG8: case libcamera::formats::SGRBG8: case libcamera::formats::SRGGB8: + unpacked = true; + [[fallthrough]]; case libcamera::formats::SBGGR10_CSI2P: case libcamera::formats::SGBRG10_CSI2P: case libcamera::formats::SGRBG10_CSI2P: @@ -798,10 +803,10 @@ void ViewFinderGL::doRender() 1.0f / (size_.height() - 1)); /* - * The stride is already taken into account in the shaders, set - * the generic stride factor to 1.0. + * The packed shaders handle the stride themselves through + * tex_step; only the unpacked shaders need the stride factor. */ - stridePixels = size_.width(); + stridePixels = unpacked ? stride_ : size_.width(); /* Colour Correction Matrix */ shaderProgram_.setUniformValue(ccmUniformDataIn_, qCcmMat);