野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22660|回复: 3

[经验\资料] 野火iMX6ULL Pro开发板移植SDL2

[复制链接]
发表于 2020-12-22 18:06:14 | 显示全部楼层 |阅读模式
承诺的Linux三部曲移植还没写完,差个根文件系统没有写呢,但实在压抑不住内心的亢奋情绪,先把SDL2移植奉献给大家吧。关于SDL的移植,已经进行一个月了,之前把SDL移植成功后打算写Python的模块,进行到一半发现有些函数没见过,翻遍全网找不到SDL最新的API文档,去官方看才发现,SDL已经停更了,以后所有的精力都将转到SDL2中。
奶奶个熊的!浪费了我一个月的时间写Python模块,原来是个废物!
本以为换成SDL2之后将一切顺利,的整个移植一直卡在No available video device上,国内搞SDL的人本身就少的可怜,在ARM下面搞的更是凤毛麟角,到了iMX6的平台上,呵呵,我发现我特么在孤军奋战!有种欲哭无泪的赶脚!
很多答案是需要安装X11,但是在iMX6的平台上,我真没把握能把这东西移植成功,而NXP官方资料中,iMX6ULL中,连OpenGL都没的支持。
好不容易在国外的一个论坛中找到了可用的DirectFB,但就是这货,让老子卡了一个月的时间。首先是源码包,DirectFB的官网不是何故,已经完全停了对源码的下载支持,不知道是今后要转向收费还是咋地,连个毛都下不到,其他网站的不是要收费就是要积分,而且从0.9一直到1.7,好几个版本。从SDL的论坛中找到零星资料,说是SDL2支持1.0~1.3的某些版本,但仅此而已,没有更多的信息,这些信息都是2004年左右的了(这是个什么老古董??),基本没有参考价值,因为都是针对SDL1.X版本的帖子。尝试吧0.9~1.7的各个版本下载全了,大概十几个版本的源码,挨个试,每个都过不了,好不容易在1.6和1.7两个版本中编译通过了,但SDL2有他喵的不行了!
今天!就在今天早上,灵光一现!搞通了!
所以赶紧写篇文表示祝贺,至于根文件系统的移植说明,先放放,毕竟那个有很多资料可查,而这篇移植文档,我很确信的说,目前为止,国内外网站绝逼没有!
本次移植包含了SDL2、jpeg和png图片支持、网络支持、中文字体支持、网络支持、触屏支持,以及万恶的DirectFB1.7.7的支持!
一、 关于依赖包
先科普一下SDL这货,Simple DirectMedia Layer,是一个跨平台的多媒体游戏支持库。其中包含了对图形、声音、游戏杆、线程等等的支持,目前可以运行在许多平台上,其中包括 X Window、X Window with DGA、Linux FrameBuffer控制台、Linux SVGALib,以及Windows DirectX、BeOS 等等。因为SDL是专门为游戏和多媒体应用而设计开发,所以它对图形的支持非常优秀,尤其是高级图形能力,比如Alpha混和、透明处理、YUV覆盖、Gamma 校正等等。而且在SDL环境中能够非常方便地加载支持OpenGL的Mesa库,从而提供对二维和三维图形的支持。  可以说,SDL是编写跨平台游戏和多媒体应用的最佳平台,也的确得到了广泛应用。
我之所以选择他,是因为他遵循的是GPL协议,完全免费,之前打算直接用FrameBuffer,但那个对于游戏框架开发工作量有点太大,所以后来有了解了Allegro、MesaD、OpenGL、Qt一类的东东,最后发现SDL还是比较合我胃口的。SDL1.X版本官方已经停更了,官方建议以后就不要用1.X了,直接转向2.X版本,而且SDL2发展了十来年的时间了,从性能到算法再到兼容性上应该优化的也不错了,所以应该是可以放心使用的。本次我选用的是2.2.12这个版本,具体大家可以去http://www.libsdl.org撩。
然后是图片解码库,SDL本身只支持bmp格式的图片,不过这对我来说也足够了,但如果要做开放式架构的话,还需要加入jpeg和png等图片的支持,所以我选择了libjpe和libpng的类库支持,这两个都是用C语言写的编解码类库,效率非常高,在ARM上运行轻轻松松。但需要注意的是,libpng需要zlib这个包的支持。
zlib是又Jean-loup Gailly和Mark Adier这两个外国鬼子开发的数据雅座格式库,他仅支持LZ77的变种算法DEFLATE算法,但好多地方都用得到,如果你在编译软件的时候发现gzread、gzwrite一类的函数找不到,基本都是没有安装这个类库造成的。
然后是SDL_image类库,她提供了各种图片操作的方法,原本SDL只支持bmp格式图像,利用这个类库,联合libjpeg和libpng可以支持更多种类的图片,同时可以对内容进行纹理等一系列的操作。
SDL_gfx,这个类库是从SDL_gfxPrimitives这个老古董演变过来的,是对几何图像操作的一些类库,包括对对象的旋转、缩放等,还包含了基础的点、线、圆、多边形的绘制、FPS控制等,总之这玩意儿在游戏开发过程中肯定是必要的,有了这玩意儿,基本可以抛弃SDL原生的一次劣质函数了。
然后就是对文字的支持,这里需要安装SDL_tff和freetype两个库,SDL_tff是对文字进行渲染的类库,而freetype是对矢量文字进行处理的类库,有了这两个库,我们就可以正常使用.tff格式的字库文件了,也就是说可以在Linux平台中用微软雅黑。
视频的基本都齐活了,然后就是音频,SDL_mixer,开始我还以为这个类库是对矩阵操作的,空欢喜一场,原来单词认错了(matrix)。这次移植中已经搞定了,但是声音部分我还没做测试,因为野火新板子到了之后只是简单测试了一下音频,并且移植了ALSA的包,具体在SDL中还没来得及写例子。这个类库的两房小妾我选的是解码MID音频的libmikmod,和解码mp3的libmad,至于wav格式,貌似SDL_mixer本身就支持,具体没多了解,这个待后期验证吧。
最后是两个没有验证,在我这也没有卵用的包,但是这个移植可能对于大家来说是有必要的,SDL_net用于网络通讯,tslib用于触屏的支持。
重点说一下DirectFB这龟孙!
DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。DirectFB是为嵌入式系统而设计。它是以最小的资源开销来实现最高的硬件加速性能。
DirectFB是图形API存在于Frame Buffer层之上与高级图形管理层如GTK+等之下的。它可以以很小的系统资源占用来提供图形硬件加速功能,提供类如多路a通道渲染模型等高级图像操作。它不修改Linux内核,除了标准C库没有其他库的依赖。应用在了基于Linux系统的DTV显示系统的研发和其他有关Linux显示界面的项目上。支持市面上绝大多数显示卡,支持键盘、鼠标、遥控器、游戏手柄、触摸屏等输入设备。支持JPEG、PNG、GIF、mpeg1/2、AVI、MOV、Flash、Video4Linux、DirectFB bitmap font和TrueType等音视频文件和字体。
目前官网处于SB状态,除了是个黄页,其他找不到有用的信息,所以大家也不用费事去找他的包,文章后面我会附带上所有用到的类库下载地址,以及在i.MX6ULL中移植成功的打包。
对,还有个flux这东西我没有查是干啥的,反正在SDL和DirectFB的移植过程中一体提醒我少这么个玩意儿,网上找也找不到,最后还是在国外论坛中发现的源码,应该是用来解析某种特定格式文件的,哪位小伙伴有知道的可以补充一下。
二、 全类库移植手术
用到的包包括:SDL-2.2.12、libjpeg-9d、libiconv-1.16、zlib-1.2.11、libpng-1.6.37、SDL2-image-2.0.5、SDL2_gfx-1.0.4、freetype-2.9、SDL2_tff-2.0.15、libmikmod-3.3.11.1、SDL2_mixer-2.0.4、SDL2_net-2.0.1、tslib-1.22、DirectFB-1.7.7、flux,所有东西准备好了,放在文章后面连接中,这些都是经过I.MX6ULL实际测试过的,可以直接移植,各位如果想尝试更新的版本,那自行解决吧。
在移植过程中,第一次我直接安装都了开发板的根目录地址,运行正常,但是总是出莫名其妙的错误,我怀疑是安装的时候一些路径配置导致的,所以后来我采用的实际目录的安装方式,直接把类库安装在Ubuntu母系统的/opt目录下,然后再整体拷贝过去(这招是学ALSA类库移植的手段),目前看还没有出现什么大的问题。
把所有用到的类库源码包放到一个目录下解压,在每个源码包下面创建一个mx6ull目录,用于交叉编译。
(对了,交叉编译的环境这里不讲了,网上到处都是,或者出门左转,看我Linux内核和U-Boot移植的部分,印象中应该提到过)
对于SDL2的安装,要进行两边,反正我是没有一遍搞定,因为SDL2和DirectFB互相引用,我就不知道怎么弄了,但肯定是能一遍完事的,各位大佬给解决方案吧,对于我这种笨猪,只能曲线救国。
1. 安装SDL2本尊
首先执行源码目录的autogen.sh文件,以后在其他源码目录中遇到的,尽量执行一下,因为不执行有可能出错,或者安装后不能用,后面有严重需要的地方我还会提。
进入mx6ull目录,执行../configure生成编译环境,以后所有的configure必定是在mx6ull中执行的,这点不再重复。
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--disable-pulseaudio \
--disable-video-dummy \
--disable-arts \
--disable-esd \
--enable-alsa \
--disable-video-x11 \
--enable-joystick \
--enable-input-tslib \
--enable-video-directfb \
--disable-video-opengl \
--disable-video-opengles \
--disable-video-opengles1 \
--disable-video-opengles2
因为最近我还不打算一直OpenGL,所以吧OpenGL的选项全都关闭,具体enable哪些,disable那些,看帮助文档吧,configure -help,这个很重要,当初我移植的时候各种碰壁,最后研读了所有类库的编译文档才明白怎么回事了。
然后就是make和make install,安装到了 /opt/SDL2目录下,可以把这个目录设置为777的权限,方便安装,如果用sudo安装,还需要重新做一下环境变量的设置,比较麻烦。
2. 安装libjpeg
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared
make
make install
3. 安装libiconv
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared
make
make install
4. 安装zlib
zlib本身不支持CC一类参数的写入,所以我们只能先修改环境变量,然后在执行丫。
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export RANLIB=arm-linux-gnueabihf-ranlib
其实应该是只用到了第一行,其他的没什么乱用。
../configure --prefix=/opt/SDL2 \
--sharedlibdir="/opt/SDL2" \
--static
生成源码环境后,需要修改一下Makefile文件,打开Makefile,找到CFLAG的参数项,加入一个-fPIC的选项,按理说--static应该包含了这个东西,但是实际测试中不起作用,如果少了这个参数,在编译其他一些类库的时候会报lib/libz.a: error adding symbols: Bad value的错误。
make
make install
5. 安装libpng
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
LDFLAGS="-L/opt/SDL2/lib" \
CPPFLAGS="-I/opt/SDL2/include" \
CFLAG="-fPIC"
make
make install
这货严重依赖zlib,如果zlib安装有问题,丫会报一堆的错误。
6. 安装SDL2_image
安装之前需要在源码目录中执行autogen.sh文件,否则会报syntax error near unexpected token的错误。
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--with-sdl-prefix=/opt/SDL2 \
LDFLAGS="-L/opt/SDL2/lib" \
CPPFLAGS="-I/opt/SDL2/include/SDL2"
make
make install
7. 安装SDL2_gfx
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--enable-mmx=no \
--with-sdl-prefix=/opt/SDL2 \
LDFLAGS="-L/opt/SDL2/lib" \
CPPFLAGS="-I/opt/SDL2/include/SDL2"
make
make install
8. 安装freetype2
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
LDFLAGS="-L/opt/SDL2/lib" \
CPPFLAGS="-I/opt/SDL2/include/SDL2"
make
make install
9. 安装SDL2_tff
依赖与freetype,先安装这个包会报错。
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--enable-speed
生成源文件后,要修改一下Makefile,找到CFLAGS选项,去掉-fforce-mem,据说是gcc2.4以后的版本中不再支持这东西,咱也不懂,也懒得多管,反正不报错就是极好的。
make
make install
10. 安装libmkimod
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared
make
make install
11. 安装SDL2_mixer
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--disable-sdltest \
--with-sdl-prefix=/opt/SDL2 \
--with-freetype-prefix=/opt/SDL2 \
LDFLAGS="-L/opt/SDL2/lib" \
CPPFLAGS="-I/opt/SDL2/include -liconv"
make
make install
12. 安装SDL_net
需要先运行autogen.sh文件,对于这个包,没有需要的就别装了,不影响大局。我是计划后面自己做一套网络和蓝牙的包,所以多我来说没多大用,不过我后面提供的完整包中包含了这个类库。
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--disable-sdltest \
--with-sdl-prefix=/opt/SDL2 \
LDFLAGS="-L/opt/SDL2/lib" \
CPPFLAGS="-I/opt/SDL2/include"
make
make install
13. 安装tslib
首先运行autogen.sh文件,否则报错。这个包是触屏的支持,我最终产品中是不带触屏的,所以装了也没对它进行过测试,有条件的小伙伴试试看吧。
首先需要生成一个缓存文件,因为在configure中直接写这个参数好像不太好使。
echo "ac_cv_func_malloc_0_nonnull=yes"> arm-linux.cache
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--cache-file=arm-linux.cache
make
make install
14. 安装DirectFB
我后面会把所有版本都放出来,因为这些都是收费的,所以全部搞到会比较难,大家就别再花冤枉钱了,我这里用的是1.7.7这个版本。
首先打开configure文件,修改一些参数。
have_linux选项,改为yes,否则DirectFB永远不会被选中。
再找到MODULEDIR=,在最下面的位置,修改为MODULEDIR=/opt/directfb-1.7.7/lib/directfb,如果用的其他版本的,根据安装目录修改即可,这个参数关系重大,写错了一样无法运行起来,目测应该是库连接路径。
../configure --prefix=/opt/directfb-1.7.7 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--disable-x11 \
--enable-debug \
-disable-voodoo \
-disable-mmx \
--disable-see \
--enable-sdl \
--enable-jpeg \
--enable-zlib \
--enable-png \
--disable-gif \
--enable-freetype \
--disable-video4linux \
--disable-video4linux2 \
--with-gfxdrivers=none \
--with-inputdrivers=linuxinput \
--without-zlib \
LDFLAGS="-L/opt/SDL2/lib -lfreetype -ljpeg -lpng -lz" \
CPPFLAGS="-I/opt/SDL2/include"
先不要着急make,Makefile再做一下确认
MODULEDIR = /opt/directfb-1.7.7/lib/directfb
MODULEDIRNAME = directfb-1.7.7
保证第一行的路径正确就行,能不能移植成功就靠这了!
make
make install
15. 重新覆盖SDL2
第一次安装SDL2是为了给其他包提供环境,包括DirectFB,第二次覆盖安装是让SDL2支持DirectFB,大佬看看能不能把这两步合成一步。
SDL1.X版本中直接用的FrameBuffer做的输出,SDL2好像不支持这东西了,得需要个驱动,SDL2本身提供了很多,看文档中--enable-video-XXXX的部分,应该都是对于视频的支持,这里把其他的都关了,只支持DirectFB即可,可能会有点问题,尤其是OpenGL,总是出来乱搅和!
../configure --prefix=/opt/SDL2 \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib \
--host=arm-linux-gnueabihf \
--build=x86_64-linux-gnu \
--target=arm-linux-gnueabihf \
--disable-static \
--enable-shared \
--disable-pulseaudio \
--disable-video-dummy \
--disable-arts \
--disable-esd \
--enable-alsa \
--disable-video-x11 \
--enable-joystick \
--enable-input-tslib \
--enable-video-directfb \
--disable-video-opengl \
--disable-video-opengles \
--disable-video-opengles1 \
--disable-video-opengles2 \
DIRECTFB_CFLAGS="-I/opt/directfb-1.7.7/include -I/opt/directfb-1.7.7/include/directfb" \
DIRECTFB_LIBS="-L/opt/directfb-1.7.7/lib"
在日志中能看到
checking for DIRECTFB... yes
checking directfb.h usability... yes
checking directfb.h presence... yes
checking for directfb.h... yes
checking for directfb dynamic loading support... configure: WARNING: "directfb libdirectfb-1.7.so.7"
--  -> libdirectfb-1.7.so.7
Yes
表示已经配置成功了,否则查看你的DirectFB安装路径是否存在问题。
如果你用的也是我的这版本的SDL2,那编译的时候肯定会报错,因为官方承认源码中存在错误,这个2B问题我找了一个星期,在官网最深处搜到了一个人的帖子,可见SDL2+DirectFB的人是由多少啊!
修改src/video/directfb/SDL_DirectFB_render.c这个文件,定位到case SDL_BLENDMODE_MUL:的位置的位置,上面多了个花括号(这种错误也能犯??),下面几行中会看到SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_DESTCOLOR)),少写了个字母,而且DSBF_DESTCOLOR的定义还存在,没有那篇帖子,打死我都找不到问题在哪,改为SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_DSTCOLOR))
然后再编译
make
make install
交叉编译至此完结。
三、 配置环境变量
/opt下的directfb-1.7.7和SDL2两个文件夹拷贝到开发板的根目录中。
打开开发板的下/etc/profile文件,加入路径
PATH=$PATH:/sbin:/bin:/usr/sbin:usr/bin:/opt/SDL2/include:/opt/SDL2/include/SDL2:/opt/SDL2/include/freetype2:/opt/SDL2/include/freetype2/freetype:/opt/SDL2/include/libpng16
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:/opt/SDL2/lib:/opt/SDL2/lib/ts:/usr/lib/:/opt/directfb-1.7.7/lib
export PATH LD_LIBRARY_PATH
四、 写测试程序
#include <SDL.h>
#include <stdio.h>
#include <SDL_image.h>
#include <string.h>
#include <stdbool.h>

const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
const int SCREEN_BPP = 32;

int main(int argc, char *args[])
{
    printf("start DSL \n");
    // 将要渲染的窗口
    SDL_Window *window;

    // 窗口含有Surface
    SDL_Surface *screenSurface = NULL;

    // 初始化SDL

    if(SDL_Init(SDL_INIT_VIDEO) < 0){
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        goto error;
    }

    window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    if(window == NULL){
        printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        goto error;
    }
    // 隐藏鼠标
    SDL_ShowCursor(SDL_FALSE);
    // 获取Window Surface
    screenSurface = SDL_GetWindowSurface(window);

    // 填充为白色
    SDL_FillRect(screenSurface, NULL,SDL_MapRGB(screenSurface->format , 0xFF,0xFF,0xFF));

    // 更新surface
    SDL_UpdateWindowSurface(window);
    printf("started DSL! \n");

    //延迟两秒
    SDL_Delay(2000);

    // 销毁Window
    SDL_DestroyWindow(window);
error :
    // 退出SDL
    SDL_Quit();

    return 0;
}
测试让屏幕显示2秒的白屏。
后台会输出关于DirectFB的而信息。


DirectFB-0.9.25.1.tar.gz (1.97 MB, 下载次数: 9) DirectFB-1.6.1.tar.gz (4.04 MB, 下载次数: 10)
DirectFB-1.7.7.zip (7.12 MB, 下载次数: 9)
DirectFB-1.2.7.tar.gz (2.64 MB, 下载次数: 8)
DirectFB-1.4.3.tar.gz (2.76 MB, 下载次数: 9)
移植好的包:https://download.csdn.net/download/suolong123/13756669
源码包集合:https://download.csdn.net/download/suolong123/13756716
回复

使用道具 举报

发表于 2020-12-23 16:36:18 | 显示全部楼层
厉害 厉害 留着以后研究研究
回复 支持 反对

使用道具 举报

发表于 2020-12-24 11:21:53 | 显示全部楼层
厉害厉害
回复

使用道具 举报

发表于 2022-6-29 11:58:11 | 显示全部楼层
本帖最后由 我是520老谢 于 2022-6-29 15:45 编辑

请教一下,我直接使用移植好的包,编译一次测试代码,报如下异常,可能是什么导致的呢并且屏幕没有任何反应
debian@npi:/home/xwzimx6ullUser/myResource/user_game_lib/test_sdl$ ./app
start DSL
commandline read: app
(*) Direct/Thread: Started 'SigHandler' (13612) [CRITICAL - OTHER/0] <8388608>...

   ~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.7.7 |~~~~~~~~~~~~~~~~~~~~~~~~~~
        (c) 2012-2015  DirectFB integrated media GmbH
        (c) 2001-2015  The world wide DirectFB Open Source Community
        (c) 2000-2004  Convergence (integrated media) GmbH
      ----------------------------------------------------------------

(*) DirectFB/Core: Single Application Core. (2020-12-21 08:20) [ DEBUG ]
(*) Direct/Memcpy: Using armasm_memcpy()
(*) Direct/Thread: Started 'Fusion Dispatch' (13613) [MESSAGING - OTHER/0] <8388608>...
(*) DirectFB/Graphics: Generic Software Rasterizer 0.7 (directfb.org)
(*) Direct/Thread: Started 'Dummy Display' (13614) [OUTPUT - OTHER/0] <8388608>...
(*) DirectFB/Core/WM: Default 0.3 (directfb.org)
(*) Direct/Thread: Started 'Genefx' (13615) [DEFAULT - OTHER/0] <8388608>...
(!!!)  *** UNIMPLEMENTED [fusion_get_fusionee_pid] *** [../../../lib/fusion/fusion.c:4147]
started DSL!
(!!!)  *** UNIMPLEMENTED [fusion_dispatch] *** [../../../lib/fusion/fusion.c:3937]


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 15:29 , Processed in 0.030519 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表