I’m currently trying to implement Asynchronous GPU Transfers, based on the paper http://www.nvidia.com/docs/IO/40049/Dual_copy_engines.pdf on a Quadro 2000M with OpenGL 4.3 Beta Notebook drivers.
Asynchronous rendering and downloads seem to work as they should. However, when doing uploads I keep receiving the “Pixel transfer is synchronized with 3D rendering” warning on the upload thread. I have verified that the glDebugMessageCallbackARB providing the warning is invoked on the “Upload” thread after calling the glFenceSync function.
I have 3 different OpenGL contexts (“Render”, “Download”, “Upload”) on different threads created using wglCreateContextAttribsARB, where the shared RC is the “Render” context. Since I have only one copy engine on my Quadro 2000M, I plan to use the same context for both uploads and downloads, as soon as I get this working properly.
The only OpenGL calls the “Upload” thread performs are, glGenTextures, glGenBuffers, glMapNamedBufferRangeEXT(…, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT), glUnmapNamedBufferEXT, glBindBuffer(GL_PIXEL_UNPACK_BUFFER, …), glTextureSubImage2DEXT, and finally glFenceSync.
I do not understand how any of these could cause the warning. If I remove glTextureSubImage2DEXT from the code then I get no warnings (and no uploads).
I have also tried removing all drawing calls in the “Render” thread, but it makes no difference.
What could be causing this behavior? Could it be a bug in the drivers? And how can I debug it? Nsight doesn’t seem to work with the OpenGL 4.3 drivers, and glDebugMessageCallbackARB doesn’t work without.
On a note, I do not use glWaitSync as suggested in the paper, instead I perform glWaitClient sync polling (interleaved with new upload calls) on the “Upload” thread before signaling the drawing thread.