Results 1 to 3 of 3

Thread: Trying to implement EGL in SDL

  1. #1
    Junior Member
    Join Date
    Apr 2006
    Location
    Birmingham, England
    Posts
    4

    Trying to implement EGL in SDL

    I am at this moment using SDL just for testing purposes. Whilst using EGL, I have found quite straight forward using this API with Win32 API. In Win32, all I have to do is link the hwnd pointer, which handles the createWindow function to the third parameter in eglCreateWindowSurface() function. But in SDL, I do not know which pointer function to place, or anything. Here is an example of the code i have worked with.

    Here is my code
    Code :
    Code:
    #include <vg/egl.h>
    #include <gles/gl.h>
    #include <vg/openvg.h>
    #include <vg/vgu.h>
    #include <sdl.h>
    #include <stdlib.h>
    #include <math.h>
    #include <stdio.h>
     
    #define COLOR_SPACE EGL_COLORSPACE_sRGB
    #define ALPHA_FORMAT EGL_ALPHA_FORMAT_NONPRE
    #define SURFACE_TYPE EGL_WINDOW_BIT | EGL_PBUFFER_BIT
     
    #define PBUFFER_WIDTH   256
    #define PBUFFER_HEIGHT   256
     
    EGLDisplay   egldisplay;
    EGLConfig   eglconfig;
    EGLContext   eglContextOpenGLES;
    EGLContext   eglContextTexture;
    EGLContext   eglContextRenderer;
    EGLSurface   eglWindowSurface;
    EGLSurface   eglPBufferSurface;
     
    bool active = true;
     
    int width;
    int height;
    void closeApplication()
    {
       eglMakeCurrent(egldisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
       eglTerminate(egldisplay);
    }
     
    static void setGLESperspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar)
    {
       GLfloat xmin, xmax, ymin, ymax;
     
       ymax = zNear * (GLfloat)tan(fovy * 3.1415962f / 360.0);
       ymin = -ymax;
       xmin = ymin * aspect;
       xmax = ymax * aspect;
     
       glFrustumf(xmin, xmax, ymin, ymax, zNear, zFar);
    }
     
    SDL_Surface* initSDL(int Swidth, int Sheight, char *AppName){
       SDL_Init(SDL_INIT_VIDEO);
       SDL_WM_SetCaption(AppName,AppName);
       SDL_WM_SetIcon(SDL_LoadBMP("icon.bmp"), NULL);
       SDL_SetVideoMode(Swidth,Sheight, 32, SDL_SWSURFACE | SDL_HWSURFACE);// | SDL_FULLSCREEN );
       return 0;
    }
     
    int main(int argc, char **argv)
    {
       float aspect      = height ? (float)width/(float)height : 1.0f;
    width = 640; height = 480;
     
    SDL_Surface* screen = initSDL(width,height,&"SDL - EGL BINDINGS - April 2006 - DWilson");
     
    static const EGLint s_surfaceAttribs[] =
       {
          EGL_COLORSPACE,      COLOR_SPACE,
          EGL_ALPHA_FORMAT,   ALPHA_FORMAT,
          EGL_NONE
       };
     
    static const EGLint s_configAttribs[] =
       {
          EGL_RED_SIZE,      8,
          EGL_GREEN_SIZE,    8,
          EGL_BLUE_SIZE,      8,
          EGL_ALPHA_SIZE,    8,
          EGL_LUMINANCE_SIZE, EGL_DONT_CARE,
          EGL_SURFACE_TYPE,         SURFACE_TYPE,
          EGL_RENDERABLE_TYPE,      EGL_OPENVG_BIT & EGL_OPENGL_ES_BIT,
          EGL_BIND_TO_TEXTURE_RGBA,   EGL_TRUE,
          EGL_NONE
       };
     
    static const EGLint s_pbufferAttribs[] =
       {
          EGL_WIDTH,         PBUFFER_WIDTH,
          EGL_HEIGHT,         PBUFFER_HEIGHT,
          EGL_COLORSPACE,      COLOR_SPACE,
          EGL_ALPHA_FORMAT,   ALPHA_FORMAT,
          EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
          EGL_TEXTURE_TARGET,   EGL_TEXTURE_2D,
          EGL_NONE
       };
     
       EGLint majorVersion;
       EGLint minorVersion;
     
       egldisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
       eglInitialize(egldisplay, &majorVersion, &minorVersion);
     
       EGLint numconfigs;
       eglGetConfigs(egldisplay, NULL, 0, &numconfigs);
     
       eglChooseConfig(egldisplay, s_configAttribs, &eglconfig, 1, &numconfigs);
     
       //create a rendering surface and a context
       eglWindowSurface = eglCreateWindowSurface(egldisplay, eglconfig, (SDL_Surface*)screen, s_surfaceAttribs);
     
       eglPBufferSurface = eglCreatePbufferSurface(egldisplay, eglconfig, s_pbufferAttribs);
     
    eglContextRenderer = eglCreateContext(egldisplay, eglconfig, NULL, NULL);
     
       eglBindAPI               (EGL_OPENGL_ES_API);
       eglContextOpenGLES   = eglCreateContext(egldisplay, eglconfig, NULL, NULL);
     
       eglMakeCurrent(egldisplay, eglWindowSurface, eglWindowSurface, eglContextOpenGLES);
     
       glViewport         (0, 0, width, height);
       glScissor         (0, 0, width, height);
       glMatrixMode      (GL_MODELVIEW);
     
             /* Update the projection matrix */
       glMatrixMode      (GL_PROJECTION);
       glLoadIdentity      ();
       setGLESperspective   (60.f, aspect, 0.1f, 100.f);
     
       while(active){   
     
       Uint8 *keystate = SDL_GetKeyState(NULL);
              SDL_Event event;
             while( SDL_PollEvent( &event ) )
             {
                if( event.type == SDL_QUIT )
                   {
                   active = false;   //Quit the program 
                   }
             }
     
             if ( keystate[SDLK_ESCAPE]){
                active = false;
             }
     
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    glLoadIdentity();
    glMatrixMode      (GL_MODELVIEW);
    glLoadIdentity      ();
       }
       closeApplication();
       return 0;
    }

    The code is self explanatory as you may have noticed. I have tried many versions and re-written the code several times, but it is in more stable form, except for a line of code that is causing a major flaw in the application. The Pbuffer is working ok as I have had it checked and debugged, but the main window isnt rendering due to this line eglWindowSurface = eglCreateWindowSurface(egldisplay, eglconfig, (SDL_Surface*)screen, s_surfaceAttribs);

    I have been using openGL for many years, but I am relatively new to EGL, and SDL. I know it is possible, as I have seen the same usage of EGL in native 1998 version of GLUT. I assume that if GLUT can handle it, SDL must be able to as it is an window management wrapper for all OS especially Windows.

    If anyone could help me, it would be greatly appreciated
    Regards
    Dave
    David Wilson
    Graphics Designer and Programmer

  2. #2
    Junior Member
    Join Date
    Jan 2007
    Posts
    1

    Re: Trying to implement EGL in SDL

    Quote Originally Posted by WillPash
    I am at this moment using SDL just for testing purposes. Whilst using EGL, I have found quite straight forward using this API with Win32 API. In Win32, all I have to do is link the hwnd pointer, which handles the createWindow function to the third parameter in eglCreateWindowSurface() function. But in SDL, I do not know which pointer function to place, or anything. Here is an example of the code i have worked with.
    ...
    I am not an SDL expert, but you might need to use a native window type (e.g., HWND for Windows) as requested by the eglCreateWindowSurface function.

    In particular, to SDL, it might be possible to obtain the native window id using a code sequence similar to:

    Code :
    SDL_SysWMinfo wmInfo;
    SDL_VERSION(&wmInfo.version);
    SDL_GetWMInfo(&wmInfo);
    NativeWindowType hWnd = (NativeWindowType) wmInfo.window;

    A second remark would be related to the eglBindAPI call. Normally it would be placed (at least) before creating the rendering context.

  3. #3
    Junior Member
    Join Date
    Mar 2009
    Location
    Redmond, Wa
    Posts
    13

    Re: Trying to implement EGL in SDL

    Not that this is the cause of your problems, but I noticed this line in your code:

    Code :
    EGL_RENDERABLE_TYPE,      EGL_OPENVG_BIT & EGL_OPENGL_ES_BIT,

    Did you mean to use a "&" instead of a "|"?

Similar Threads

  1. EGL integration in SDL for windows
    By vikas in forum Cross API and window system integration
    Replies: 0
    Last Post: 09-26-2012, 10:38 PM
  2. EGL and SDL Context Creation.
    By Adventus in forum Cross API and window system integration
    Replies: 3
    Last Post: 03-07-2009, 03:03 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
  •