[Mesa-users] Give A directFB surface to EGL

Albert Freeman albertwdfreeman at gmail.com
Fri Oct 23 06:08:54 PDT 2015


On 23 October 2015 at 12:16, 刘涛 <liutao586 at 163.com> wrote:
> I apply the patch to Mesa-10.1.3 and then install to execute "./configure
> --prefix=/usr --enable-gles1 --enable-gles2 --enable-gallium-egl
> --with-egl-platforms=directfb --with-gallium-drivers=swrast && make && sudo
> make install" .  Then  recompile my program, execute "export
> GALLIUM_DRIVER=softpipe" and "export LIBGL_ALWAYS_SOFTWARE=1", then execute
> my program, it works, ^_^.  Thanks for you advise.
>
>
>
>
I just got glClear working in a window, although quite a few glitches:
#include <EGL/egl.h>
#include <directfb.h>
#include <GLES2/gl2.h>

IDirectFB*            _pDFB;
IDirectFBDisplayLayer* _pDFBl;
IDirectFBSurface*     _pDFB_surface;
IDirectFBWindow*      _pDFBw;

EGLSurface eglSurface;

int main()
{
    /*1 create Directfb Surface*/
    DFBDisplayLayerConfig dlc;
    DFBSurfaceDescription dsc;
    DFBWindowDescription dsc_w;
    DirectFBInit(0, NULL);
    DirectFBCreate(&_pDFB);
    //_pDFB->SetCooperativeLevel(_pDFB, DFSCL_FULLSCREEN);
    memset(&dsc, 0, sizeof(dsc));
    memset(&dsc_w, 0, sizeof(dsc_w));
    _pDFB->GetDisplayLayer(_pDFB, DLID_PRIMARY, &_pDFBl);
    //_pDFBl->SetCooperativeLevel(_pDFBl, DLSCL_ADMINISTRATIVE);
    dsc_w.flags |= DWDESC_POSX | DWDESC_POSY;
    dsc_w.posx = 0;
    dsc_w.posy = 0;
    dsc_w.flags |= DWDESC_WIDTH | DWDESC_HEIGHT;
    dsc_w.width = 640;
    dsc_w.height = 480;
    dsc_w.surface_caps = DSCAPS_FLIPPING | /*DSCAPS_PRIMARY |*/
DSCAPS_GL | DSCAPS_DOUBLE;
    _pDFBl->CreateWindow(_pDFBl, &dsc_w, &_pDFBw);
    _pDFBw->GetSurface(_pDFBw, &_pDFB_surface);
    _pDFBw->SetOpacity(_pDFBw, 0xFF); /* Seems to be quite important */

    /*2 create egl surface*/
    EGLDisplay eglDisplay = EGL_NO_DISPLAY;
    EGLint iMajorVersion, iMinorVersion;
    EGLint configAttribs[] =
    {
        EGL_RED_SIZE,          8,
        EGL_GREEN_SIZE,      8,
        EGL_BLUE_SIZE,          8,
        EGL_ALPHA_SIZE,      8,
        EGL_DEPTH_SIZE,      24,
        EGL_STENCIL_SIZE,      8,
        EGL_SAMPLES,          0,
        EGL_SURFACE_TYPE,     EGL_WINDOW_BIT,
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
        EGL_NONE
    };
    EGLConfig  eglConfig  = 0;
    EGLint iConfigs = 0;

    eglDisplay = eglGetDisplay((EGLNativeDisplayType) /*
EGL_DEFAULT_DISPLAY */ DLID_PRIMARY);
    eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion);
    eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &iConfigs);
    eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig,
(EGLNativeWindowType) _pDFB_surface, NULL);

    EGLint contextAttribs[] =
    {
        EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE
    };

    eglBindAPI(EGL_OPENGL_ES_API);

    EGLContext eglContext = eglCreateContext(eglDisplay, eglConfig,
EGL_NO_CONTEXT, contextAttribs);

    eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);

    fprintf(stderr, "%x\n", eglSurface);

    while(1)
    {
        static loop = 1;
        loop *= -1;

        if (loop == 1)
        glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
        else
        glClearColor(1.0f, 0.0f, 0.0f, 0.0f);

        glClear(GL_COLOR_BUFFER_BIT);

        _pDFB_surface->Flip(_pDFB_surface, NULL, 0);
        //eglSwapBuffers(eglDisplay, eglSurface);
    }
}


More information about the mesa-users mailing list