[OpenGL] PBO ok avec Intel mais pas avec NVIDIA - OpenTK
Bonjour à tous,
Sur mon PC j'ai deux cartes graphiques. une Intel HD Graphics 4600 et une NVIDIA Quadro K1100M.
J'utilise OpenGl 4.x avec OpenTK et un soft en C# sous Visual 2015.
J'envois au GPU une image à 8Hz, j'effectue un traitement et une visualisation puis je récupère l'image traitée dans le CPU à l'aide des PBO.
Je demande l'écriture de l'image dans m_PboWrite et je viens la lire à la frame suivante grâce au flip de m_PboWrite et m_PboRead.
Le code suivant récupère l'image:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| private void SaveWithPBO( string Name )
{
int W = m_Width;
int H = m_Height;
int Bulle = m_PboRead;
m_PboRead = m_PboWrite;
m_PboWrite = Bulle;
GL.BindTexture( TextureTarget.TextureRectangle, m_TextureOut );
GL.BindFramebuffer( FramebufferTarget.Framebuffer, m_FBO );
GL.ReadBuffer( ReadBufferMode.ColorAttachment0 );
GL.BindBuffer( BufferTarget.PixelPackBuffer, m_PboWrite );
GL.ReadPixels( 0, 0, W, H, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero ); // demande de lecture non bloquante;
GL.BindBuffer( BufferTarget.PixelPackBuffer, m_PboRead );
IntPtr Data = GL.MapBuffer(BufferTarget.PixelPackBuffer, BufferAccess.ReadOnly); // lecture de la frame précédente
Bitmap bmp = new Bitmap(W, H);
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, W, H), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
IntPtr ptr = bmpdata.Scan0;
long size = (long)(W * H * 4 );
unsafe
{
Buffer.MemoryCopy( Data.ToPointer(), ptr.ToPointer(), size, size );
}
bmp.UnlockBits( bmpdata );
SaveToDisk( ref bmp, Name );
GL.UnmapBuffer( BufferTarget.PixelPackBuffer );
GL.BindBuffer( BufferTarget.PixelPackBuffer, 0 );
} |
A noter que je n'écris l'image sur le disque que de temps en temps (1 frame / 100) voir je commente la ligne SaveToDisk.
Tout fonctionne très bien, sauf ......
Le code ci-dessus est super efficace avec la carte Intel. Il y a bien une lecture asynchrone non bloquante et je peux tenir ma fréquence de 8Hz sans problème. :D:D:D:D:D
Par contre quand j'exécute le MEME soft avec la carte NVIDIA (à priori plus performante) les appels deviennent bloquant et ma fréquence chute de moitié. J'obtiens les mêmes performances qu'avec un simple glGetTextImage. :(:(:(:(:(
Y a-t-il une particularité de NVIDIA que j'ignore?
Merci pour votre aide et vos idées.
Lionel