OpenGL separate shader object behaves differently on Linux (vs Windows) on state change

Hi. I believe I hit a driver bug on Linux.
My system: GTX960M , Ubuntu 16.04 64bit. OpenGL 4.5

In my engine I use regular shader program,and also separate shader objects via shader pipelines.
Now, I got a very obscure and nasty bug,where at the start of the app’s live cycle I had to do some render pass,which involved usage of pipeline. I notices that at the first time(when the app has just started running),the pipeline and its program functioned fine. But on the second run (the app is still running,but the logic is reset),the prog stopped working. by “stopped working” I mean that the draw call resulted in a black area where the geometry fragments supposed to be. I compared to Windows,and didn’t get the same bug. After digging into the problem for several hours,i found that it happened because at the end of the first rendering cycle I didn’t unbind the regular shader program from the last render pass. So it screw the separate shader object pass,which comes at the start of the next cycle. And it doesn’t happen on Windows! I am using GL DEBUG output extension,and that one doesn’t report anything abnormal either. I was basically aware for a long time that it is hazardous to mix regular programs and those which used with pipelines. But in this case what stroke me that I got this bug only one Windows,while still using the same drivers and same GPU. Also,it really would help if the driver spit some sort of notification in such a case,because detecting this bug in large scale application can be a nightmare. Needless to say,I even can’t use neither NSight,nor RenderDoc for this one,as I am using NV_PATH extension which shuts down those tools on the spot.

Thanks for the report. As you’ve discovered, an active “global” program will override any bound program pipeline and separate shader programs, as pointed out in paragraph 7 of the “Program Pipeline Objects” section of the separate shader objects extension specification:

“If there is a current program object established by UseProgram, the bound program pipeline object has no effect on rendering or uniform updates.”

I agree it is unexpected that this behavior would differ between Windows and Linux though. I don’t see anything obvious that would cause that divergence. If you could share a trace that reproduces the issue, or some sample code, we could investigate.