SW:Linux 4.14.98_2.2.0 bsp 版本,gpu sdk 5.3.0 和本文档中的补丁
硬件:i.MX8QXP MEK 板
受到 GIMP 调整色彩曲线工具的启发,我为 i.MX8QXP 伽马曲线调整编写了类似的 gui 测试代码。
即显示屏上先显示一条直线曲线,用鼠标改变这条曲线的任意一部分,然后计算出改变后的曲线上点的值,再将相关值传递给i.MX8QXP DPU gammcor单元,最后通过DPU改变显示效果。
当测试代码启动时,将在显示屏上绘制 Y=X 曲线,即从 (0,0) 到 (500, 500) 到 (1023,1023)。当你用鼠标拖动曲线的某些部分后,会生成一个不在原始Y=X曲线上的新点(x_new,y_new)。然后需要绘制一条经过(0,0),(500, 500),(x_new,y_new),(1023,1023)的新曲线。那条新曲线,我选择使用 Catmull-Rom 样条线来获得它。
使用Catmull-Rom样条线来近似一条经过n个点的曲线,则需要n+2个控制点。可以根据需要选择额外的 2 个点,它们将影响曲线的形状。
Catmull-Rom 样条函数可以穿过所有控制点,具有 C1 连续性,不具有凸包性质。
例如有四个控制点p0,p1,p2,p3,若要绘制经过这四个控制点的曲线,可以将其划分为线段p0到p1,线段p1到p2,线段p2到p3。
对于 p1 到 p2 段,选择四个控制点作为 p0,p1, p2, p3,使用 Catmull-Rom 样条线如下:
对于 p0 到 p1 段,需要使用四个控制点作为 p0、p0、p1、p2:
对于 p2 到 p3 段,需要使用四个控制点作为 p1、p2、p3、p3:
在这个测试代码中,我将使用 gpu 顶点着色器来计算曲线的每个段,然后使用变换反馈将每个段的点值读回 cpu 端,cpu 端将相关值传递给 DPU gammcor 单元进行伽马调整。
测试步骤:
在 linux-imx 上将 8qxp_dpu_gammacor_4.14.98_2.2.0.diff 应用于 i.MX8QXP DPU 设备驱动程序。
在 imx-gpu-sdk 上应用 dpu_gamma_curve_gpusdk5.3.0.diff 来构建此 gui 测试代码。
更新新的内核映像,并将测试代码复制到rootfs。
首先运行任何其他应用程序在屏幕上绘制一些东西,例如 /usr/share/cinematicexperience-1.0/Qt5_CinematicExperience。
然后在此代码 S01_SimpleTriangle_Wayland 中运行 gui 测试代码。
此时显示屏上会显示一条线性曲线,使用鼠标可以随意改变曲线,将鼠标光标靠近曲线,按下鼠标按钮,拖动它,然后释放鼠标按钮,您将看到显示屏上出现新的曲线,并且显示效果也会改变。
参考资料:
3> https://github.com/NXPmicro/gtec-demo-framework