Results 1 to 3 of 3

Thread: eglCreatePixmapSurface problem: the object is not drawn on t

  1. #1
    Junior Member
    Join Date
    Jan 2005
    Location
    UK
    Posts
    28

    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:rawScreens(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();
    }

  2. #2
    Member
    Join Date
    Sep 2003
    Location
    Silicon Valley
    Posts
    57

    Re: eglCreatePixmapSurface problem: the object is not drawn

    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.
    Jon Leech
    EGL & OpenGL Specification Editor / OpenGL ARB Ecosystem TSG Chair / Khronos API Registrar

  3. #3
    Senior Member
    Join Date
    May 2006
    Posts
    353
    Georg Kolling, Imagination Technologies
    Please ask questions specific to PowerVR hardware or SDKs on the PowerVR Insider Forum
    DevTech@imgtec.com | http://www.powervrinsider.com

Similar Threads

  1. Retaining drawn objects after app goes into background
    By lppier in forum OpenGL ES general technical discussions
    Replies: 6
    Last Post: 02-12-2013, 03:37 PM
  2. Problem using eglCreatePixmapSurface
    By siddy_tow in forum OpenGL ES general technical discussions
    Replies: 0
    Last Post: 08-26-2008, 02:34 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •