eglCreatePixmapSurface problem: the object is not drawn on t

Hi,

I had problems with setting up the pixmap surface but then i managed to have it working. on the emulator i am having a bitmap in the background and a cube rotating on top of it. however, when i run it on the device i just get the background and no cube on top!!! it seems as if the cube has been hidden by the bitmap.
I am using Nokia Series602.1 on Nokia 6630.

any one know why my poor cube is dismissed???

I noticed something else as well. on the emulator, when i use glClear(GL_COLOR_BUFFER_BIT); the bitmap in the background is cleared to the color specified in glClearColor(); does any one know why this has an effect on the emulator and not on the device, ie the background bitmap stays unchanged (but no cube still!!!).

below is my code
cheers

// this function is called periodically
void CTestContainer::DrawScreens(CFbsBitmap &aFrame)
{
if(iVisited && iFile->iLoaded)
{
// Getting the cube data from a file
iSimpleCube->UseParserData(iFile);
// copying the bitmap to be drawn to another with less color depth (for performance only).
iBitmap1->Create(aFrame.SizeInPixels(),EColor64K);
CFbsBitmapDevice* fbsdevb = CFbsBitmapDevice::NewL(iBitmap1);
CleanupStack::PushL(fbsdevb);
CFbsBitGc* fbsgcb = CFbsBitGc::NewL();
CleanupStack::PushL(fbsgcb);
fbsgcb->Activate(fbsdevb);
fbsgcb->BitBlt(TPoint(0,0),&aFrame);
CleanupStack::PopAndDestroy(2); //pop from cleanupstack and destroy fbsgc, fbsdev
}
else if(!iVisited)
{
EGLint numConfigs = 0;
iFrame = 0;
// Initialize EGL
static const EGLint attribList[] =
{
EGL_SURFACE_TYPE, EGL_PIXMAP_BIT,
EGL_RED_SIZE, 4,
EGL_GREEN_SIZE, 4,
EGL_BLUE_SIZE, 4,
EGL_BUFFER_SIZE, 16,
// EGL_DEPTH_SIZE, 16,
// EGL_NATIVE_RENDERABLE, EGL_TRUE,
EGL_NONE
};

  // creating the display interface to the device default display
  iEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
  if(iEglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS)
      {
       _LIT(KInitializeFailed, "eglGetDisplay failed");
       User::Panic( KInitializeFailed, 0 );
       }

  // Initialising the display   
  if( eglInitialize(iEglDisplay, NULL, NULL) == EGL_FALSE)
     {
       _LIT(KInitializeFailed, "eglInitialize failed");
       User::Panic( KInitializeFailed, 0 );
       }
     
  // Here we get the configs
  if(eglChooseConfig(iEglDisplay, attribList, &iEglSurface, 1, &numConfigs) == EGL_FALSE || eglGetError() != EGL_SUCCESS)
     {
       _LIT(KInitializeFailed, "eglChooseConfig failed");
       User::Panic( KInitializeFailed, 0 );
       }

  // this function here is only for checking it is not actually used in the initialization
  int val = 0;
  eglGetConfigAttrib(iEglDisplay, iEglSurface, EGL_SURFACE_TYPE, &val);
  if(!(val & EGL_PIXMAP_BIT))
     {
       _LIT(KInitializeFailed, "eglGetConfigAttrib failed");
       User::Panic( KInitializeFailed, 0 );
       }

  iEglContext = eglCreateContext(iEglDisplay, iEglSurface, NULL, NULL);
  if(iEglContext == EGL_NO_CONTEXT)
     {
       _LIT(KInitializeFailed, "eglCreateContext failed");
       User::Panic( KInitializeFailed, 0 );
       }
                  
                  // Creating the window graphics context to draw on.
   iWindowGc   = new CWindowGc(iEikonEnv->ScreenDevice());
   iWindow = Window();
            
   if (!iWindowGc || (iWindowGc->Construct() != KErrNone))
     {
       _LIT(KInitializeFailed, "CWindowGc failed");
       User::Panic( KInitializeFailed, 0 );
       }

  //the pixmap buffer
  iBitmap1 = new (ELeave) CFbsBitmap();
  iBitmap1->Create(aFrame.SizeInPixels(),EColor16M);   
  CFbsBitmapDevice* fbsdevb = CFbsBitmapDevice::NewL(iBitmap1);
  CleanupStack::PushL(fbsdevb);
  CFbsBitGc* fbsgcb = CFbsBitGc::NewL();
  CleanupStack::PushL(fbsgcb);
  fbsgcb->Activate(fbsdevb);  
  fbsgcb->BitBlt(TPoint(0,0),&aFrame);
  CleanupStack::PopAndDestroy(2); //pop from cleanupstack and destroy fbsgc, fbsdev

  iEglSurface = eglCreatePixmapSurface(iEglDisplay, iEglSurface, iBitmap1, NULL);   
  eglMakeCurrent(iEglDisplay, iEglSurface, iEglSurface, iEglContext);

   iSimpleCube = CSimpleCube::NewL( size.iWidth, size.iHeight, &Window(), iWindowGc, iBitmap1 ); // Create an instance of SimpleCube
   iSimpleCube->AppInit();          // Initialize OpenGL ES       

  iVisited = ETrue;
  }

iFrame++;
// Call the main OpenGL ES Symbian rendering ‘loop’
iSimpleCube->AppCycle( iFrame );

// Call eglSwapBuffers, which blit the graphics to the window 
eglSwapBuffers( iEglDisplay, iEglSurface );

// To keep the background light on 
if ( !(iFrame%100) )
    {
    User::ResetInactivityTime();
    }
   
if ( !(iFrame%50) )
    {
    User::After(0);
    }

}

void CSimpleCube::AppInit( void )
{
static const GLfloat light_position[] = { -50.f, 50.f, 200.f, 0.f };
static const GLfloat light_ambient[] = { 0.25f, 0.25f, 0.25f, 1.f };
static const GLfloat light_diffuse[] = { 1.f, 1.f, 1.f, 1.f };
static const GLfloat material_spec[] = { 0.f, 0.f, 0.f, 0.f };

glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_spec);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

// Enable back face culling. 
glDisable(GL_DEPTH_TEST);   // this is required for pixmap

/ glDepthMask(GL_FALSE); // no need in pixmap
glDisable(GL_DITHER); // no need in pixmap

glClearColor( 0.f, 0.f, 0.f, 0.f );

// Initialize viewport and projection. 
glViewport( 0, 0, iScreenWidth, iScreenHeight );
glMatrixMode( GL_PROJECTION );
glFrustumf( -1.f, 1.f, -1.f, 1.f, 3.f, 1000.f );
glMatrixMode( GL_MODELVIEW );

glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );

// Set the initial shading mode 
glShadeModel( GL_SMOOTH ); 
// Do not use perspective correction 
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );

glLoadIdentity();
  glTranslatef(0.f, 0.f, -40.f);
} 

void CSimpleCube::AppCycle( TInt iFrame )
{
if(iFile)
{
const GLint cameraDistance = 100;

  // ********** YOU SHOULD NOT CLEAR ANYTHING HERE ***********          
  //   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  //   glClear( GL_COLOR_BUFFER_BIT );   
  /* Animate and draw box */
  glPushMatrix();     
      glTranslatex( 0 , 0 , -cameraDistance << 16 );
      glRotatex( iFrame << 16, 1 << 16,    0   ,    0    );
      glRotatex( iFrame << 15,    0   , 1 << 16,    0    );
      glRotatex( iFrame << 14,    0   ,    0   , 1 << 16 );      
      DrawBox( 15.f, 15.f, 15.f );
  glPopMatrix();
   }

eglWaitGL();
iWindow->Invalidate();
iWindowGc->Activate(*iWindow);
iWindow->BeginRedraw();
iWindowGc->BitBlt(TPoint(0,0), iBitmap1);
iWindowGc->SetPenStyle(CGraphicsContext::ENullPen);
iWindowGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
iWindow->EndRedraw();
iWindowGc->Deactivate();
}

Hi Fadi,

I am not familiar with the specifics of the Symbian implementation. However, what I find a bit mystifying about this code speaking purely from the abstract EGL point of view is that you create an EGL pixmap surface and then try to use it like this:

// Call eglSwapBuffers, which blit the graphics to the window
eglSwapBuffers( iEglDisplay, iEglSurface );

The problem is that pixmap surfaces in EGL are not intended to be visible on screen (for that you should use a window surface associated with a native window). Pixmap surfaces are intended as an offscreen, non-accelerated rendering target. They are defined to only have a front buffer as well, so that SwapBuffers should actually do nothing at all.

Now, there is a lot of Symbian window-system specific code involving the native bitmap underlying the EGL pixmap surface, whose function I do not understand. Maybe on Symbian a pixmap can also be displayed on screen as you do here. But I just want to suggest that you may be doing something EGL is not intended to support.

The problem has been solved:
http://discussion.forum.nokia.com/forum … hp?t=97461

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.