

ChucoChe Apr 14, 2014 11:54 AM (in response to imxcommunityscout)
Hi,
Is there an error displayed by DirectFB when you get the segmentation fault?
DirectFB gets it's memory from FBdev pool, to increase the memory for FBdev use fbset.
For example:
fbset -fb /dev/fb0 -g 1024 768 1024 2304 24
That may solve your issue.
Also find below our EGL code to get native display and window in the yocto BSP:
#include <directfb.h>
struct _DFBDisplay
{
IDirectFB* pDirectFB;
IDirectFBDisplayLayer* pLayer;
IDirectFBEventBuffer* pEventBuffer;
int winWidth, winHeight;
};
struct _DFBWindow
{
IDirectFBWindow* pWindow;
IDirectFBSurface* pDFBSurf;
};
struct _DFBDisplay* display = NULL;
struct _DFBWindow *DFBWindow = NULL;
IDirectFBWindow *window = NULL;
EGLNativeDisplayType fsl_getNativeDisplay()
{
EGLNativeDisplayType eglNativeDisplayType = NULL;
printf("getting display \n");
DFBDisplayLayerConfig config;
if(DirectFBInit(NULL, NULL) != DFB_OK)
{
printf("DFBinit failed \n");
return 0;
}
display = (struct _DFBDisplay*) malloc(sizeof (struct _DFBDisplay));
if (display == NULL)
{
printf("allocation failed \n");
return 0;
}
if (DirectFBCreate(&(display->pDirectFB)) != DFB_OK)
{
printf("DirectFBCreate failed \n");
return 0;
}
if(display->pDirectFB->CreateInputEventBuffer(display->pDirectFB, DICAPS_KEYS, DFB_FALSE, &(display->pEventBuffer)) != DFB_OK)
{
printf("CreateInputEventBuffer failed \n");
return 0;
}
if(display->pDirectFB->GetDisplayLayer( display->pDirectFB, DLID_PRIMARY, &(display->pLayer) ) != DFB_OK)
{
printf("GetDisplayLayer failed \n");
return 0;
}
display->pLayer->GetConfiguration(display->pLayer, &config);
display->winWidth = config.width;
display->winHeight = config.height;
printf("getting display succed\n");
eglNativeDisplayType = (EGLNativeDisplayType)display;
return eglNativeDisplayType;
}
EGLNativeWindowType fsl_createwindow(EGLDisplay egldisplay, EGLNativeDisplayType eglNativeDisplayType)
{
EGLNativeWindowType native_window = (EGLNativeWindowType)0;
printf("getting window \n");
DFBWindowDescription desc;
display->pLayer->SetCooperativeLevel( display->pLayer, DLSCL_ADMINISTRATIVE );
DFBWindow = (struct _DFBWindow *) malloc(sizeof(struct _DFBWindow));
memset(DFBWindow, 0, sizeof(struct _DFBWindow));
desc.flags = ( DWDESC_POSX | DWDESC_POSY);
desc.posx = 0;
desc.posy = 0;
display->winWidth = 640;
display->winHeight = 480;
desc.flags = desc.flags | DWDESC_WIDTH | DWDESC_HEIGHT;
desc.width = 640;
desc.height = 480;
desc.surface_caps = DSCAPS_FLIPPING;
if(display->pLayer->CreateWindow( display->pLayer, &desc, &window) != DFB_OK)
{
printf("CreateWindow failed \n");
return 0;
}
DFBWindow->pWindow = window;
window->SetOpacity(window, 0xFF);
window->RaiseToTop(window);
window->AttachEventBuffer(window, display->pEventBuffer);
display->pLayer->EnableCursor(display->pLayer, 0);
native_window = (EGLNativeWindowType) DFBWindow;
assert(native_window);
printf("getting window succed \n");
return native_window:
}
Michel