eddman wrote on 2025-08-29, 21:42:
Yea, I didn't mean glide as the API interfaces themselves. When launching a glide game the 3dfx logo shows up, which doesn't for OpenGL, which perhaps could be considered an indicator of that.
That's just configuration... I'm sure they had a way of disabling that in code (see later)
eddman wrote on 2025-08-29, 21:42:
I'm not absolutely 100% sure, but AFAICT that's not correct and is being constantly repeated by people without proper evidence, that it's just a wapper to glide. MiniGL seems to be still OpenGL but just a subset of it. Someone more knowledgeable can perhaps shed light on that.
I had a quick look look and the 3dfx MiniGL is a full implementation of the public opengl32.dll exports, but when you decompile it in Ghidra most of the functions are empty and just return without doing anything. I always understood it to be a subset of an OpenGL ICDs functionality, as the above demonstrates. For example glVertex3d (for specifying a vertex position using 3 doubles) returns immediately, glVertex3f (3 floats) stores the provided value for later use.
The point of doing that though is that so long as the calling application only called the implemented functionality then it'd work. The game would be built using the opengl32.lib library as any other OpenGL application. The reason the mini GL is called opengl32.dll and placed in the executables folders is so that it is loaded (by the code in opengl32.lib) over the Microsoft implementation in the system32 folder that would then try to load an ICD. The Mini GL can then do whatever it wants - this is the basis for almost all wrappers.
eddman wrote on 2025-08-29, 21:42:
When launching an OpenGL game with a voodoo (well at least on voodoo 3), the glide3x.dll is loaded and the game fails without it. I don't remember the exact wording but it was along the lines of 3dfx having implemented both the Glide API calls and the backend/driver/whatever-the-correct-term-is that communicates with the card, within the glide DLLs. It seems they didn't want to write a full, separate implementation for OpenGL, so made it go through the backend within the glide DLL.
Not possible to go through the backend within the glide DLL. You can't call code within a DLL that hasn't been exported as part of the public interface... well, you could, but you'd need a method of exporting the function pointers to the using application and that doesn't appear to exist in the glide3x.dll exports as there is nothing there that isn't part of the public API. Of course I suppose it is possible that grGet could have undocumented parameters to return said function pointer array... but it doesn't appear to be so (see below)
If you look at this screenshot of the dependencies for 3dfxOGL.dll (i.e. their ICD) you can see it depends on glide3x.dll (so as you say if that's not present the OpenGL game won't run) and that only depends on windows libraries and ddraw.dll.
The attachment win2k_3dfxogl_dll_depends.png is no longer available
Looking at the decompilation in Ghidra of the ICD you can quite clearly see where it is calling the public API. For example this is from DllMain at process attahment that calls a number of internal functions before calling:
grGlideInit();
grEnable(8) ;
The attachment 3dfxogl_dll_init_decomp.png is no longer available
Now interestingly grEnable only publically accepts 5 values (GR _AA_ORDERED to GR_SHAMELESS_PLUG), defined as 1 to 5 in glide.h, so what does 8 do? Its not documented, but I'd put money on that being part of the "don't show the splashscreen" mechanism or a "this is OpenGL so configure accordingly" call.
Picking any glide function shows similar call graphs from internal code to grWhatever, including grDrawTriangle. There's no magic - they're just using the public API and to be honest who could blame them? They were probably in a rush to develop the ICD to combat nVidia et al so it makes sense to use the public glide API and keep just the one codebase to maintain for actually talking to the hardware.
eddman wrote on 2025-08-29, 21:42:
I'm not a programmer though, and certainly not one familiar with such low-level stuff, so might not be wording it correctly.
That's always the problem with these kinds of discussions as you never quite know how in-depth someones knowledge is. I've got a pretty good understanding of fairly low level stuff but there's always people who know far more than me. It's also been 20+ years since I last worked at that sort of level...
eddman wrote on 2025-08-29, 21:42:
I'm interested to find that original source again, see if I could get more out of it or find some other sources based on that. It might've even been written by someone else, not sure.
TBH all the evidence you need is in the ICD's dependencies and decompiled code (see above)