Game Development Community

TGB slooow in ATI cards

by Bruno · in Torque Game Builder · 09/09/2010 (9:02 pm) · 9 replies

Hello everyone,

I was just wondering, is anyone experiencing slow down's in ATI cards ?
I'm having reports of major gameplay slowdown in ATI cards, the following cards are having problems, both running in Direct3D and in XP machines :
Is there anything specific that ATI cards might not like ? Something that could give me a clue on where to look at ?
thanks,
Bruno





Card name: ATI MOBILITY RADEON X300
Manufacturer: ATI Technologies Inc.
Chip type: ATI Radeon Graphics Processor (0x5460)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_5460&SUBSYS_056E1014&REV_00
Display Memory: 64.0 MB


Card name: ATI RADEON XPRESS 200M SERIES
Manufacturer: ATI Technologies Inc.
Chip type: ATI Radeon Xpress Series (0x5955)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_5955&SUBSYS_308B103C&REV_00
Display Memory: 128.0 MB


Card name: ATI Mobility Radeon X1600
Manufacturer: ATI Technologies Inc.
Chip type: ATI Radeon Graphics Processor (0x71C5)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_71C5&SUBSYS_30A3103C&REV_00
Display Memory: 256.0 MB

Card name: RADEON 9500
Manufacturer: ATI Technologies Inc.
Chip type: RADEON 9500 AGP (0x4144)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_4144&SUBSYS_00021002&REV_00
Display Memory: 128.0 MB


Card name: ATI Radeon 9550 / X1050 Series
Manufacturer: ATI Technologies Inc.
Chip type: ATI Radeon Graphics Processor AGP (0x4153)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_4153&SUBSYS_2084148C&REV_00
Display Memory: 256.0 MB

Card name: RADEON 9250
Manufacturer: ATI Technologies Inc.
Chip type: RADEON 9250 (0x5960)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_5960&SUBSYS_01601092&REV_01
Display Memory: 256.0 MB

Card name: RADEON 9200 SERIES
Manufacturer: ATI Technologies Inc.
Chip type: RADEON 9250/9200 Series (0x5964)
DAC type: Internal DAC(400MHz)
Device Key: Enum\PCI\VEN_1002&DEV_5964&SUBSYS_7C251545&REV_01
Display Memory: 128.0 MB

#1
09/09/2010 (9:57 pm)
You will absolutely NEED to switch the renderer to "OpenGL" for those cards. Anything Radeon 9550 or older.

It will solve all of your problems (until you get around to intel chipsets).

As to what is causing it -- I can't say... never properly debugged it myself. I just catch the card vendor and set it to OpenGL.

(The bizarre exception is a weird old series of ATI cards called "FireGL"... they seem to like D3D better)

-Tim
#2
09/09/2010 (10:01 pm)
Thanks Tim.
May I ask how do you detect if it's an old ATI Card ?
And this, will this work in other OS's ? Can ATI cards run properly with OpenGL in Vista or Windows7 for example ?

Thanks again ,
Bruno
#3
09/09/2010 (10:08 pm)
We haven't had much issue with Vista or Win7 (at least, I've never seen an issue where OpenGL was faster on one and slower on a different one, etc.)

As for how to detect... look in defaultPrefs.cs for this:

switch$( $PCI_VEN )

There's an ATI section in there... VEN_1002 I think.

If your $PCI_VEN and $PCI_DEV variables are all junk data, I believe there's a resource around here somewhere for that. I think Amaranthia posted it back in the day. (it also may have ended up in 1.7.5 -- I didn't check).

-Tim
#4
09/09/2010 (10:10 pm)
Thanks again,
And yup, my $PCI_VEN and $PCI_DEV are full of junk, that's why I was asking.
Let me see if I can find anything on this.
Thanks,
Bruno
#5
09/09/2010 (10:16 pm)
Found it:

http://www.garagegames.com/community/forums/viewthread/76723

I've found that the first rule of TGB development is to search for "Amaranthia" in the forums and read every thread ever started by her.

:)

** edited to reflect working link **
#6
09/09/2010 (10:19 pm)
Thanks Tim :)
#7
09/09/2010 (11:09 pm)
I’m implementing the resource you pointed out.
The thing is, there’s this bit of code that refuses to compile :

1. // Ok, now we have the primary display device. Parse the device information.
2. char ven[9];
3. char dev[9];
4. ven[8] = dev[8] = '[[4c89bf6adcf04]]';

In line 4 the compiler complains that the variables are out of range. I believe this is because of something about Unicode and Ansi that needed to be
converted, so I ended up cleaning the variables this way :

ZeroMemory(ven,sizeof(ven));
ZeroMemory(dev,sizeof(dev));

I don’t think there’s anything wrong in doing this, works fine on my side, but I don’t want any crashes in other people’s machines.
Anyone knows if this is a safe code ?

Thanks,
Bruno
#8
09/14/2010 (7:43 pm)
My compiler (and myself) had no idea what was going on with that "[[4c89bf6adcf04]]" thing. The guy who did this particular fix literally speaks machine language... so I suspect his compiler is... modified.

Anyway I figured if anything those strings should be null terminated, so I changed line 4 from your list there to:

ven[8] = dev[8] = '\0';

Seemed to work fine, so I never looked back. :)

-Tim
#9
09/15/2010 (12:58 am)
Here's my quick and dirty fix for the problem (using TGB 1.7.5 on Windows 7):

Diff for cardProfile.cpp:
(This is a diff file, please do not copy + paste this into the C++ code!)
31,35c31
<    //pray very hard that we don't have unicode PIDs and VIDs in the future...
<    char devID[128];
<    wcstombs(devID,ddData.DeviceID,128);
< 
<    char *pos = dStrstr( (const char*)devID,(const char *)"VEN_" );
---
>    char *pos = dStrstr( (const char*)ddData.DeviceID,(const char *)"VEN_" );
44c40
<    pos = dStrstr( (const char*)devID, (const char *)"DEV_" );
---
>    pos = dStrstr( (const char*)ddData.DeviceID, (const char *)"DEV_" );

Manual patching:
At line 31 -
//pray very hard that we don't have unicode PIDs and VIDs in the future...
   char devID[128];
   wcstombs(devID,ddData.DeviceID,128);
and finally, replace all instances of "ddData.DeviceID" with "devID" on lines 35 & 44