Re: Give A directFB surface to EGL
Albert Freeman <[email protected]>
| Newsgroups | gmane.comp.video.mesa3d.user |
|---|---|
| Message-ID | <CAHD8uZO7fFZF5+PB=exxN4r+ySqzaQw3HexkRAUgiuNy8-K_gQ@mail.gmail.com> |
On 22 October 2015 at 11:39, 刘涛 <[email protected]> wrote: > Thanks a lot, I will try. By the way I found Qt source code use DirectFB to > EGL like below: > > void QDirectFbWindowEGL::createDirectFBWindow() > { > // Use the default for the raster surface. > if (window()->surfaceType() == QSurface::RasterSurface) > return QDirectFbWindow::createDirectFBWindow(); > > Q_ASSERT(!m_dfbWindow.data()); > > DFBWindowDescription description; > memset(&description, 0, sizeof(DFBWindowDescription)); > description.flags = DFBWindowDescriptionFlags(DWDESC_WIDTH | > DWDESC_HEIGHT| > DWDESC_POSX | DWDESC_POSY| > DWDESC_PIXELFORMAT | > DWDESC_SURFACE_CAPS); > description.width = qMax(1, window()->width()); > description.height = qMax(1, window()->height()); > description.posx = window()->x(); > description.posy = window()->y(); > > description.surface_caps = DSCAPS_GL; > description.pixelformat = DSPF_RGB16; > > IDirectFBDisplayLayer *layer; > layer = toDfbScreen(window())->dfbLayer(); > DFBResult result = layer->CreateWindow(layer, &description, > m_dfbWindow.outPtr()); > if (result != DFB_OK) > DirectFBError("QDirectFbWindow: failed to create window", result); > > m_dfbWindow->SetOpacity(m_dfbWindow.data(), 0xff); > m_inputHandler->addWindow(m_dfbWindow.data(), window()); > } > > EGLSurface QDirectFbWindowEGL::eglSurface() > { > if (m_eglSurface == EGL_NO_SURFACE) { > QDirectFbScreenEGL *dfbScreen = static_cast<QDirectFbScreenEGL > *>(screen()); > EGLConfig config = q_configFromGLFormat(dfbScreen->eglDisplay(), > format(), true); > m_eglSurface = eglCreateWindowSurface(dfbScreen->eglDisplay(), > config, dfbSurface(), NULL); > > if (m_eglSurface == EGL_NO_SURFACE) > eglGetError(); > } > > return m_eglSurface; > } > > But it doesn't work for me. May be it out of date. > > 在 2015-10-22 19:27:16,"Albert Freeman" <[email protected]> 写道: >>On 22 October 2015 at 21:22, 刘涛 <[email protected]> wrote: >>> The RAM on my board is too small to debug my program. So I want to debug >>> my >>> program on my PC to ensure my code is correct, then port it to my board. >>> >>> 在 2015-10-22 18:39:11,"Albert Freeman" <[email protected]> 写道: >>>>On 22 October 2015 at 19:19, 刘涛 <[email protected]> wrote: >>>>> Thank you very much. My board is only support DirectFB, EGL and GLES2, >>>>> and >>>>> the route "DirectFB->EGL->GLES2" works good on it, but it is hard to >>>>> debug >>>>> on my board. So I want to program and debug the route on my PC. Is it >>>>> noway? >>>>> >>>>> 在 2015-10-22 16:32:58,"Albert Freeman" <[email protected]> 写道: >>>>>>On 22 October 2015 at 15:35, 刘涛 <[email protected]> wrote: >>>>>>> Hi >>>>>>> I‘m trying to give a directFB surface to eglCreateWindowSurface(), >>>>>>> like >>>>>>> below: >>>>>>> //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)); >>>>>>> dsc.flags = (DFBSurfaceDescriptionFlags)(DSDESC_CAPS); >>>>>>> dsc.caps = (DFBSurfaceCapabilities)(DSCAPS_PRIMARY | >>>>>>> DSCAPS_DOUBLE|DSCAPS_GL); >>>>>>> DFBCHECK(_pDFB->CreateSurface(_pDFB, &dsc, &_pDFB_surface)); >>>>>>> >>>>>>> //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(EGL_DEFAULT_DISPLAY); >>>>>>> eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion); >>>>>>> eglBindAPI(EGL_OPENGL_ES_API); >>>>>>> eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, >>>>>>> &iConfigs); >>>>>>> eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, >>>>>>> (EGLNativeWindowType)_pDFB_surface, NULL); >>>>>>> >>>>>>> But it failed and got 0x3003 error code. >>>>>>> Any idea about that? >>>>>>> Env: >>>>>>> Ubuntu 14..04.3, Mesa-10.1.3, DirectFB-1.7.6(use system x11) >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> mesa-users mailing list >>>>>>> [email protected] >>>>>>> http://lists.freedesktop.org/mailman/listinfo/mesa-users >>>>>>> >>>>>>You can't use EGL with DirectFB. >>>>>>DirectFB had a DirectFBGL "extension" for 3D with DirectFB that has >>>>>>apparently died. >>>>>>So you can't get 3D hardware acceleration with DirectFB. >>>>>>DirectFB uses the older fbdev legacy kernel stuff (which the >>>>>>replacement drm at least partially emulates). Although fbdev supports >>>>>>more hardware than the drm. If you are on hardware that doesn't >>>>>>support drm then the best approach I can think of is to software >>>>>>render OpenGL and then somehow obtain the texture rendered to and >>>>>>somehow send that as a 2D image with something that can draw to a >>>>>>fbdev framebuffer (such as DirectFB) (don't ask me how, ask someone >>>>>>else (best to ask on #dri-devel irc channel)). For someone like you it >>>>>>is best to use the latest git (not stable) version of mesa. >>>>>>If your hardware supports drm, your choices for 3D are: >>>>>>1. Use GL (optionally ES) & EGL & drm & gbm with mesa and without >>>>>>DirectFB (see eglkms.c demo in mesa demos and "man -k drm" and maybe >>>>>>http://events.linuxfoundation.org/sites/events/files/slides/brezillon-drm-kms.pdf) >>>>>>(this runs without a window system and works much like DirectFB but I >>>>>>believe you must use OpenGL (optionally ES) for 2D too (although you >>>>>>MIGHT be able to setup a hardware overlay for video)). If you are not >>>>>>using a relatively modern radeon, intel or nvidia card software >>>>>>rendering is probably the best way to go here (using softpipe (or if >>>>>>you are on x86 only: llvmpipe)). >>>>>>2. Use Wayland with EGL and mesa and without DirectFB. >>>>>>3. Use X and without DirectFB with (mesa OR proprietary drivers). >>>>>> >>>>>>How to force softpipe: >>>>>>"export GALLIUM_DRIVER=softpipe" and >>>>>>"export LIBGL_ALWAYS_SOFTWARE=1". You will need to add swrast to the >>>>>>gallium (NOT dri) mesa compile option (e.g. >>>>>>--with-gallium-drivers=swrast) and >>>>>>recompile mesa. >>>>>> >>>>>>You can also force llvmpipe with "export GALLIUM_DRIVER=llvmpipe". >>>>>>Actually "export LIBGL_ALWAYS_SOFTWARE=1" is only required if you have >>>>>>a non gallium mesa driver installed (such as the i965 intel driver). >>>>>> >>>>>>I hope I didn't forget anything. >>>>> >>>>> >>>>> >>>>> >>>>Oh sorry, it does seem DirectFB can be used with EGL (I have never >>>>used DirectFB before and the information I found implied that it would >>>>be tricky to interface with EGL). >>>>What do you mean by debug? Display the framebuffer (drawn on your >>>>embedded board) on your PC? >>> >>> >>> >>> >>On 22 October 2015 at 20:39, Albert Freeman <[email protected]> >> wrote: >>> On 22 October 2015 at 19:19, 刘涛 <[email protected]> wrote: >>>> Thank you very much. My board is only support DirectFB, EGL and GLES2, >>>> and >>>> the route "DirectFB->EGL->GLES2" works good on it, but it is hard to >>>> debug >>>> on my board. So I want to program and debug the route on my PC. Is it >>>> noway? >>>> >>>> 在 2015-10-22 16:32:58,"Albert Freeman" <[email protected]> 写道: >>>>>On 22 October 2015 at 15:35, 刘涛 <[email protected]> wrote: >>>>>> Hi >>>>>> I‘m trying to give a directFB surface to eglCreateWindowSurface(), >>>>>> like >>>>>> below: >>>>>> //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)); >>>>>> dsc.flags = (DFBSurfaceDescriptionFlags)(DSDESC_CAPS); >>>>>> dsc.caps = (DFBSurfaceCapabilities)(DSCAPS_PRIMARY | >>>>>> DSCAPS_DOUBLE|DSCAPS_GL); >>>>>> DFBCHECK(_pDFB->CreateSurface(_pDFB, &dsc, &_pDFB_surface)); >>>>>> >>>>>> //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(EGL_DEFAULT_DISPLAY); >>>>>> eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion); >>>>>> eglBindAPI(EGL_OPENGL_ES_API); >>>>>> eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, >>>>>> &iConfigs); >>>>>> eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, >>>>>> (EGLNativeWindowType)_pDFB_surface, NULL); >>>>>> >>>>>> But it failed and got 0x3003 error code. >>>>>> Any idea about that? >>>>>> Env: >>>>>> Ubuntu 14..04.3, Mesa-10.1.3, DirectFB-1.7.6(use system x11) >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> mesa-users mailing list >>>>>> [email protected] >>>>>> http://lists.freedesktop.org/mailman/listinfo/mesa-users >>>>>> >>>>>You can't use EGL with DirectFB. >>>>>DirectFB had a DirectFBGL "extension" for 3D with DirectFB that has >>>>>apparently died. >>>>>So you can't get 3D hardware acceleration with DirectFB. >>>>>DirectFB uses the older fbdev legacy kernel stuff (which the >>>>>replacement drm at least partially emulates). Although fbdev supports >>>>>more hardware than the drm. If you are on hardware that doesn't >>>>>support drm then the best approach I can think of is to software >>>>>render OpenGL and then somehow obtain the texture rendered to and >>>>>somehow send that as a 2D image with something that can draw to a >>>>>fbdev framebuffer (such as DirectFB) (don't ask me how, ask someone >>>>>else (best to ask on #dri-devel irc channel)). For someone like you it >>>>>is best to use the latest git (not stable) version of mesa. >>>>>If your hardware supports drm, your choices for 3D are: >>>>>1. Use GL (optionally ES) & EGL & drm & gbm with mesa and without >>>>>DirectFB (see eglkms.c demo in mesa demos and "man -k drm" and maybe >>>>>http://events.linuxfoundation.org/sites/events/files/slides/brezillon-drm-kms.pdf) >>>>>(this runs without a window system and works much like DirectFB but I >>>>>believe you must use OpenGL (optionally ES) for 2D too (although you >>>>>MIGHT be able to setup a hardware overlay for video)). If you are not >>>>>using a relatively modern radeon, intel or nvidia card software >>>>>rendering is probably the best way to go here (using softpipe (or if >>>>>you are on x86 only: llvmpipe)). >>>>>2. Use Wayland with EGL and mesa and without DirectFB. >>>>>3. Use X and without DirectFB with (mesa OR proprietary drivers). >>>>> >>>>>How to force softpipe: >>>>>"export GALLIUM_DRIVER=softpipe" and >>>>>"export LIBGL_ALWAYS_SOFTWARE=1". You will need to add swrast to the >>>>>gallium (NOT dri) mesa compile option (e.g. >>>>>--with-gallium-drivers=swrast) and >>>>>recompile mesa. >>>>> >>>>>You can also force llvmpipe with "export GALLIUM_DRIVER=llvmpipe". >>>>>Actually "export LIBGL_ALWAYS_SOFTWARE=1" is only required if you have >>>>>a non gallium mesa driver installed (such as the i965 intel driver). >>>>> >>>>>I hope I didn't forget anything. >>>> >>>> >>>> >>>> >>> Oh sorry, it does seem DirectFB can be used with EGL (I have never >>> used DirectFB before and the information I found implied that it would >>> be tricky to interface with EGL). >>> What do you mean by debug? Display the framebuffer (drawn on your >>> embedded board) on your PC? >>Oh, you mean use DirectFB with latest mesa 3D drivers. >>You won't be able to use hardware acceleration with DirectFB, although >>someone wrote a DirectFB "backend" for softpipe/llvmpipe a while ago >>(2013): >>http://lists.freedesktop.org/archives/mesa-dev/2013-April/037768.html >>You may have to download an older revision of mesa and then apply the >>patch (as there is no DirectFB backend in the latest revision of >>mesa). And maybe they didn't develop all the infrastructure required, >>so it might not be possible. >>I will try to get DirectFB working on my system, I will need to >>compile a custom kernel, so it will take a little bit of time. >>Hardware acceleration (using modern versions of radeon, nvidia, intel >>cards) seems out of the question though. > > > > Can you give me your DirectFB compile flags (for X11)? _______________________________________________ mesa-users mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-users