WhyCan Forum(哇酷开发者社区)

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn

您尚未登录。

#1 2020-02-08 21:33:11

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

A33主线Linux跑起OpenGL/ES

A33的GPU有两个方向,开源的Lima和非开源的全志OpenGL库
Lima+Mesa3D
LIMA只需要在内核选上LIMA和SUN4I的DRM驱动即可
Mesa3D可以在buildroot选上
不过最后我运行mesa的demo直接出错也找不到问题就放弃了,不知道是哪里的问题,网上教程太少不会玩。

这时候我切到第二个方案:
其实教程就是 https://github.com/mripard/sunxi-mali

但是这里有个坑(我选的fbdev的库),导致一运行malitest就出错(malitest可以自己编一个 https://github.com/linux-sunxi/sunxi-mali/tree/master/test

查资料得到了信息
1. Must enable DRM_FBDEV_LEAK_PHYS_SMEM from kernel
2. set drm_leak_fbdev_smem on compile time (for some reason, passing in command line did not help) in drm_fb_helper.c
3. use latest r8p1

这回终于跑起来了

malitest和QT的OpenGL例子都运行正常

对了,最好在buildroot里选上sunxi-mali-mainline,这样它会自动给你生成一个启动时加载mali.ko的脚本。
当然,自己modprobe也是可以的

[    2.290176] mali: loading out-of-tree module taints kernel.
[    2.303401] using random self ethernet address
[    2.310432] Allwinner sunXi mali glue initialized
[    2.310892] using random host ethernet address
[    2.319040] Mali: 
[    2.319045] Found Mali GPU Mali-400 MP r1p1
[    2.325812] using random self ethernet address
[    2.344761] using random host ethernet address
[    2.352326] usb0: HOST MAC 3a:7e:4f:95:4b:5d
[    2.359199] usb0: MAC f6:29:20:a6:b8:86
[    2.365680] g_ffs gadget: g_ffs ready
[    2.386332] Mali: 
[    2.386337] 2+0 PP cores initialized
[    2.396969] Mali: 
[    2.396971] Mali device driver loaded

运行malitest的结果,可以验证是否正确

EGL Version: "1.4 Linux-r8p1-00rel0"
EGL Vendor: "ARM"
EGL Extensions: "EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_lock_surface EGL_KHR_lock_surface2 EGL_EXT_create_context_robustness EGL_ANDROID_blob_cache EGL_KHR_create_context EGL_KHR_partial_update EGL_KHR_create_context_no_error "
Surface size: 1024x600
GL Vendor: "ARM"
GL Renderer: "Mali-400 MP"
GL Version: "OpenGL ES 2.0 "mali450-r5p1-01rel0-lollipop-233-g52c929d""
GL Extensions: "GL_OES_texture_npot GL_OES_vertex_array_object GL_OES_compressed_ETC1_RGB8_texture GL_EXT_compressed_ETC1_RGB8_sub_texture GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_depth24 GL_ARM_rgba8 GL_ARM_mali_shader_binary GL_OES_depth_texture GL_OES_packed_depth_stencil GL_EXT_texture_format_BGRA8888 GL_OES_vertex_half_float GL_EXT_blend_minmax GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_rgb8_rgba8 GL_EXT_multisampled_render_to_texture GL_EXT_discard_framebuffer GL_OES_get_program_binary GL_ARM_mali_program_binary GL_EXT_shader_texture_lod GL_EXT_robustness GL_OES_depth_texture_cube_map GL_KHR_debug GL_ARM_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_OES_mapbuffer GL_KHR_no_error"

这里有点比较老的介绍,虽然过时了,但是比较系统
https://linux-sunxi.org/Mali_binary_driver

最近编辑记录 达克罗德 (2020-02-08 21:59:12)

离线

#2 2020-02-08 21:37:17

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

主线uboot和内核的配置可以参见另一个帖子
全志A33 主线u-boot/Linux入坑记录 https://whycan.cn/t_3643.html

最近编辑记录 达克罗德 (2020-02-08 21:37:41)

离线

#3 2020-02-08 21:40:09

晕哥
管理员
注册时间: 2017-09-06
累计积分: 9,190

Re: A33主线Linux跑起OpenGL/ES

QQ图片20200208213712.jpg

感谢楼主 @达克罗德 分享,  顺便帮楼主传一下图片和视频.

离线

#4 2020-02-09 14:48:01

微凉VeiLiang
会员
注册时间: 2018-10-28
累计积分: 385
个人网站

Re: A33主线Linux跑起OpenGL/ES

厉害了,感谢分享

离线

#5 2020-02-09 14:57:12

sea18c
会员
注册时间: 2019-08-05
累计积分: 192

Re: A33主线Linux跑起OpenGL/ES

玩的东西越来越多了

离线

#6 2020-02-09 20:41:00

sinlinx
会员
注册时间: 2020-02-07
累计积分: 5

Re: A33主线Linux跑起OpenGL/ES

感谢楼主分享

离线

#7 2020-03-13 08:01:43

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

达克罗德 说:

A33的GPU有两个方向,开源的Lima和非开源的全志OpenGL库
Lima+Mesa3D
LIMA只需要在内核选上LIMA和SUN4I的DRM驱动即可
Mesa3D可以在buildroot选上
不过最后我运行mesa的demo直接出错也找不到问题就放弃了,不知道是哪里的问题,网上教程太少不会玩。

这时候我切到第二个方案:
其实教程就是https://github.com/mripard/sunxi-mali

但是这里有个坑(我选的fbdev的库),导致一运行malitest就出错(malitest可以自己编一个https://github.com/linux-sunxi/sunxi-mali/tree/master/test)

查资料得到了信息
1. Must enable DRM_FBDEV_LEAK_PHYS_SMEM from kernel
2. set drm_leak_fbdev_smem on compile time (for some reason, passing in command line did not help) in drm_fb_helper.c
3. use latest r8p1

这回终于跑起来了

malitest和QT的OpenGL例子都运行正常

对了,最好在buildroot里选上sunxi-mali-mainline,这样它会自动给你生成一个启动时加载mali.ko的脚本。
当然,自己modprobe也是可以的


运行malitest的结果,可以验证是否正确

这里有点比较老的介绍,虽然过时了,但是比较系统
https://linux-sunxi.org/Mali_binary_driver


我这边运行 test 程序直接出现 Error: eglCreateWindowSurface failed: 0x00003003
查询错误码 是 EGL_BAD_ALLOC, 用的r8p1 fbdev ,你又遇到这个问题吗?

离线

#8 2020-03-13 08:10:09

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

我这边运行 test 程序直接出现 Error: eglCreateWindowSurface failed: 0x00003003
查询错误码 是 EGL_BAD_ALLOC, 用的r8p1 fbdev ,你又遇到这个问题吗?

我也是遇到这个问题
2. set drm_leak_fbdev_smem on compile time (for some reason, passing in command line did not help) in drm_fb_helper.c
这个改了吗?我改了这个就好
另外记得把drm的Framebuffer设成200既2倍大小
还有如果有其它程序用fb比如xserver,要先关掉

离线

#9 2020-03-13 10:25:49

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

达克罗德 说:

我也是遇到这个问题
2. set drm_leak_fbdev_smem on compile time (for some reason, passing in command line did not help) in drm_fb_helper.c
这个改了吗?我改了这个就好
另外记得把drm的Framebuffer设成200既2倍大小
还有如果有其它程序用fb比如xserver,要先关掉

这两个选项都打开,然后 OVERALLOC设成300,问题依旧
网上查了好久都没有解决

原来用的5.5.5的内核,现在在编译4.19的lts版本再试试

离线

#10 2020-03-13 11:04:08

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

换成4.19的内核也不行,现在的问题是 不管overalloc更改成200,还是300,系统中的y_virtual 都是600

# ./egl_test 
EGL Version: "1.4 Linux-r8p1-00rel0"
EGL Vendor: "ARM"
EGL Extensions: "EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_lock_surface EGL_KHR_lock_surface2 EGL_EXT_create_context_robustness EGL_ANDROID_blob_cache EGL_KHR_create_context EGL_KHR_partial_update EGL_KHR_create_context_no_error "
The mem is :2457600
The line_length is :4096
The xres is :1024
The yres is :600
The xres_v is :1024
The yres_v is :600
bits_per_pixel is :32
Error: eglCreateWindowSurface failed: 0x00003003

见了鬼了

离线

#11 2020-03-13 12:18:34

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

virtual应该翻倍才对

离线

#12 2020-03-13 12:26:45

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

你的fb是simplefb还是drm生成的fb?我是用sun4i drm。只有drm的fb可以设置大小

离线

#13 2020-03-13 13:28:45

Jmhh247
会员
注册时间: 2018-12-21
累计积分: 262

Re: A33主线Linux跑起OpenGL/ES

你的驱动不支持双缓冲。

The mem is :2457600 = 600 * 4096,显存明显只一个帧缓冲大小。

必须大于双缓冲以上的显存,y_virtual 才能翻倍。





KevinS 说:

换成4.19的内核也不行,现在的问题是 不管overalloc更改成200,还是300,系统中的y_virtual 都是600

# ./egl_test 
EGL Version: "1.4 Linux-r8p1-00rel0"
EGL Vendor: "ARM"
EGL Extensions: "EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_lock_surface EGL_KHR_lock_surface2 EGL_EXT_create_context_robustness EGL_ANDROID_blob_cache EGL_KHR_create_context EGL_KHR_partial_update EGL_KHR_create_context_no_error "
The mem is :2457600
The line_length is :4096
The xres is :1024
The yres is :600
The xres_v is :1024
The yres_v is :600
bits_per_pixel is :32
Error: eglCreateWindowSurface failed: 0x00003003

见了鬼了

离线

#14 2020-03-13 15:23:53

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

用drm 的fb后可以有 双缓冲了,但是现在程序又死在 eglSwapBuffers中了,直接不返回了

离线

#15 2020-03-14 19:31:13

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

NND, 终于跑起来了, 4.19.5内核外加补丁

离线

#16 2020-03-14 19:58:20

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

KevinS 说:

NND, 终于跑起来了, 4.19.5内核外加补丁

按理5.5不需要补丁,我没有打补丁

离线

#17 2020-03-14 21:52:53

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

我是直接用buildroot编译的,选择了mali-driver,选的5.5.5的内核,全自动完成,烧录后运行就直接死掉,串口都不响应了,只能硬重启
你是这样的吗?你是怎么编译的?

离线

#18 2020-03-15 00:04:39

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

KevinS 说:

我是直接用buildroot编译的,选择了mali-driver,选的5.5.5的内核,全自动完成,烧录后运行就直接死掉,串口都不响应了,只能硬重启
你是这样的吗?你是怎么编译的?

我是用的 https://github.com/mripard/sunxi-mali
这里面的驱动编的mali.ko

离线

#19 2020-03-15 16:45:34

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

达克罗德 说:

我是用的https://github.com/mripard/sunxi-mali
这里面的驱动编的mali.ko

buildroot也是用的这个地址的驱动编译的,你编译的时候有没有手动打补丁,还是直接用里面的build.sh编译的?

离线

#20 2020-03-15 18:18:53

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

KevinS 说:

buildroot也是用的这个地址的驱动编译的,你编译的时候有没有手动打补丁,还是直接用里面的build.sh编译的?

没有手动打补丁,也许build.sh打了补丁。。不知道buildroot是不是完全等效这个

离线

#21 2020-03-16 10:30:07

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

有重新编译了一遍5.3.6, 这次手动编译mali驱动,加载进去,运行测试程序还是死机

离线

#22 2020-03-16 11:11:57

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

KevinS 说:

有重新编译了一遍5.3.6, 这次手动编译mali驱动,加载进去,运行测试程序还是死机

drm_fb_helper.c改了吗?

离线

#23 2020-03-16 11:29:27

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

下载的那个4.19.5的patch,里面的drm_fb_helper.c的patch用不了吧?
4.19的drm_fb_helper.c 有3000多行
5.x的drm_fb_helper.c才2000多行,patch没法打啊

离线

#24 2020-03-16 11:35:32

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

5.x的源码是打过补丁的

离线

#25 2020-03-16 11:37:26

KevinS
会员
注册时间: 2020-01-18
累计积分: 22

Re: A33主线Linux跑起OpenGL/ES

达克罗德 说:

drm_fb_helper.c改了吗?

能不能把你的具体编译流程说一下,我这边除了用4.19.5然后手动打网上的patch外,其他还没有成功过

离线

#26 2020-03-16 14:35:11

达克罗德
会员
注册时间: 2018-04-10
累计积分: 966

Re: A33主线Linux跑起OpenGL/ES

KevinS 说:

能不能把你的具体编译流程说一下,我这边除了用4.19.5然后手动打网上的patch外,其他还没有成功过

#if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
static bool drm_leak_fbdev_smem = true;
module_param_unsafe(drm_leak_fbdev_smem, bool, 0600);
MODULE_PARM_DESC(drm_leak_fbdev_smem,
		 "Allow unsafe leaking fbdev physical smem address [default=false]");
#endif

我记得有人说4.x之后需要这样改动:
config打开CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM
然后在drm_fb_helper.c中drm_leak_fbdev_smem设置true;
其他就是按照那个github说明编maili.ko

离线

#27 2020-06-09 09:22:57

skliu
会员
注册时间: 2020-06-07
累计积分: 35

Re: A33主线Linux跑起OpenGL/ES

楼主大侠,能出一个新手教程吗? A33也想跑Linux+qt+opengl。 感谢。

离线

#28 2020-08-28 09:39:50

明月照我沟渠
会员
注册时间: 2020-07-09
累计积分: 102

Re: A33主线Linux跑起OpenGL/ES

skliu 说:

楼主大侠,能出一个新手教程吗? A33也想跑Linux+qt+opengl。 感谢。

+1

离线

#29 2020-08-28 19:43:18

jkl
会员
注册时间: 2019-11-18
累计积分: 143

Re: A33主线Linux跑起OpenGL/ES

明月照我沟渠 说:

+1

+1

离线

#30 2020-10-22 16:46:26

孤星泪
会员
注册时间: 2020-03-18
累计积分: 199

Re: A33主线Linux跑起OpenGL/ES

感谢楼主分享,可惜linux4.20里面没有lima,玩不起来,等有空再整 linux5.9试一试。

离线

#31 2020-11-02 17:22:43

ubuntu
会员
注册时间: 2020-03-30
累计积分: 62

Re: A33主线Linux跑起OpenGL/ES

../src/mesa/tnl/t_vb_lighttmp.h:508:16: warning: 'base[0][3]' may be used uninitialized in this function [-Wmaybe-uninitialized]
   Fcolor[j][3] = base[0][3];
                ^
In file included from ../src/mesa/tnl/t_vb_light.c:29:0:
../src/mesa/main/macros.h:264:13: warning: 'base[0][2]' may be used uninitialized in this function [-Wmaybe-uninitialized]
    (DST)[2] = (SRC)[2];             \
             ^
In file included from ../src/mesa/tnl/t_vb_light.c:303:0:
../src/mesa/tnl/t_vb_lighttmp.h:429:12: note: 'base[0][2]' was declared here
    GLfloat base[2][4];
            ^
In file included from ../src/mesa/tnl/t_vb_light.c:29:0:
../src/mesa/main/macros.h:263:13: warning: 'base[0][1]' may be used uninitialized in this function [-Wmaybe-uninitialized]
    (DST)[1] = (SRC)[1];             \
             ^
In file included from ../src/mesa/tnl/t_vb_light.c:303:0:
../src/mesa/tnl/t_vb_lighttmp.h:429:12: note: 'base[0][1]' was declared here
    GLfloat base[2][4];
            ^
In file included from ../src/mesa/tnl/t_vb_light.c:29:0:
../src/mesa/main/macros.h:262:13: warning: 'base[0][0]' may be used uninitialized in this function [-Wmaybe-uninitialized]
    (DST)[0] = (SRC)[0];             \
             ^
In file included from ../src/mesa/tnl/t_vb_light.c:303:0:
../src/mesa/tnl/t_vb_lighttmp.h:429:12: note: 'base[0][0]' was declared here
    GLfloat base[2][4];
            ^
[598/690] Compiling C object 'src/mesa/bbe4a73@@mesa_classic@sta/drivers_common_meta.c.o'.
In file included from ../src/mesa/drivers/common/meta.c:91:0:
../src/compiler/nir/nir.h:2463:1: warning: '__returns_nonnull__' attribute directive ignored [-Wattributes]
 {
 ^
../src/compiler/nir/nir.h:2469:1: warning: '__returns_nonnull__' attribute directive ignored [-Wattributes]
 {
 ^
[670/690] Linking target src/mesa/drivers/dri/libmesa_dri_drivers.so.
FAILED: src/mesa/drivers/dri/libmesa_dri_drivers.so
/opt/buildroot-2020.02.3/output/host/bin/arm-none-linux-gnueabi-g++  -o src/mesa/drivers/dri/libmesa_dri_drivers.so  -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -shared -fPIC -Wl,--start-group -Wl,-soname,libmesa_dri_drivers.so -Wl,--whole-archive src/mesa/drivers/dri/swrast/libswrast_dri.a src/mesa/drivers/dri/radeon/libr100.a src/mesa/drivers/dri/nouveau/libnouveau_vieux.a -Wl,--no-whole-archive src/mesa/drivers/dri/common/libmegadriver_stub.a src/mesa/drivers/dri/common/libdricommon.a src/mapi/shared-glapi/libglapi.so.0.0.0 src/mesa/libmesa_classic.a src/compiler/glsl/libglsl.a src/compiler/glsl/glcpp/libglcpp.a src/util/libmesa_util.a src/compiler/nir/libnir.a src/compiler/libcompiler.a src/util/libxmlconfig.a -Wl,--build-id=sha1 -Wl,-Bsymbolic -Wl,--gc-sections /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdrm.so -lm -pthread -ldl /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libexpat.so /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libz.so /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdrm_radeon.so /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdrm_nouveau.so -Wl,--end-group '-Wl,-rpath,$ORIGIN/common:$ORIGIN/../../../mapi/shared-glapi:$ORIGIN/../..:$ORIGIN/../../../compiler/glsl:$ORIGIN/../../../compiler/glsl/glcpp:$ORIGIN/../../../util:$ORIGIN/../../../compiler/nir:$ORIGIN/../../../compiler' -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/mesa/drivers/dri/common -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/mapi/shared-glapi -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/mesa -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler/glsl -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler/glsl/glcpp -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/util -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler/nir -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler
src/mesa/drivers/dri/common/libmegadriver_stub.a(megadriver_stub.c.o): In function `megadriver_stub_init':
megadriver_stub.c:(.text.startup+0x20): undefined reference to `dladdr'
megadriver_stub.c:(.text.startup+0xb8): undefined reference to `dlsym'
collect2: error: ld returned 1 exit status
[674/690] Compiling C object 'src/egl/cb1d4f8@@EGL@sha/main_eglapi.c.o'.
ninja: build stopped: subcommand failed.
package/pkg-generic.mk:266: recipe for target '/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/.stamp_built' failed
make[1]: *** [/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/.stamp_built] Error 1
Makefile:84: recipe for target '_all' failed
make: *** [_all] Error 2
$
$

弄了一下午,终于解决这个编译错误了

https://git.busybox.net/buildroot/commit/?id=d3f576d2f37a05275c0d25f855dc24935ff5de5c

修改: ./output/build/mesa3d-19.3.4/src/mesa/drivers/dri/meson.build

libmegadriver_stub, libdricommon, libglapi,

改为:
libdricommon, libmegadriver_stub, libglapi,

即交换编译顺序.

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB