ATI catalyst 10.4 screw up my MRT code

I just upgraded from Catalyst 10.3 to 10.4 on windows xp sp2 ATI HD4670

Now I got a problem in my deferred shading g-buffer MRT code that work perfectly fine in previous release of the driver (10.2 - 10.3) and on NVIDIA card (9800gt)

To make it short it look like glDrawBuffers and glBindFragDataLocation are not matching

let say I have FBO with 5 color attachment (GL_COLOR_ATTACHMENT0 - GL_COLOR_ATTACHMENT4) and a shader that write data 4 out put target

The code to bind output location are as below



glBindFragDataLocation(this->program,0,"normalFragData");
glBindFragDataLocation(this->program,1,"diffuseFragData");
glBindFragDataLocation(this->program,2,"specularFragData");
glBindFragDataLocation(this->program,3,"emissiveFragData");


and this is the code to select draw buffer



//the color attachment 0 is reserved for lighting/shading pass

GLenum targetBuffer[] = {GL_COLOR_ATTACHMENT1,GL_COLOR_ATTACHMENT2,GL_COLOR_ATTACHMENT3,GL_COLOR_ATTACHMENT4};

glDrawBuffers(4,targetBuffer);


The correct behavior (as seen on 10.2-10.3 and my GF9800GT) should be

write normal data into attachment 1
write diffuse data into attachment 2
write specular data into attachment 3
write emissive data into attachment 4

But the catalyst 10.4 instead make

write normal data in to attachment 0
doesn’t write diffuse data
write specular data in to attachment 1
etc…

Please someone with the same problem confirm this for me :sorrow: .
Now I have to revert back to 10.3 to continue working with my Project :frowning: .

I haven’t tested this (my deferred rendering code does it the other way around: ask for the location of fragment output variables, instead of setting them. This works fine with all ATI drivers as far as I know including 10.4).

But one suggestion: perhaps use the OpenGL drivers section for this topic (it might be seen sooner by ATI devs overthere).

I had different shader for g-buffer creation pass (one with normal map /without normal map etc…)

If I use query location method do I have to call glDrawBuffers every time I swap shader or what (since there no guarantee that every shader will assign output fragment datas to the same location )?

The binding method seem more natural for me.

In that case your method probably suits better (and indeed, no guarantees that each shader program takes the same output locations).