上个礼拜的工作主要focus在Qt widgetgallery 的bug上,“System Modal dialog”item会导致子目录无法返回,花费了很多时间从Qt 的source code方面缩小问题的范围,当时发现background的widget创建会导致graphics context的使用混乱。
唉,debug进行了3,4天以后,几乎失去了所有的方向,能试的方式基本上都试过了,包括怀疑gc的混乱导致texture出了问题,直接从driver的角度关闭texture,结果显示会导致所有的字体都显示不了,跟子目录的退出没有直接关系。
绝望之后卷土重来,发现一个drawable buffer的映射出了问题,glXDestroyContext会注销上下文资源(纹理,3D buffers等),然后DestroyDrawable,包括先unmap,有一个pBuffer在unmap的时候binding的texture refcount不是0,这点比较奇怪,不知道是不是跟处在multiple context环境下有关,窃以为纹理的refcount不为0就表示它还会被用到,不该删除。glx 扩展texture_from_pixmap真是问题多多。
于是改code,加了条件判定,DestroyDrawable的时候如果texture from pixmap refcount 还没消减到0就保留,推迟unmap操作,在app调用ReleaseTexImage脱开pBuffer绑定的时候unmap. 大功告成。这部分修改包括upstream mesa,以后各位3D同仁从mesa repository拿到的code会有一部分出自小女子