OpenGL 1.0 et 1.1 Pointeurs de fonction sous Windows

Je suis un peu confus quant à la nature des pointeurs de fonction OpenGL 1.0 et 1.1 sur Windows. Je pense que je l’ai bien compris, mais je ne suis pas sûr à 100%, alors j’espère que quelqu’un pourra confirmer ou commenter ma compréhension actuelle:

Je crois savoir que vous devez charger les fonctions 1.2+ avec wglGetProcAddress() , mais que les fonctions 1.0 et 1.1 doivent être chargées avec GetProcAddress() via opengl32.dll . Ce qui attire mon attention, cependant, est que wglGetProcAddress() renvoie supposément des pointeurs de fonctions différents selon le contexte HGLRC actuel. Pourtant, les pointeurs 1.0 et 1.1 de GetProcAddress() sont toujours les mêmes. Cette disparité de comportement est inhabituelle.

Alors, disons que j’ai une situation où j’ai plusieurs objects HGLRC , nous les appellerons A et B J’appelle wglGetProcAddress() et je garde les résultats dans des pools de pointeurs distincts, un pour A et un autre pour B Cependant, je dois aussi charger les fonctions 1.0 et 1.1 dans ces pools de pointeurs et, dans ce cas, il semble que les pointeurs pour A et B seront toujours les mêmes.

Ce qui me surprend, c’est que les fonctions 1.0 et 1.1 doivent donc être des wrappers minces qui redirigent les appels OpenGL vers le pilote associé au HGLRC actuel. Cependant, si un tel mécanisme de redirection est déjà en place sur Windows, je me demande pourquoi wglGetProcAddress() ne peut pas également l’utiliser, car cela réduirait le risque de renvoyer des pointeurs dépendants du contexte. Je n’ai même pas nécessairement besoin de connaître la réponse à cette question, mais la présence même de la question est ce qui me fait me demander si je comprends bien les choses pour commencer.

La raison en est simple: les symboles pour OpenGL-1.1 sont un ensemble fixe, donc la DLL d’interface opengl32.dll peut contenir à la fois l’implémentation de secours et les trampolines dans l’implémentation OpenGL complète fournie par le pilote graphique (ICD) . Ces symboles sont exposés par la DLL d’interface dans la table des symboles et sont donc accessibles avec GetProcAddress .

Tout ce qui dépasse la version OpenGL-1.2 est inconnu de la bibliothèque d’interface. Par conséquent, opengl32.dll ne contient pas de repli ni de trampoline dans l’ICD pour ces fonctions. Au lieu de cela, il agit comme un proxy qui transmet l’appel à wglGetProcAddress à l’implémentation OpenGL réelle dans le pilote graphique (ICD). Cependant, différents contextes OpenGL pouvant être desservis par différents pilotes graphiques (ICD), le résultat peut être des symboles résidant à des adresses différentes. wglGetProcAddress ne regarde pas la table des symboles de certaines DLL, mais peut être implémentée comme bon lui semble.