Hi there
This question doesn’t actually refer to the OpenGL. Our testers has detected that the following code finds the graphic card incorrectly. As an example, when using the nvidia graphic card, It reports that the user is using the ATI graphic card:
bool GRAPHICCARD::detect()
{
char renderer[256] = "";
if( glGetString( GL_VENDOR ) == NULL )
MessageBox( NULL, "Couldn't detect the Graphic Card.
The implementation is undefined .", "Persian Engine Error", MB_OK | MB_ICONINFORMATION );
else
{
strcpy( renderer, (char*)glGetString( GL_VENDOR ) );
strupr( renderer );
if( strstr( renderer, "MICROSOFT" ) != NULL )
{
MessageBox( NULL, "The Graphic Card was not installed.", "Persian Engine Error", MB_OK | MB_ICONINFORMATION );
if( strstr( renderer, "NVIDIA" ) != NULL )
{
MessageBox( NULL, "You are using the NVIDIA graphic card.
Now we run the installshield software
to setup your graphic card", "Persian Engine Report", MB_OK | MB_ICONINFORMATION );
//Execute NVIDIA driver here
ShellExecute(NULL, NULL, "Drivers\\NVIDIA\\93.71_forceware_winxp2k_english_whql.exe" ,NULL, NULL, SW_SHOWNORMAL );
}
else if( strstr( renderer, "ATI" ) != NULL )
{
MessageBox( NULL, "You are using the ATI graphic card.
Now we run the installshield software
to setup your graphic card", "Persian engine Report", MB_OK | MB_ICONINFORMATION );
//Execute ATI driver here
ShellExecute(NULL, NULL, "Drivers\\ATI\\6-11-pre-r300_xp-2k_dd_ccc_wdm_38185.exe" ,NULL, NULL, SW_SHOWNORMAL);
}
else
MessageBox( NULL, "For more information about the graphic card
take a look at the text file loacated
in the CD-ROM", "Persian Engine Error", MB_OK | MB_ICONINFORMATION );
return false;
}
}
return true;
}
on my card the vendor string is “NVIDIA Corporation”, which also contains “ati”. it is lowercase, so strstr should return NULL, but you never know…have you displayed and checked the complete string?
That’s why it is a good idea not to hard code things like this into your application.
strstr just looks for a substring. It might be safer to use strcmp, but again, not a great idea.
How can i satart conding openGL on Solaris. Sun delivers an implementation but is just for sparc. is there any implmentation for x86? let`s say amd athlon 64 bits
The thing is that you test “NVIDIA” before “ATI” so maybe some nVIDIA cards are not referenced as “nvidia” but something else with the substring “ati”, like “nv corporation” or something like that.
I have to think about games like Chronicles of Riddick, that fail to accept OpenGL 2.0 as version higher then 1.5 :-/ Such recognition code is bad and will break. On windows, you cold use something like this http://www.developer.nvidia.com/object/device_ids.html
I’m not sure this is the way to do. This will lead to a problem just like you mention: newer card won’t be detected until the game is patched. And uncommon cards will likely not be detected at all.
Well, if each vendor has his own registered ID (not the device ID, but vendor’s ID), then at least the vendor recognition should be reliable. Of course, newer cards won’t be detected but I don’t see any solution to that problem
I’ve seen only the second link and gives the id for each card not the vendor. If other links (not looked at them yet) give the vendor id, then it can be a good solution right !