TLS机制:
openGL维护了一个状态机,或者叫上下文;gl开头的api函数,如glUniform4fv,会修改这个上下文
系统中,如果有多个基于openGL的程序在运行,则每个程序有一个独立的上下文。每个程序调用gl api都作用于自己的上下文。
但是,libGL.so是一个共享库,每个基于openGL的程序都将其映射到自己的地址空间,共享库的代码段在系统运行期间是不变的。要同一份二进制程序,在不同程序中访问到各程序自己的gl上下文,线程本地存储(TLS / thread local storage)机制就是为了解决这个问题
每个线程有独立的地址空间,并且其中有一块用作线程本地存储(TLS)。操作系统在上下文切换时,会将TLS指针放进一个特殊的寄存器;共享库读取这个寄存器,就可以得到该线程的TLS指针,而上下文在TLS段中具体什么位置,是编译器决定的。
也就是说,约定所有程序的上下文指针都存在TLS段中特定位置,则libGL.so中读取TLS指针,加上特定偏移,就可以得到gl上下文
libGL.so基本原理
应用程序调用gl开头的函数,这些函数的定义都在libGL.so中
每个api函数的入口实现是统一的:读取TLS指针,从TLS段中读取分发表指针,从分发表中特定偏移处读取实际的实现函数的指针,通过这个函数指针进行调用
也就是说,libGL.so这个共享库是一个空壳,一个中介。在使用这个库提供的gl api函数之前,应用程序要先创建上下文和分发表,并将上下文和分发表的指针写进TLS中
上下文和分发表的定义在驱动中&