mercoledì 11 settembre 2013

Errore OpenGl (FreeGlut) in Virtualbox

UPDATE 2
------------------------------------------------------------
Dopo un po' di prove ho isolato il problema
Il programma che disegna il cubo e che funzionava in CentOS e non in Debian ha smesso di funzionare nel momento in cui ho installato le Guest Additions alla macchina CentOS.
Per cui il difetto non e' nelle librerie OpenGL ma nell'implementazione OpenGL fatta da Virtualbox nelle Guest Additions
--------------------------------------------------------------

UPDATE
------------------------------------------------------------
ho riprovato dopo un po' di tempo e mi sono reso conto che l'errore di segmentazione su VirtualBox delle OpenGL non e' totalmente a carico di software di virtualizzazione

Infatti questo codice

//////////////////////////////////////////////////////////////
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             /* clear the matrix */
           /* viewing transformation  */
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glScalef (1.0, 2.0, 1.0);      /* modeling transformation */ 
   glutWireCube (1.0);
   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
   glMatrixMode (GL_MODELVIEW);
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
}
//////////////////////////////////////////////////////////////
compilato con 
gcc cubo.cpp -lglut -lGLU
Su Debian Testing in Virtuabox crasha brutalmente




Invece su CentOS , installando le librerie come segue

yum install freeglut freeglut-devel libX11-devel mesa-libGLU-devel

il programma funziona correttamente



c'e' da dire che CentOS usa generalmente librerie e programmi piu' vecchi rispetto a Debian Testing per cui il problema potrebbe essere proprio da ricercare nelle librerie OpenGL ed il non aggiornamento di Virtualbox
------------------------------------------------------------



Tentando di compilare il sorgente sottostante (un esempio di OpenGl) in una Debian Box in VirtualBox e' comparso il seguente messaggio


OpenGL Warning: XGetVisualInfo returned 0 visuals for 0x8807240
OpenGL Warning: Retry with 0x8002 returned 0 visuals


Errore di segmentazione


----------------------------------------
#include "GL/freeglut.h"
#include "GL/gl.h"

/* display function - code from:
     http://fly.cc.fer.hr/~unreal/theredbook/chapter01.html
This is the actual usage of the OpenGL library. 
The following code is the same for any platform */
void renderFunction()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glBegin(GL_POLYGON);
        glVertex2f(-0.5, -0.5);
        glVertex2f(-0.5, 0.5);
        glVertex2f(0.5, 0.5);
        glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}

/* Main method - main entry point of application
the freeglut library does the window creation work for us, 
regardless of the platform. */
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow("OpenGL - First window demo");
    glutDisplayFunc(renderFunction);
    glutMainLoop();    
    return 0;
}
----------------------------------------

Il problema e' relativo alla software di virtualizzazione (Virtualbox) che, nonostante sia spuntato l'utilizzo dell'accelerazione 3D, non gestisce in modo corretto OpenGL e quindi genera un errore che su una macchina reale sarebbe assente