OpenGL core profile incredible slowdown on OS X

后端 未结 2 784
伪装坚强ぢ
伪装坚强ぢ 2020-12-16 06:36

I added a new GL renderer to my engine, which uses the core profile. While it runs fine on Windows and/or nvidia cards, it is like 10 times slower on OS X (

相关标签:
2条回答
  • 2020-12-16 06:52

    Finally, I was able to reproduce the slowdown. This is just crazy... It is clearly caused by glBindAttribLocation being called on the "my_Position" attribute. Now I did some testing:

    • 1 is default (as returned by glGetAttribLocation)
    • if I set it to zero, theres no problem
    • if I set it to 1, the rendering becomes slow
    • if I set it to any larger number, it is slow again

    Obviously I relink the program (check code). It is not a problem in the implementation, I tested it with "normal" values too.

    Test program:

    https://www.dropbox.com/s/dgg48g1fwgyc5h0/SLOWDOWN_REPRO.zip

    How to repro:

    • open with XCode
    • open common/glext.h (don't be disturbed by the name)
    • modify the GLDECLUSAGE_POSITION constant from 0 to 1
    • compile and run => slow
    • changing back to zero => good
    0 讨论(0)
  • 2020-12-16 07:08

    I have managed to get myself the same problem in the following circumstance under OS X Mavericks:

    • Instanced rendering using array buffers to give each instance its own modelToWorld and inverseNormal matrices; attribute locations are being specified through layout rather than using glGetAttribLocation

    • leaving one of these array buffers unused in the shader, where location is declared but the attribute isn't actually used for anything in the glsl code

    In this case, a call to glDrawElementsInstanced takes up a LOT of CPU time (under normal circumstances, this call uses nearly zero CPU even when drawing several thousand instances).

    You can tell that you're getting this specific problem if almost all of the CPU time used within glDrawElementsInstanced is spent in gleDrawArraysOrElements_ExecCore. Making sure that all of the array buffers are actually referenced in your shader code fixes the CPU time back to (nearly) zero.

    I suspect that this is one of the situations where leaving a variable out of your main() in glsl confuses the compiler in to deleting all reference to that variable, leaving you with a dangling reference to an attribute or uniform.

    0 讨论(0)
提交回复
热议问题