2 |
3 |
4 |
5 |
6 |
7 |
8 |
10 |
11 |
13 |
14 |
16 |
17 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/repo/编译android源码/51-android.txt:
--------------------------------------------------------------------------------
1 | # adb protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="username"
2 | # fastboot protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="username"
3 | # adb protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="username"
4 | # fastboot protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="username"
5 | # adb protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="username"
6 | # fastboot protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="username"
7 | # adb protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="username"
8 | # fastboot protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="username"
9 | # adb protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="username"
10 | # adb protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="username"
11 | # fastboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="username"
12 | # usbboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="username"
13 | # usbboot protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="username"
14 | # adb protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="username"
15 | # fastboot protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="username"
16 | # adb protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="username"
17 | # fastboot protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="username"
18 | # adb protocol on hammerhead (Nexus 5) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="username"
--------------------------------------------------------------------------------
/setting应用/Setting_01/app/src/main/java/com/example/zhu/setting_01/GpuInfo.java:
--------------------------------------------------------------------------------
1 | package com.example.zhu.setting_01;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.opengl.GLSurfaceView;
6 | import android.opengl.GLSurfaceView.Renderer;
7 | import android.os.Bundle;
8 | import android.os.Handler;
9 | import android.os.Message;
10 |
11 | import javax.microedition.khronos.egl.EGLConfig;
12 | import javax.microedition.khronos.opengles.GL10;
13 | //获取显卡的信息
14 | public class GpuInfo extends Activity
15 | {
16 | final Handler h = new Handler()
17 | {
18 | public void handleMessage(Message paramAnonymousMessage)
19 | {
20 | if (paramAnonymousMessage.what == 0)
21 | GpuInfo.this.close((String)paramAnonymousMessage.obj);
22 | }
23 | };
24 | GLSurfaceView mGLSurfaceView;
25 | Renderer renderer = new Renderer()
26 | {
27 | public void onDrawFrame(GL10 paramAnonymousGL10)
28 | {
29 | }
30 |
31 | public void onSurfaceChanged(GL10 paramAnonymousGL10, int paramAnonymousInt1, int paramAnonymousInt2)
32 | {
33 | }
34 |
35 | public void onSurfaceCreated(GL10 paramAnonymousGL10, EGLConfig paramAnonymousEGLConfig)
36 | {
37 | paramAnonymousGL10.glClearColor(8.0F, 8.0F, 8.0F, 0.0F);
38 | String str = new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder("")
39 | .append(paramAnonymousGL10.glGetString(7936)).toString()))
40 | .append(" ").append(paramAnonymousGL10.glGetString(7937)).toString())).toString();
41 | Message.obtain(GpuInfo.this.h, 0, str).sendToTarget();
42 | }
43 | };
44 |
45 | public void close(String paramString)
46 | {
47 | Intent localIntent = new Intent();
48 | localIntent.putExtra("GLInfo", paramString);
49 | setResult(-1, localIntent);
50 | this.finish();
51 | }
52 |
53 | public void onCreate(Bundle paramBundle)
54 | {
55 | super.onCreate(paramBundle);
56 | this.mGLSurfaceView = new GLSurfaceView(this);
57 | this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
58 | this.mGLSurfaceView.getHolder().setFormat(-3);
59 | this.mGLSurfaceView.setRenderer(this.renderer);
60 | setContentView(this.mGLSurfaceView);
61 | }
62 | }
63 |
64 | /* Location: C:\Users\zhu\Desktop\dex2jar-0.0.9.15\classes_dex2jar.jar
65 | * Qualified Name: com.njduck.hardwareinformation.TestGL
66 | * JD-Core Version: 0.6.2
67 | */
--------------------------------------------------------------------------------
/repo/Android x86如何启动到图形界面&init.sh分析.md:
--------------------------------------------------------------------------------
1 | # Android系统在启动的过程中,
2 | 最多可以出现三个画面
3 | - 第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。在默认情况下,这个画面是不会出现的,除非我们在编译内核的时候,
4 | - 第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。
5 | - 第三个开机画面由应用程序bootanimation来负责显示的。是在系统服务启动的过程中出现的,它是一个动态的画面。无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。
6 | ## 具体
7 |
8 | - Android系统的SurfaceFlinger服务有两种启动方式:
9 |
10 | 1、 在SystemServer进程中以服务线程的方式提供服务;
11 | 启动Zygote=》调用SystemServer.java[frameworks\base\services\java\com\android\server]的main函数,=》调用本地函数init1()=》frameworks\base\services\java JNI的com_android_server_SystemServer.cpp里面的android_server_SystemServer_init1函数=》然后调用
12 | System_init.cpp[frameworks\base\cmds\system_server\library]的system_init函数,通过获取属性字段system_init.startsurfaceflinger,如果字段值为1,那么就在这里启动surfaceflinger。
13 |
14 |
15 | 2、启动SurfaceFlinger独立的进程通过服务。
16 | 第二中方式是在Android启动脚本init.rc中配置SurfaceFlinger服务,通过init进程来启动的。
17 | 具体:
18 | 有一个可执行文件surfaceflinger,由framework/base/cmds/surfaceflinger编译产生,目录下的主要文件main_surfaceflinger.cpp里面就一个main函数:以上两者都会调用SurfaceFlinger.cpp文件的instantiate函数
19 |
20 | - 启动surfaceflinger后:
21 | 1、 surfaceflinger构造函数调用readyToRun函数, 该函数定义了线程循环前需要初始化的内容。
22 | readyToRun()调用过程:
23 | (1)执行new DisplayHardware(this,dpy),通过DisplayHardware初始化Framebuffer、EGL并获取OpenGL ES信息。
24 | (2)创建共享的内存控制块。
25 | (3)将EGL与当前屏幕绑定。
26 | (4)初始化共享内存控制块。
27 | (5)初始化OpenGL ES。
28 | (6)显示开机动画。
29 |
30 | - 相关的函数及位置:
31 | DisplayHardware.cpp[frameworks\base\libs\surfaceflinger\displayhardware]
32 |
33 | gralloc.cpp [hardware\libhardware\modules\gralloc]
34 |
35 | gralloc.h[hardware\libhardware\include\hardware]
36 |
37 |
38 |
39 |
40 |
41 |
42 | ### /andriod-x86/device/generic/common/init.sh 的分析
43 |
44 | - 和显示相关的代码主要有两部分
45 |
46 |
47 | 1、表示初始化
48 |
49 |
50 | ```sh
51 |
52 | function do_init()
53 | {
54 | init_misc
55 | init_hal_audio
56 | init_hal_bluetooth
57 | init_hal_camera
58 | init_hal_gps
59 | init_hal_gralloc //初始化gralloc
60 | init_hal_hwcomposer
61 | init_hal_lights
62 | init_hal_power
63 | init_hal_sensors
64 | init_tscal
65 | init_ril
66 | chmod 640 /x86.prop
67 | post_init
68 | }
69 | ```
70 |
71 |
72 | 2、 帧缓冲的初始化
73 | ```sh
74 | function init_hal_gralloc()
75 | {
76 |
77 | case "$(cat /proc/fb | head -1)" in // 帧缓冲设备列表,包括数量和控制它的驱动
78 | 0*inteldrmfb|0*radeondrmfb|0*nouveaufb|0*svgadrmfb)
79 | set_property ro.hardware.gralloc drm // ro.hardware.gralloc = drm . drm 是一个 Linux 内核的显示系统驱动框架,模拟一个 fb device
80 | set_drm_mode //设置分辨率1366x768
81 | ;;
82 | "")
83 | init_uvesafb //根据情况设置为:1280x800,1600x900,1024x600,1024x768
84 | ;&
85 | 0*)
86 | [ "$HWACCEL" = "1" ] || set_property debug.egl.hw 0 //debug.egl.hw = 0
87 | ;;
88 | esac
89 |
90 | ```
91 |
92 |
--------------------------------------------------------------------------------
/setting应用/Setting_01/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/repo/android启动图形界面相关log报告/mesa-demo调试log.txt:
--------------------------------------------------------------------------------
1 | Mesa: _mesa_make_current()
2 | Mesa: FLUSH_VERTICES in updated_drawbuffers
3 | Mesa: FLUSH_VERTICES in updated_drawbuffers
4 | Mesa: FLUSH_VERTICES in updated_drawbuffers
5 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
6 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
7 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
8 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
9 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
10 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
11 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
12 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
13 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
14 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
15 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
16 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
17 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
18 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
19 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
20 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
21 | Mesa: FLUSH_VERTICES in _mesa_Viewport
22 | Mesa: glViewport 0 0 500 500
23 | Mesa: FLUSH_VERTICES in _mesa_Clear
24 | Mesa: FLUSH_CURRENT in _mesa_Clear
25 | Mesa: glClear 0x4100
26 | Mesa: _mesa_update_state: (0xffffffff) ctx->ModelView, ctx->Projection, ctx->TextureMatrix, ctx->Color, ctx->Depth, ctx->Eval/EvalMap, ctx->Fog, ctx->Hint, ctx->Light, ctx->Line, ctx->Pixel, ctx->Point, ctx->Polygon, ctx->PolygonStipple, ctx->Scissor, ctx->Stencil, ctx->Texture, ctx->Transform, ctx->Viewport, ctx->Array, ctx->RenderMode, ctx->Visual, ctx->DrawBuffer,,
27 | Mesa: FLUSH_VERTICES in _mesa_LoadIdentity
28 | Mesa: glLoadIdentity()
29 | Mesa: glPushMatrix GL_MODELVIEW
30 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
31 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
32 | Mesa: _mesa_update_state: (0x1) ctx->ModelView,
33 | Mesa: FLUSH_VERTICES in _mesa_flush
34 | Mesa: _mesa_update_state: (0x80800000)
35 | Mesa: FLUSH_CURRENT in _mesa_flush
36 | Mesa: FLUSH_VERTICES in st_flush
37 | Mesa: FLUSH_CURRENT in st_flush
38 | Mesa: FLUSH_VERTICES in _mesa_PopMatrix
39 | Mesa: glPopMatrix GL_MODELVIEW
40 | Mesa: FLUSH_VERTICES in _mesa_flush
41 | Mesa: FLUSH_CURRENT in _mesa_flush
42 | Mesa: FLUSH_VERTICES in st_flush
43 | Mesa: FLUSH_CURRENT in st_flush
44 | Mesa: FLUSH_VERTICES in st_flush
45 | Mesa: FLUSH_CURRENT in st_flush
46 | Mesa: FLUSH_VERTICES in _mesa_Clear
47 | Mesa: FLUSH_CURRENT in _mesa_Clear
48 | Mesa: glClear 0x4100
49 | Mesa: _mesa_update_state: (0x1) ctx->ModelView,
50 | Mesa: FLUSH_VERTICES in _mesa_LoadIdentity
51 | Mesa: glLoadIdentity()
52 | Mesa: glPushMatrix GL_MODELVIEW
53 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
54 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
55 | Mesa: _mesa_update_state: (0x1) ctx->ModelView,
56 | Mesa: FLUSH_VERTICES in _mesa_flush
57 | Mesa: FLUSH_CURRENT in _mesa_flush
58 | Mesa: FLUSH_VERTICES in st_flush
59 | Mesa: FLUSH_CURRENT in st_flush
60 | Mesa: FLUSH_VERTICES in _mesa_PopMatrix
61 | Mesa: glPopMatrix GL_MODELVIEW
62 | Mesa: FLUSH_VERTICES in _mesa_flush
63 | Mesa: FLUSH_CURRENT in _mesa_flush
64 | Mesa: FLUSH_VERTICES in st_flush
65 | Mesa: FLUSH_CURRENT in st_flush
66 | Mesa: FLUSH_VERTICES in st_flush
67 | Mesa: FLUSH_CURRENT in st_flush
68 | Mesa: FLUSH_VERTICES in _mesa_Clear
69 | Mesa: FLUSH_CURRENT in _mesa_Clear
70 | Mesa: glClear 0x4100
--------------------------------------------------------------------------------
/repo/android启动图形界面相关log报告/log-function.md:
--------------------------------------------------------------------------------
1 | Mesa: _mesa_make_current() _mesa_make_current
2 | Mesa: FLUSH_VERTICES in updated_drawbuffers
3 | Mesa: FLUSH_VERTICES in updated_drawbuffers
4 | Mesa: FLUSH_VERTICES in updated_drawbuffers
5 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
6 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
7 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
8 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
9 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
10 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
11 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
12 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
13 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
14 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
15 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
16 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
17 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
18 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
19 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
20 | Mesa: FLUSH_VERTICES in set_scissor_no_notify
21 | Mesa: FLUSH_VERTICES in _mesa_Viewport
22 | Mesa: glViewport 0 0 500 500
23 | Mesa: FLUSH_VERTICES in _mesa_Clear
24 | Mesa: FLUSH_CURRENT in _mesa_Clear
25 | Mesa: glClear 0x4100
26 | Mesa: _mesa_update_state: (0xffffffff) ctx->ModelView, ctx->Projection, ctx->TextureMatrix, ctx->Color, ctx->Depth, ctx->Eval/EvalMap, ctx->Fog, ctx->Hint, ctx->Light, ctx->Line, ctx->Pixel, ctx->Point, ctx->Polygon, ctx->PolygonStipple, ctx->Scissor, ctx->Stencil, ctx->Texture, ctx->Transform, ctx->Viewport, ctx->Array, ctx->RenderMode, ctx->Visual, ctx->DrawBuffer,,
27 | Mesa: FLUSH_VERTICES in _mesa_LoadIdentity
28 | Mesa: glLoadIdentity()
29 | Mesa: glPushMatrix GL_MODELVIEW
30 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
31 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
32 | Mesa: _mesa_update_state: (0x1) ctx->ModelView,
33 | Mesa: FLUSH_VERTICES in _mesa_flush
34 | Mesa: _mesa_update_state: (0x80800000)
35 | Mesa: FLUSH_CURRENT in _mesa_flush
36 | Mesa: FLUSH_VERTICES in st_flush
37 | Mesa: FLUSH_CURRENT in st_flush
38 | Mesa: FLUSH_VERTICES in _mesa_PopMatrix
39 | Mesa: glPopMatrix GL_MODELVIEW
40 | Mesa: FLUSH_VERTICES in _mesa_flush
41 | Mesa: FLUSH_CURRENT in _mesa_flush
42 | Mesa: FLUSH_VERTICES in st_flush
43 | Mesa: FLUSH_CURRENT in st_flush
44 | Mesa: FLUSH_VERTICES in st_flush
45 | Mesa: FLUSH_CURRENT in st_flush
46 | Mesa: FLUSH_VERTICES in _mesa_Clear
47 | Mesa: FLUSH_CURRENT in _mesa_Clear
48 | Mesa: glClear 0x4100
49 | Mesa: _mesa_update_state: (0x1) ctx->ModelView,
50 | Mesa: FLUSH_VERTICES in _mesa_LoadIdentity
51 | Mesa: glLoadIdentity()
52 | Mesa: glPushMatrix GL_MODELVIEW
53 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
54 | Mesa: FLUSH_VERTICES in _mesa_Rotatef
55 | Mesa: _mesa_update_state: (0x1) ctx->ModelView,
56 | Mesa: FLUSH_VERTICES in _mesa_flush
57 | Mesa: FLUSH_CURRENT in _mesa_flush
58 | Mesa: FLUSH_VERTICES in st_flush
59 | Mesa: FLUSH_CURRENT in st_flush
60 | Mesa: FLUSH_VERTICES in _mesa_PopMatrix
61 | Mesa: glPopMatrix GL_MODELVIEW
62 | Mesa: FLUSH_VERTICES in _mesa_flush
63 | Mesa: FLUSH_CURRENT in _mesa_flush
64 | Mesa: FLUSH_VERTICES in st_flush
65 | Mesa: FLUSH_CURRENT in st_flush
66 | Mesa: FLUSH_VERTICES in st_flush
67 | Mesa: FLUSH_CURRENT in st_flush
68 | Mesa: FLUSH_VERTICES in _mesa_Clear
69 | Mesa: FLUSH_CURRENT in _mesa_Clear
70 | Mesa: glClear 0x4100
71 |
72 |
--------------------------------------------------------------------------------
/repo/Ubuntu显示子系统初始化过程及设置.md:
--------------------------------------------------------------------------------
1 | # 调研报告:Ubuntu显示子系统初始化过程及设置
2 | ## 1. Ubuntu显示子系统的初始化流程
3 | 当先的Linux发行版以及Mac系统都使用的是X Window System,X Windwow System是Unix/Linux下面的窗口系统,它是基于Server/Client架构的一种规范,有多不同的实现,在Linux系统下最流行的是Xorg和XFree86。本次所调研的Ubuntu系统所使用的就是Xorg。
4 | Ubuntu下的X Window System为Xorg,其显示系统的初始化过程主要由X server来完成,大体流程为:Ubuntu系统首先启动init进程,init进程调用显示管理器,Ubuntu系统下的显示管理器之前为xdm,现在已经改为了lightdm,之后由显示管理器lightdm来启动X server,最后由X server来完成显示系统的初始化,包括屏幕的分辨率设置、界面显示的方位设置等等。
5 |
6 | ## 2. X server完成显示系统初始化的过程
7 | 在之前的Ubuntu系统版本中,X server首先是要读配置文件xorg.conf来进行显示系统的初始化,该文件的位置为/etc/X11/xorg.conf。但大概在Ubuntu 8.0版本之后,该文件就被取消,X server会在启动的时候**自动检测硬件**,然后生成一个内置的配置,借此来完成显示系统的初始化。尽管如此,我们仍然可以自己创建一个配置文件xorg.conf,使系统按照配置文件里面的参数来完成初始化。
8 | 下面进行实验,通过创建xorg.conf配置文件来修改系统的显示设置。
9 |
10 |
11 | ## 3. 通过创建xorg.conf文件来修改系统显示设置
12 | ① 查看当前系统的屏幕分辨率等相关信息,在终端中输入如下命令:
13 | xrandr
14 | 显示如下:
15 | Screen 0: minimum 1 x 1, current 1440 x 900, maximum 8192 x 8192
16 | Virtual1 connected primary 1440x900+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
17 | 1440x900 60.00*+ 59.89
18 | 2560x1600 59.99
19 | 1920x1440 60.00
20 | 1856x1392 60.00
21 | 1792x1344 60.00
22 | 1920x1200 59.88
23 | 1600x1200 60.00
24 | 1680x1050 59.95
25 | 1400x1050 59.98
26 | 1280x1024 60.02
27 | 1280x960 60.00
28 | 1360x768 60.02
29 | 1280x800 59.81
30 | 1152x864 75.00
31 | 1280x768 59.87
32 | 1024x768 60.00
33 | 800x600 60.32
34 | 640x480 59.94
35 |
36 | 这表示当前分辨率和默认分辨率都是1440x900。
37 | ② 在/etc/X11/目录下创建配置文件xorg.conf
38 | sudo touch xorg.conf
39 | 更改其内容:
40 | Section "Device"
41 | Identifier "Configured Video Device"
42 | EndSection
43 |
44 | Section "Monitor"
45 | Identifier "Configured Monitor"
46 | EndSection
47 |
48 | Section "Screen"
49 | Identifier "Default Screen"
50 | Monitor "Configured Monitor"
51 | Device "Configured Video Device"
52 | SubSection "Display"
53 | Modes "800x600"
54 | EndSubSection
55 | EndSection
56 | 通过修改配置文件,将系统的默认分辨率变为800x600。
57 | ③ 重新启动系统,查看实验结果,其显示信息为:
58 | Screen 0: minimum 1 x 1, current 800 x 600, maximum 8192 x 8192
59 | Virtual1 connected primary 800x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
60 | 800x600 60.00*+ 60.32
61 | 2560x1600 59.99
62 | 1920x1440 60.00
63 | 1856x1392 60.00
64 | 1792x1344 60.00
65 | 1920x1200 59.88
66 | 1600x1200 60.00
67 | 1680x1050 59.95
68 | 1400x1050 59.98
69 | 1280x1024 60.02
70 | 1440x900 59.89
71 | 1280x960 60.00
72 | 1360x768 60.02
73 | 1280x800 59.81
74 | 1152x864 75.00
75 | 1280x768 59.87
76 | 1024x768 60.00
77 | 640x480 59.94
78 | 可以看到,当前的屏幕分辨率和默认分辨率都已经更改为800x600。
79 | ④ 删除配置文件xorg.conf之后,系统恢复到之前的默认分辨率。
80 |
81 | ## 4. 总结
82 | Linux发行版的显示系统的初始化以及显示设置的改变都要通过X server来进行。
83 | 在之前的各个版本的Linux发行版中,都有一个X server的配置文件xorg.conf,当系统启动时,X server根据该配置文件进行初始化,但现在的版本中已经逐渐淘汰了这种方式。
84 | 在现在的版本中,当系统启动时,若没有发现配置文件,X server将在启动的时候自动检测硬件,生成一个内置的配置,里面包含当前自动检测出的配置。我们可以通过手动编写xorg.conf的方式来设置显示系统的配置。
85 |
--------------------------------------------------------------------------------
/setting应用/Setting_01/app/src/main/java/com/example/zhu/setting_01/LinuxTools.java:
--------------------------------------------------------------------------------
1 | package com.example.zhu.setting_01;
2 |
3 | import android.util.Log;
4 |
5 | import java.io.BufferedReader;
6 | import java.io.DataOutputStream;
7 | import java.io.IOException;
8 | import java.io.InputStream;
9 | import java.io.InputStreamReader;
10 |
11 | /**
12 | * Created by zhu on 2016/4/21.
13 | */
14 | public class LinuxTools {
15 | private static final int OUTPUT_BUFFER_SIZE = 1024;
16 | public static String TAG = "############# exrc linux命令运行函数:";
17 | /**
18 | 11
19 | * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限)
20 | 12
21 | * @param command 命令:String apkRoot="chmod 777 "+getPackageCodePath(); RootCommand(apkRoot);
22 | 13
23 | * @return 应用程序是/否获取Root权限
24 | 14
25 | */
26 | public static boolean RootCommand(String command)
27 | {
28 | Process process = null;
29 | DataOutputStream os = null;
30 | try
31 | {
32 | process = Runtime.getRuntime().exec("su");
33 | os = new DataOutputStream(process.getOutputStream());
34 | os.writeBytes(command + "\n");
35 | os.writeBytes("exit\n");
36 | os.flush();
37 | process.waitFor();
38 | } catch (Exception e)
39 | {
40 | Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
41 | return false;
42 | } finally
43 | {
44 | try
45 | {
46 | if (os != null)
47 | {
48 | os.close();
49 | }
50 | process.destroy();
51 | } catch (Exception e)
52 | {}
53 | }
54 | Log.d("*** DEBUG ***", "Root SUC ");
55 | return true;
56 | }
57 |
58 |
59 |
60 | public static String exec(String cmd) {
61 | try {
62 | if (cmd != null)
63 | {
64 | Runtime rt = Runtime.getRuntime();
65 | Log.e(TAG,"su前.......");
66 | // Process process = rt.exec("su");//Root权限
67 | Log.e(TAG,"su后.......01");
68 | Process process = rt.exec("sh");//模拟器测试权限
69 | DataOutputStream dos = new DataOutputStream(process.getOutputStream());
70 | dos.writeBytes(cmd + "\n");
71 | dos.flush();
72 | dos.writeBytes("exit\n");
73 | dos.flush();
74 | Log.e(TAG, "su后.......02");
75 | InputStream myin = process.getInputStream();
76 | InputStreamReader is = new InputStreamReader(myin);
77 | Log.e(TAG,"su后.......03");
78 | char[] buffer = new char[OUTPUT_BUFFER_SIZE];
79 | int bytes_read = is.read(buffer);
80 | StringBuffer aOutputBuffer = new StringBuffer();
81 | while (bytes_read > 0) {
82 | //info.setText(aOutputBuffer.toString());
83 | aOutputBuffer.append(buffer, 0, bytes_read);
84 | Log.e(TAG, "su后.......1111111111");
85 | bytes_read = is.read(buffer);
86 | }
87 | Log.e(TAG,"su后.......04");
88 | Log.e(TAG,aOutputBuffer.toString());
89 | Log.e(TAG,"su后.......05 "+aOutputBuffer.toString());
90 | return aOutputBuffer.toString();
91 | } else {
92 | System.out.println("退出");
93 | return "请输入正确的命令";
94 | }
95 | } catch (IOException e) {
96 | Log.e(TAG, "su后.......出错了");
97 | e.printStackTrace();
98 |
99 | return "操作异常";
100 | }
101 | }
102 |
103 | /* public static String do_exec(String cmd) {
104 | String s = "/n";
105 | try {
106 | Log.e("####################","0001");
107 | Process p = Runtime.getRuntime().exec(cmd);
108 | Log.e("####################","0002");
109 | BufferedReader in = new BufferedReader(
110 | new InputStreamReader(p.getInputStream()));
111 | Log.e("####################","0003");
112 | String line = null;
113 | while ((line = in.readLine()) != null) {
114 | s += line + "/n";
115 | }
116 | } catch (IOException e) {
117 | Log.e("####################","000eee");
118 | // TODO Auto-generated catch block
119 | e.printStackTrace();
120 | }
121 | Log.e("####################:s:",s);
122 | return s;
123 | }*/
124 | }
125 |
--------------------------------------------------------------------------------
/setting应用/Setting_01/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/repo/朱思敏技术报告.md:
--------------------------------------------------------------------------------
1 | #OpenGL 技术报告
2 | ##1、OpenGL是什么
3 | 一种图形硬件的接口。而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。不包括如何窗口管理、用户交互或文件I\O函数,通常一个完整的窗口系统的OPenGL图形处理系统的结构如下:
4 | 
5 |
6 |
7 | ##2、OpenGL的优势
8 | ###①、与 C 语言紧密结合。
9 | OpenGL 命令最初就是用 C 语言函数来进行描述的,对于学习过 C 语言的人来讲,OpenGL 是容易理解和
10 | 学习的。如果你曾经接触过 TC 的 graphics.h,你会发现,使用 OpenGL 作图甚至比 TC 更加简单。
11 | ###②、强大的可移植性。
12 | 微软的 Direct3D 虽然也是十分优秀的图形 API,但它只用于 Windows 系统(现在还要加上一个 XBOX 游戏机)。而 OpenGL 不仅用于 Windows,还可以用于 Unix/Linux 等其它系统,它甚至在大型计算机、各种专业计算机上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。
13 | ###③、高性能的图形渲染。
14 | OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对 OpenGL 提供强力支持,激烈的竞争中使得 OpenGL 性能一直领先。
15 | ##3、OpenGL的编程环境
16 | 本人选择linux系统下的CLion工具,需要配置的有安装:sudo apt-get install freeglut3-dev CMakeLists.txt 文件需要加入相应的路径。
17 | ##4、第一个OpenGL程序
18 |
19 | #include
20 |
21 | void myDisplay(void)
22 |
23 | {//GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西
24 | glClear(GL_COLOR_BUFFER_BIT);
25 | //画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。
26 | glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
27 | //保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。
28 | glFlush();
29 |
30 | }
31 |
32 | int main(int argc, char *argv[])
33 | {
34 |
35 | //对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。
36 |
37 | glutInit(&argc, argv);
38 |
39 | //设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使//用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。
40 |
41 | glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
42 | //设置窗口在屏幕中的位置。
43 |
44 | glutInitWindowPosition(100, 100);
45 | //设置窗口的大小
46 |
47 | glutInitWindowSize(400, 400);
48 |
49 | //根据前面设置的信息创建窗口。参数将被作为窗口的标题
50 |
51 | glutCreateWindow("第一个OpenGL程序");
52 | //设置一个函数,当需要进行画图时,这个函数就会被调用
53 |
54 | glutDisplayFunc(&myDisplay);
55 | //进行一个消息循环这个函数可以显示窗口,并且等待窗口关闭后才会返回
56 |
57 | glutMainLoop();
58 | return 0;
59 | }
60 | 该程序的作用是在一个黑色的窗口中央画一个白色的矩形。
61 |
62 |
63 | ##5、OpenGL可以绘制的简单图形
64 | ###①、OpenGL提供了一系列画点的函数。
65 | 它们都以glVertex开头,后面跟一个数字和1~2个字母。例如:
66 |
67 | glVertex2d
68 | glVertex2f
69 | glVertex3f
70 | glVertex3fv
71 | 数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个字母表示参数的类型
72 |
73 | s表示16位整数(OpenGL中将这个类型定义为GLshort),
74 | i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),
75 | f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),
76 | d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。
77 | v表示传递的几个参数将使用指针的方式
78 | 点是有大小的点的大小默认为1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下: void glPointSize(GLfloat size); size必须大于0.0f,默认值为1.0f,单位为“像素”。
79 |
80 | ###②、直线
81 | 直线可以指定宽度: void glLineWidth(GLfloat width);
82 | 画虚线:glEnable(GL_LINE_STIPPLE);//来启动虚线模式
83 |
84 | void glLineStipple(GLint factor, GLushort pattern);//设置虚线的样式
85 | 画直线的方式:GL_POINTS 、GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP、
86 | GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN效果如下:
87 |
88 | 
89 |
90 | ###③、多边形
91 | 多边形的两面以及绘制方式:
92 | 从三维的角度来看,一个多边形具有两个面。每一个面都可以设置不同的绘制方式:填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。可以为两个面分别设置不同的方式。
93 |
94 | glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充方式
95 | glPolygonMode(GL_BACK, GL_LINE); // 设置反面为边缘绘制方式
96 | glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式
97 | glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
98 | glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针
99 | ####剔除多边形表面:
100 | glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)关闭)
101 | glCullFace来进行剔除。glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。
102 | ####镂空多边形:
103 | glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(glDisable(GL_POLYGON_STIPPLE)关闭)。
104 | void glPolygonStipple(const GLubyte *mask);//设置镂空样式
105 | ##6、OpenGL支持的颜色
106 | OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。
107 | ###①、RGBA颜色
108 | R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha是透明度
109 | glColor*系列函数可以用于设置颜色,其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。例如:
110 |
111 | void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
112 | void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
113 | ###②、索引颜色
114 | OpenGL需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就相当于将调色板的第i格调为某某颜色。“我需要第k种颜色来画图”,那么就用画笔去蘸一下第k格调色板。颜色表的大小是很有限的,一般在256~4096之间,且总是2的整数次幂。在使用索引颜色方式进行绘图时,总是先设置颜色表,然后选择颜色。
115 |
116 | void glIndexi(GLint c);//选择颜色
117 | glClear(GL_COLOR_BUFFER_BIT);//把屏幕上的颜色清空
118 |
119 | ##7、图形变换
120 | 从不同的位置去观察它。(视图变换)
121 | 移动或者旋转它,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
122 | 如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到
123 | 物体的一部分,而不是全部(剪裁)。(投影变换)
124 | 把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
125 | ###模型变换和视图变换
126 | 改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。
127 | 在 OpenGL 中,实现这两种功能甚至使用的是同样的函数。
128 |
129 | glMatrixMode(GL_MODELVIEW);
130 | glLoadIdentity();
131 | glTranslate*,三个参数分别表示了在三个坐标上的位移值。
132 | glRotate*物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数 angle 表示旋转的角度。
133 | glScale*,x,y,z 分别表示在该方向上的缩放比例。
134 | ###投影变换
135 | OpenGL 支持两种类型的投影变换,即透视投影和正投影。投影也是使用矩阵来实现的。如果需要操作投
136 | 影矩阵,需要以 GL_PROJECTION 为参数调用 glMatrixMode 函数。
137 |
138 | glMatrixMode(GL_PROJECTION);
139 | glLoadIdentity();
140 | 透视投影使用 glFrustum 函数
141 | 
142 | 透视投影使用 gluPerspective 函数
143 | 
144 | 正投影
145 | 
146 |
147 | ###视口变换
148 | 应该把像素绘制到窗口的哪个区域呢?通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。使用 glViewport 来定义视口。其中前两个参数定义了视口的左下脚(0,0 表示最左下方),后两个参数分别是宽度和高度。
149 |
150 | glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);
151 |
152 | ##8、动画
153 | 使用双缓冲技术,双缓冲技术是一种在计算机图形中普遍采用的技术,绝大多数 OpenGL 实现都支持双缓冲技术。
154 | 通常都是利用 CPU 空闲的时候绘制动画
155 |
156 | void glutIdleFunc(void (*func)(void))
157 |
158 | 计算帧速
159 |
160 | double CalFrequency()
161 | {
162 | static int count;
163 | static double save;
164 | static clock_t last, current;
165 | double timegap;
166 | ++count;
167 | if( count <= 50 )
168 | return save;
169 | count = 0;
170 | last = current;
171 | current = clock();
172 | timegap = (current-last)/(double)CLK_TCK;
173 | save = 50.0/timegap;
174 | return save;
175 | }
176 |
177 | ##9、光线
178 | 光照模型
179 | 法线向量
180 | 法线向量
181 | 控制材质
182 | ##10、纹理
183 | 还在看。。。。。
--------------------------------------------------------------------------------
/repo/gralloc分析(一).md:
--------------------------------------------------------------------------------
1 | # Gralloc的实现原理分析
2 | 屏幕中画出一个画面流程:
3 | 1. 分配一个匹配屏幕大小的图形缓冲区
4 | 2. 将分配好的图形缓冲区注册(映射)到当前进程的地址空间来
5 | 3. 将要绘制的画面的内容写入到已经注册好的图形缓冲区中去,并且渲染(拷贝)到系统帧缓冲区中去
6 | 为了实现以上三个操作,我们还需要:
7 | 1. 加载Gralloc模块
8 | 2. 打开Gralloc模块中的gralloc设备和fb设备
9 | 其中,gralloc设备负责分配图形缓冲区,Gralloc模块负责注册图形缓冲区,而fb设备负责渲染图形缓冲区。
10 |
11 | - Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面的。Android系统在硬件抽象层中提供了一个Gralloc模块,封装了对帧缓冲区的所有访问操作。
12 | - Linux内核在启动的过程中会创建一个类别和名称分别为“graphics”和“fb0”的设备,用来描述系统中的第一个帧缓冲区,即第一个显示屏。
13 | init进程—>启动进程ueventd来管理系统的设备文件—>ueventd进程通过netlink接口来Linux内核通信,以便可以获得内核中的硬件设备变化通知。而当ueventd进程发现内核中创建了一个类型和名称分别为“graphics”和“fb0”的设备的时候,就会这个设备创建一个/dev/graphics/fb0设备文件。这样,用户空间的应用程序就可以通过设备文件/dev/graphics/fb0来访问内核中的帧缓冲区,即在设备的显示屏中绘制指定的画面。
14 | - 当用户空间中的应用程序不再需要使用一块图形缓冲区的时候,就可以通过gralloc设备来释放它,并且将它从地址空间中解除映射。
15 |
16 | - ### 图解
17 | 
18 |
19 |
20 | - 一、 Gralloc模块的加载过程。
21 | HAL模块都有ID值,hw_get_module就通过ID模块加载到内存,并且获得一个hw_module_t接口来打开相应的设备。
22 | Gralloc模块的ID值在hardware/libhardware/include/hardware/gralloc.h文件中,
23 |
24 | 
25 |
26 | 函数hw_get_module实现在hardware/libhardware/hardware.c文件中
27 |
28 |
29 |
30 | ```sh
31 |
32 | #include
33 |
34 | #include
35 |
36 | #include
37 | #include
38 | #include
39 | #include
40 | #include
41 |
42 | #define LOG_TAG "HAL"
43 | #include
44 |
45 | /** hal modules 的查找路径 */
46 | #if defined(__LP64__)
47 | #define HAL_LIBRARY_PATH1 "/system/lib64/hw"
48 | #define HAL_LIBRARY_PATH2 "/vendor/lib64/hw"
49 | #else
50 | #define HAL_LIBRARY_PATH1 "/system/lib/hw"
51 | #define HAL_LIBRARY_PATH2 "/vendor/lib/hw"
52 | #endif
53 |
54 | static const char *variant_keys[] = {
55 | "ro.hardware", /* This goes first so that it can pick up a different
56 | file on the emulator. */
57 | "ro.product.board",
58 | "ro.board.platform",
59 | "ro.arch"
60 | };
61 |
62 | static const int HAL_VARIANT_KEYS_COUNT =
63 | (sizeof(variant_keys)/sizeof(variant_keys[0]));
64 |
65 | static int load(const char *id,
66 | const char *path,
67 | const struct hw_module_t **pHmi)
68 | {
69 | int status;
70 | void *handle;
71 | struct hw_module_t *hmi;
72 |
73 | handle = dlopen(path, RTLD_NOW);
74 | if (handle == NULL) {
75 | char const *err_str = dlerror();
76 | ALOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");
77 | status = -EINVAL;
78 | goto done;
79 | }
80 |
81 | const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
82 | hmi = (struct hw_module_t *)dlsym(handle, sym);
83 |
84 | /*Gralloc模块加载到内存中来之后,就可以调用函数dlsym来获得它所导出的符号
85 | *HMI。由于这个符号指向的是一个hw_module_t结构体,因此,最后函数load就可以强制地
86 | *将这个符号转换为一个hw_module_t结构体指针,并且保存在输出参数pHmi中返回给调用者。
87 | 调用者获得了这个hw_module_t结构体指针之后,就可以创建一个gralloc设备或者一个fb设备
88 | */
89 | if (hmi == NULL) {
90 | ALOGE("load: couldn't find symbol %s", sym);
91 | status = -EINVAL;
92 | goto done;
93 | }
94 |
95 | /* Check that the id matches */
96 | if (strcmp(id, hmi->id) != 0) {
97 | ALOGE("load: id=%s != hmi->id=%s", id, hmi->id);
98 | status = -EINVAL;
99 | goto done;
100 | }
101 |
102 | hmi->dso = handle;
103 |
104 | /* success */
105 | status = 0;
106 |
107 | done:
108 | if (status != 0) {
109 | hmi = NULL;
110 | if (handle != NULL) {
111 | dlclose(handle);
112 | handle = NULL;
113 | }
114 | } else {
115 | ALOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
116 | id, path, *pHmi, handle);
117 | }
118 |
119 | *pHmi = hmi;
120 |
121 | return status;
122 | }
123 |
124 | static int hw_module_exists(char *path, size_t path_len, const char *name,
125 | const char *subname)
126 | {
127 | snprintf(path, path_len, "%s/%s.%s.so",
128 | HAL_LIBRARY_PATH2, name, subname);
129 | if (access(path, R_OK) == 0)
130 | return 0;
131 |
132 | snprintf(path, path_len, "%s/%s.%s.so",
133 | HAL_LIBRARY_PATH1, name, subname);
134 | if (access(path, R_OK) == 0)
135 | return 0;
136 |
137 | return -ENOENT;
138 | }
139 |
140 | int hw_get_module_by_class(const char *class_id, const char *inst,
141 | const struct hw_module_t **module)
142 | {
143 | int i;
144 | char prop[PATH_MAX];
145 | char path[PATH_MAX];
146 | char name[PATH_MAX];
147 | char prop_name[PATH_MAX];
148 |
149 | if (inst)
150 | snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
151 | else
152 | strlcpy(name, class_id, PATH_MAX);
153 |
154 | /* First try a property specific to the class and possibly instance */
155 | snprintf(prop_name, sizeof(prop_name), "ro.hardware.%s", name);
156 | if (property_get(prop_name, prop, NULL) > 0) {
157 | if (hw_module_exists(path, sizeof(path), name, prop) == 0) {
158 | goto found;
159 | }
160 | }
161 | /* 查找一个名称为
162 | gralloc..so
163 | gralloc..so
164 | gralloc..so
165 | gralloc..so */
166 | for (i=0 ; i内核->init --> ServiceManager->Zygote进程->System进程->SurfaceFlinger::函数instantiate->启动SurfaceFlinger服务
4 | ->创建一个SurfaceFlinger实例->调用SurfaceFlinger::init()初始化->注册到Service Manager中-> SurfaceFlinger::run()调用过程中启动第三个开机画面。
5 |
6 | ## 二、surfaceflinger启动
7 | 在android4.4以后systemserver进程由init直接根据init.rc配置启动了surfaceflinger进程。
8 | ```sh
9 | init.rc
10 | service surfaceflinger /system/bin/surfaceflinger
11 | class main
12 | user system
13 | group graphics drmrpc
14 | onrestart restart zygote
15 | ```
16 | >surfaceflinger进程的main函数,new一个SurfaceFlinger实例,跟着调用SurfaceFlinger类的init()函数完成后面工作,然后向service manager注册服务
17 |
18 | frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp
19 | ```sh
20 | int main(int argc, char** argv) {
21 | ....
22 |
23 | // instantiate surfaceflinger
24 | sp flinger = new SurfaceFlinger();//新实例
25 |
26 | ...
27 |
28 | // initialize before clients can connect
29 | flinger->init();//调用surfaceflinger的初始化函数
30 |
31 | // publish surface flinger
32 | sp sm(defaultServiceManager());
33 | sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);//向service manager注册服务
34 |
35 | // run in this thread
36 | flinger->run();//开跑
37 |
38 | return 0;
39 | }
40 |
41 | ```
42 | 这个init()函数分成三个部分,第一硬件初始化,第二建立消息线程,第三启动开机动画。
43 |
44 | ```sh
45 | void SurfaceFlinger::init() {
46 | ALOGI( "SurfaceFlinger's main thread ready to run. "
47 | "Initializing graphics H/W...");
48 |
49 |
50 | .....
51 |
52 | // initialize our non-virtual displays
53 | for (size_t i=0 ; iisConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
57 | // All non-virtual displays are currently considered secure.
58 | bool isSecure = true;
59 | createBuiltinDisplayLocked(type);
60 | wp token = mBuiltinDisplays[i];
61 |
62 | sp bq = new BufferQueue(new GraphicBufferAlloc());
63 | sp fbs = new FramebufferSurface(*mHwc, i, bq);
64 | sp hw = new DisplayDevice(this,
65 | type, allocateHwcDisplayId(type), isSecure, token,
66 | fbs, bq,
67 | mEGLConfig);
68 | if (i > DisplayDevice::DISPLAY_PRIMARY) {
69 | // FIXME: currently we don't get blank/unblank requests
70 | // for displays other than the main display, so we always
71 | // assume a connected display is unblanked.
72 | ALOGD("marking display %d as acquired/unblanked", i);
73 | hw->acquireScreen();
74 | }
75 | mDisplays.add(token, hw);
76 | }
77 | }
78 |
79 | ...
80 | // start the EventThread
81 | ...
82 | mSFEventThread = new EventThread(sfVsyncSrc);
83 | mEventQueue.setEventThread(mSFEventThread);
84 |
85 | mEventControlThread = new EventControlThread(this);
86 | mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
87 |
88 | ...
89 |
90 | // set initial conditions (e.g. unblank default device)
91 | initializeDisplays();
92 |
93 | // start boot animation
94 | startBootAnim();
95 | }
96 |
97 | ```
98 | 最后调用run()函数,
99 |
100 | ```sh
101 | void SurfaceFlinger::run() {
102 | do {
103 | waitForEvent();
104 | } while (true);
105 | }
106 | ```
107 |
108 |
109 | ## 三、surfaceflinger 与mesa接口分析
110 | surfaceflinger启动后,
111 | 其中waitForEvent()是SurfaceFlinger中的成员函数,它进一步调用mEventQueue.waitMessage()
112 |
113 | ```sh
114 | void SurfaceFlinger::waitForEvent() {
115 | mEventQueue.waitMessage();
116 | }
117 | ```
118 |
119 | ```sh
120 | void MessageQueue::waitMessage() {
121 | do {
122 | IPCThreadState::self()->flushCommands();
123 | int32_t ret =mLooper->pollOnce(-1);
124 | switch (ret) {
125 | caseALOOPER_POLL_WAKE:
126 | caseALOOPER_POLL_CALLBACK:
127 | continue;
128 | caseALOOPER_POLL_ERROR:
129 | ALOGE("ALOOPER_POLL_ERROR");
130 | caseALOOPER_POLL_TIMEOUT:
131 | // timeout(should not happen)
132 | continue;
133 | default:
134 | // should nothappen
135 | ALOGE("Looper::pollOnce() returned unknown status %d", ret);
136 | continue;
137 | }
138 | } while (true);
139 | }
140 |
141 | ```
142 |
143 | 下面这句将在内部调用MessageQueue::mHandler来处理消息:
144 | mLooper->pollOnce(-1);pollOnce函数使用了一个死循环,它不断地取消息进行处理,
145 |
146 | ```sh
147 | /*frameworks/native/services/surfaceflinger/MessageQueue.cpp*/
148 | void MessageQueue::Handler::handleMessage(const Message&message) {
149 | switch (message.what) {
150 | case INVALIDATE:
151 | android_atomic_and(~eventMaskInvalidate, &mEventMask);
152 | mQueue.mFlinger->onMessageReceived(message.what);
153 | break;
154 | case REFRESH:
155 | android_atomic_and(~eventMaskRefresh, &mEventMask);
156 | mQueue.mFlinger->onMessageReceived(message.what);
157 | break;
158 | }
159 | }
160 |
161 | ```
162 | 如上述代码,mHandler当收到INVALIDATE和REFRESH请求时,进一步回调了SurfaceFlinger中的onMessageReceived。
163 | ```sh
164 | void SurfaceFlinger::onMessageReceived(int32_t what) {
165 | ATRACE_CALL();
166 | switch (what) {
167 | case MessageQueue::TRANSACTION: {
168 | handleMessageTransaction();
169 | break;
170 | }
171 | case MessageQueue::INVALIDATE: {
172 | bool refreshNeeded = handleMessageTransaction();
173 | refreshNeeded |= handleMessageInvalidate();
174 | refreshNeeded |= mRepaintEverything;
175 | if (refreshNeeded) {
176 | // Signal a refresh if a transaction modified the window state,
177 | // a new buffer was latched, or if HWC has requested a full
178 | // repaint
179 | signalRefresh();
180 | }
181 | break;
182 | }
183 | case MessageQueue::REFRESH: {
184 | handleMessageRefresh();
185 | break;
186 | }
187 | }
188 |
189 | ```
190 | 根据情况调用
191 |
192 | handleMessageRefresh()
193 | ```sh
194 | void SurfaceFlinger::handleMessageRefresh() {
195 | ATRACE_CALL();
196 | preComposition();
197 | rebuildLayerStacks();
198 | setUpHWComposer();
199 | doDebugFlashRegions();
200 | doComposition();
201 | postComposition();
202 | }
203 |
204 | ```
205 |
206 |
207 |
208 |
--------------------------------------------------------------------------------
/repo/android启动图形界面相关log报告/log-显示相关-报告.md:
--------------------------------------------------------------------------------
1 | ## [dmesg](./dmesg.txt)
2 | - 应该是vga设置
3 |
4 | ```sh
5 | <6>[ 0.062740] vgaarb: setting as boot device: PCI:0000:00:02.0
6 | <6>[ 0.062742] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
7 | <6>[ 0.062743] vgaarb: loaded
8 | <6>[ 0.062743] vgaarb: bridge control possible 0000:00:02.0
9 | ```
10 |
11 | ## [logcat](./logcat.txt)
12 | [logcat](./logcat.md)
13 | ###display初始化相关
14 | ####SurfaceFlinger开始初始化
15 | ```sh
16 | I/SurfaceFlinger( 1099): SurfaceFlinger is starting
17 | I/SurfaceFlinger( 1099): SurfaceFlinger's main thread ready to run. Initializing graphics H/W...
18 | ```
19 | ####验证egl,egl初始化
20 | ```sh
21 | D/libEGL ( 1099): 3D hardware acceleration is disabled
22 | D/libEGL ( 1099): Emulator without GPU support detected. Fallback to software renderer.
23 | D/libEGL ( 1099): loaded /system/lib/egl/libGLES_android.so
24 | ```
25 |
26 | ####下面应该是对设备的基本显示进行配置
27 | ```sh
28 | W/gralloc ( 1099): page flipping not supported (yres_virtual=600, requested=1200)
29 | I/gralloc ( 1099): using (fd=11)
30 | I/gralloc ( 1099): id = VESA VGA
31 | I/gralloc ( 1099): xres = 800 px
32 | I/gralloc ( 1099): yres = 600 px
33 | I/gralloc ( 1099): xres_virtual = 800 px
34 | I/gralloc ( 1099): yres_virtual = 600 px
35 | I/gralloc ( 1099): bpp = 16
36 | I/gralloc ( 1099): r = 11:5
37 | I/gralloc ( 1099): g = 5:6
38 | I/gralloc ( 1099): b = 0:5
39 | I/gralloc ( 1099): width = 127 mm (160.000000 dpi)
40 | I/gralloc ( 1099): height = 95 mm (160.421051 dpi)
41 | I/gralloc ( 1099): refresh rate = 91.11 Hz
42 | ```
43 |
44 | ####hwcomposer 初始化
45 |
46 | ```sh
47 | W/hwcomposer( 1099): getting VSYNC period from fb HAL: 10975503
48 | D/hwcomposer( 1099): Intel hwcomposer module
49 | I/SurfaceFlinger( 1099): Using composer version 1.0
50 | ```sh
51 |
52 |
53 | #### 选择EGLconfig。这步可能在设置EGLContext的时候有点问题,电源管理服务调用eglContext相关的函数出错,在后面给出了。
54 | ```sh
55 | W/SurfaceFlinger( 1099): no suitable EGLConfig found, trying a simpler query
56 | W/SurfaceFlinger( 1099): EGL_SLOW_CONFIG selected!
57 | I/SurfaceFlinger( 1099): EGL information:
58 | I/SurfaceFlinger( 1099): vendor : Android
59 | I/SurfaceFlinger( 1099): version : 1.4 Android META-EGL
60 | I/SurfaceFlinger( 1099): extensions: EGL_KHR_get_all_proc_addresses EGL_ANDROID_presentation_time EGL_KHR_image_base EGL_KHR_fence_sync EGL_ANDROID_image_native_buffer
61 | I/SurfaceFlinger( 1099): Client API: OpenGL_ES
62 | I/SurfaceFlinger( 1099): EGLSurface: 5-6-5-0, config=0x0
63 | W/SurfaceFlinger( 1099): no suitable EGLConfig found, trying a simpler query
64 | W/SurfaceFlinger( 1099): EGL_SLOW_CONFIG selected!
65 | I/SurfaceFlinger( 1099): EGL information:
66 | I/SurfaceFlinger( 1099): vendor : Android
67 | I/SurfaceFlinger( 1099): version : 1.4 Android META-EGL
68 | I/SurfaceFlinger( 1099): extensions: EGL_KHR_get_all_proc_addresses EGL_ANDROID_presentation_time EGL_KHR_image_base EGL_KHR_fence_sync EGL_ANDROID_image_native_buffer
69 | ```
70 |
71 | #### OpenGL ES 初始化操作
72 | ```sh
73 | I/SurfaceFlinger( 1099): Client API: OpenGL_ES
74 | I/SurfaceFlinger( 1099): EGLSurface: 5-6-5-0, config=0x0
75 | I/SurfaceFlinger( 1099): OpenGL ES informations:
76 | I/SurfaceFlinger( 1099): vendor : Android
77 | I/SurfaceFlinger( 1099): renderer : Android PixelFlinger 1.4
78 | I/SurfaceFlinger( 1099): version : OpenGL ES-CM 1.0
79 | I/SurfaceFlinger( 1099): extensions: GL_OES_byte_coordinates GL_OES_fixed_point GL_OES_single_precision GL_OES_read_format GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_OES_matrix_get GL_OES_query_matrix GL_OES_EGL_image GL_OES_EGL_sync GL_OES_compressed_ETC1_RGB8_texture GL_ARB_texture_compression GL_ARB_texture_non_power_of_two GL_ANDROID_user_clip_plane GL_ANDROID_vertex_buffer_object GL_ANDROID_generate_mipmap
80 | I/SurfaceFlinger( 1099): GL_MAX_TEXTURE_SIZE = 4096
81 | I/SurfaceFlinger( 1099): GL_MAX_VIEWPORT_DIMS = 4096
82 | W/SurfaceFlinger( 1099): no suitable EGLConfig found, trying a simpler query
83 | W/SurfaceFlinger( 1099): EGL_SLOW_CONFIG selected!
84 | I/SurfaceFlinger( 1099): EGL information:
85 | I/SurfaceFlinger( 1099): vendor : Android
86 | I/SurfaceFlinger( 1099): version : 1.4 Android META-EGL
87 | I/SurfaceFlinger( 1099): extensions: EGL_KHR_get_all_proc_addresses EGL_ANDROID_presentation_time EGL_KHR_image_base EGL_KHR_fence_sync EGL_ANDROID_image_native_buffer
88 | I/SurfaceFlinger( 1099): Client API: OpenGL_ES
89 | I/SurfaceFlinger( 1099): EGLSurface: 5-6-5-0, config=0x0
90 | ```
91 |
92 | ####初始化显示设备,这里是tty0
93 | ```sh
94 | D/SurfaceFlinger( 1099): Open /dev/tty0 OK
95 | D/SurfaceFlinger( 1099): Set power mode=2, type=0 flinger=0xb685c000
96 | I/SurfaceFlinger( 1099): auto set density to 130
97 | D/libEGL ( 1149): 3D hardware acceleration is disabled
98 | D/libEGL ( 1149): Emulator without GPU support detected. Fallback to software renderer.
99 | D/libEGL ( 1149): loaded /system/lib/egl/libGLES_android.so
100 | ```
101 | --------------------以上为初始化-------------------
102 | ####Zygote初始化过程中的debug信息
103 | ```sh
104 | D/libEGL ( 1108): 3D hardware acceleration is disabled
105 | D/libEGL ( 1108): Emulator without GPU support detected. Fallback to software renderer.
106 | D/libEGL ( 1108): loaded /system/lib/egl/libGLES_android.so
107 | ```
108 |
109 | ####AssetAtlasService使用EGL过程的一个警告
110 | - 负责将预加载的bitmap组装成纹理贴图,生成的纹理贴图可以被用来跨进程使用,以减少内存。
111 |
112 | ```sh
113 | W/AssetAtlasService( 1317): Could not find EGL configuration
114 | ```
115 |
116 | ####渲染警告
117 | ```sh
118 | W/OpenGLRenderer( 1757): can't set property, no Caches instance
119 | W/OpenGLRenderer( 1757): can't set property, no Caches instance
120 | ```
121 |
122 | ####PowerManagerService初始化的过程中错误。eglcontext相关错误
123 |
124 | ```
125 | E/libEGL ( 1317): eglGetConfigAttrib(EGL_NATIVE_VISUAL_ID) failed: 0x3005
126 | E/libEGL ( 1317): eglMakeCurrent:811 error 3009 (EGL_BAD_MATCH)
127 | E/ColorFade( 1317): eglMakeCurrent failed: error 12297
128 | E/ColorFade( 1317): java.lang.Throwable
129 | E/ColorFade( 1317): at com.android.server.display.ColorFade.logEglError(ColorFade.java:671)
130 | E/ColorFade( 1317): at com.android.server.display.ColorFade.attachEglContext(ColorFade.java:651)
131 | E/ColorFade( 1317): at com.android.server.display.ColorFade.captureScreenshotTextureAndSetViewport(ColorFade.java:450)
132 | E/ColorFade( 1317): at com.android.server.display.ColorFade.prepare(ColorFade.java:154)
133 | E/ColorFade( 1317): at com.android.server.display.DisplayPowerState.prepareColorFade(DisplayPowerState.java:183)
134 | E/ColorFade( 1317): at com.android.server.display.DisplayPowerController.animateScreenStateChange(DisplayPowerController.java:885)
135 | E/ColorFade( 1317): at com.android.server.display.DisplayPowerController.updatePowerState(DisplayPowerController.java:581)
136 | E/ColorFade( 1317): at com.android.server.display.DisplayPowerController.access$400(DisplayPowerController.java:72)
137 | E/ColorFade( 1317): at com.android.server.display.DisplayPowerController$DisplayControllerHandler.handleMessage(DisplayPowerController.java:1160)
138 | E/ColorFade( 1317): at android.os.Handler.dispatchMessage(Handler.java:102)
139 | E/ColorFade( 1317): at android.os.Looper.loop(Looper.java:135)
140 | E/ColorFade( 1317): at android.os.HandlerThread.run(HandlerThread.java:61)
141 | E/ColorFade( 1317): at com.android.server.ServiceThread.run(ServiceThread.java:46)
142 | I/libsuspend( 1317): autosuspend_earlysuspend_enable
143 | D/SurfaceFlinger( 1099): Set power mode=0, type=0 flinger=0xb685c000
144 | ```
--------------------------------------------------------------------------------
/repo/app-BufferQueue-SurfaceFlinger 分析—0424.md:
--------------------------------------------------------------------------------
1 | ## 一、BufferQueue的内部原理
2 |
3 |
4 |
5 | 一块Buffer大致经历的过程就是FREE->DEQUEUED->QUEUED->ACQUIRED->FREE。
6 |
7 | Buffer的状态迁移图
8 |
9 |
10 | - BufferQueue
11 |
12 | > BufferQueue是中介管理着buffer,producer通过BufferQueue获取一个buffer,consume通过BufferQueue获取一个buffer.
13 |
14 | - Producer
15 |
16 | > 一般是应用程序。应用程序不断地刷新UI,从而将产生的显示数据源源不断地写到buffer中。
17 |
18 | > dequeue:当Producer需要使用buffer时,向BufferQueue发起dequeue申请,然后才能对指定的缓冲区进行操作。
19 |
20 | > queue:Producer把一块buffer已经写入完成后,将调用BufferQueue的queue。将buffer归还到BufferQueue的队列中。
21 |
22 |
23 | - Consumer
24 |
25 | > 当一块buffer已经就绪后,Consumer就可以开始工作了。
26 |
27 | > BufferQueue的类ConsumerListener: 保证Consumer可以及时的处理buffer其中的函数接口包括:
28 |
29 |
30 | ```sh
31 | struct ConsumerListener :public virtual RefBase {
32 | virtual voidonFrameAvailable() = 0;/*当一块buffer可以被消费时,这个函数会被调用,特别注意此时没有共享锁的保护*/
33 | virtual voidonBuffersReleased() = 0;/*BufferQueue通知consumer它已经释放其slot中的一个或多个 GraphicBuffer引用*/
34 | };
35 |
36 | ```
37 | 当有一帧数据准备就绪后,BufferQueue就会调用onFrameAvailable()来通知Consumer进行消费。
38 |
39 | ##二、BufferQueue中的缓冲区分配
40 |
41 | /*frameworks/native/libs/gui/BufferQueue.cpp*/
42 | ```sh
43 | status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w,uint32_t h, uint32_t format, uint32_t usage) {…
44 | status_t returnFlags(OK);
45 |
46 | {
47 | ...
48 | while (tryAgain) {/* 循环查找符合要求的slot*/
49 | ...
50 | found = INVALID_BUFFER_SLOT;//初始值
51 | ...
52 | if (state ==BufferSlot::DEQUEUED) {
53 | dequeuedCount++;/*统计dequeued buffer数量*/
54 |
55 | ...
56 | if (state== BufferSlot::FREE) { /*寻找符合要求的Slot*/
57 | boolisOlder = mSlots[i].mFrameNumber graphicBuffer(mGraphicBufferAlloc->createGraphicBuffer( w,h, format, usage, &error));
72 | ...
73 | mSlots[buf].mGraphicBuffer = graphicBuffer; //这个Slot终于分配到空间了
74 | ...
75 | returnFlags |=ISurfaceTexture::BUFFER_NEEDS_REALLOCATION;
76 | }
77 | /* 分配GraphicBuffer空间*/
78 | }
79 | ```
80 |
81 | - 找到可用的Slot序号后,为这个Slot分配空间。
82 | 分配空间使用的是mGraphicBufferAlloc这个Allocator,
83 | 如果重新分配了空间,那么最后的返回值中需要加上BUFFER_NEEDS_REALLOCATION标志。客户端在发现这个标志后,它还应调用requestBuffer()来取得最新的buffer地址。
84 |
85 | ## 三、应用程序的绘图流程
86 |
87 | surfaceflinger 启动过程中会启动 通过ctl.start()启动bootanimation
88 | ```sh
89 | void SurfaceFlinger::startBootAnim() {
90 | // start boot animation
91 | property_set("service.bootanim.exit", "0");
92 | property_set("ctl.start", "bootanim");
93 | }
94 | ```
95 |
96 | 使用到的函数文件:
97 |
98 | BootAnimation.h
99 | ```sh
100 | class BootAnimation : public Thread, public IBinder::DeathRecipient
101 | {
102 | public:
103 | BootAnimation();//生成bootanimation对象后,还会生成ISurfaceComposerClient,它是应用与SurfaceFlinger间的桥梁。
104 | virtual ~BootAnimation();
105 |
106 | sp session() const;
107 |
108 | private:
109 | virtual void onFirstRef();
110 | virtual status_t readyToRun();//介绍如何使用BufferQueue,和Opengl ES与EGL的使用流程。
111 | virtual bool threadLoop();//readyToRun后使用opengl ES提供的各种API函数进行绘图
112 |
113 |
114 | virtual void binderDied(const wp& who);
115 |
116 |
117 | ```
118 |
119 | ##### BootAnimation建立与SurfaceFlinger建立联系—ISurfaceComposerClient.
120 |
121 | 当bootanimation被启动后——>Bootanimation_main.cpp生成BootAnimation对象,并开启线程池,同时生成一个SurfaceComposerClient()——>生成ISurfaceComposerClient.
122 |
123 | >ISurfaceComposerClient则是应用与SurfaceFlinger间的桥梁。
124 |
125 | ```sh
126 | BootAnimation::BootAnimation() : Thread(false), mZip(NULL)
127 | {
128 | mSession = new SurfaceComposerClient();
129 | }
130 | ```
131 | ```sh
132 | void SurfaceComposerClient::onFirstRef() {
133 | ...
134 | if (sm != 0) {
135 | sp conn = sm->createConnection();
136 | ...
137 | }
138 |
139 | ```
140 | >SurfaceTexture是应用程序与BufferQueue的传输通道,它指导着UI程序的“画板申请”、“作画流程”等一系列细节。
141 |
142 | >BufferQueue负责关注各个应用程序的“绘画过程”,ISurfaceComposerClient则是应用与SurfaceFlinger间的桥梁。
143 |
144 | >SurfaceFlinger的职责是“Flinger”,即把系统中所有应用程序的最终的“绘图结果”进行“混合”,然后统一显示到物理屏幕上。
145 |
146 | 下面的图描述,应用程序、BufferQueue及SurfaceFlinger间的关系
147 | 
148 |
149 | #### BootAnimation与BufferQueue建立连接
150 | >因为BootAnimation继承自RefBase,当main函数中通过sp指针引用它时,会触发如下函数:
151 |
152 | ```sh
153 | void BootAnimation::onFirstRef() {
154 | status_t err = mSession->linkToComposerDeath(this);//监听死亡事件
155 | ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));
156 | if (err == NO_ERROR) {
157 | run("BootAnimation", PRIORITY_DISPLAY);//开启线程
158 | }
159 | }
160 | ```
161 | >当一个新的线程被run起来后,调用readyToRun():
162 | readyToRun()中显示应用程序是如何使用BufferQueue的,还可以看出Opengl ES与EGL的使用流程。
163 |
164 | ```sh
165 | status_t BootAnimation::readyToRun() {
166 | ...
167 |
168 | // 第一部分,向server端获得buffer空间,从而得到EGL需要的本地窗口
169 | sp control = session()->createSurface(String8("BootAnimation"),
170 | dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
171 |
172 | SurfaceComposerClient::openGlobalTransaction();
173 | control->setLayer(0x40000000);
174 | SurfaceComposerClient::closeGlobalTransaction();
175 |
176 | sp s = control->getSurface();//得到一个Surface对象
177 |
178 | // 以下为第二部分,即EGL的使用流程
179 | const EGLint attribs[] = {
180 | EGL_RED_SIZE, 8,
181 | EGL_GREEN_SIZE, 8,
182 | EGL_BLUE_SIZE, 8,
183 | EGL_DEPTH_SIZE, 0,
184 | EGL_NONE
185 | };
186 | EGLint w, h, dummy;
187 | EGLint numConfigs;
188 | EGLConfig config;
189 | EGLSurface surface;
190 | EGLContext context;
191 |
192 | EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);//第一步,得到默认的物理屏幕
193 |
194 | eglInitialize(display, 0, 0);//第二步,初始化
195 | eglChooseConfig(display, attribs, &config, 1, &numConfigs);//第三步,选取最佳的config
196 | surface = eglCreateWindowSurface(display, config, s.get(), NULL);//第四步,通过本地窗口创建Surface
197 | context = eglCreateContext(display, config, NULL, NULL);//第五步,创建context环境
198 | eglQuerySurface(display, surface, EGL_WIDTH, &w);
199 | eglQuerySurface(display, surface, EGL_HEIGHT, &h);
200 |
201 | if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) //第六步,设置当前环境
202 | return NO_INIT;
203 |
204 | ...
205 | return NO_ERROR;
206 | }
207 | ```
208 |
209 |
210 | BootAnimation::readyToRun()中。因为本地窗口Surface已经成功创建,当EGL准备好环境后,程序可以正常使用opengl ES提供的各种API函数进行绘图了。这部分实现就集中在threadLoop()以及android()/movie()中。
211 |
212 | >SurfaceComposerClient: 应用程序与SurfaceFlinger间的通道,在应用进程中则被封装在SurfaceComposerClient这个类中。这是一个匿名binder server,由应用程序(具体位置在SurfaceComposerClient::onFirstRef中)调用SurfaceFlinger这个实名binder的createConnection方法来获取到,服务端的实现是SurfaceFlinger::Client。
213 |
214 | >ISurface:由应用程序调用ISurfaceComposerClient::createSurface()得到,同时在SurfaceFlinger这一进程中将会有一个Layer被创建,代表了一个“画面”。ISurface就是控制这一画面的handle。
215 |
216 | >Surface:从逻辑关系上看,它是上述ISurface的使用者。从继承关系上看,它是一个SurfaceTextureClient,也就是本地窗口。SurfaceTextureClient内部持有ISurfaceTexture,即BufferQueue的实现接口。换个角度来思考,当EGL想通过Surface这个native window完成某些功能时,后者实际上又利用ISurface和ISurfaceTexture来取得远程服务端的对应服务,以完成EGL的请求。
217 |
218 | 横向角度考查Surface相关类的关系
219 | 
220 |
221 |
222 |
223 | ## 四、应用程序与BufferQueue的关系-ISurfaceTexture
224 | >ISurfaceComposerClient::createSurface()——>返回给应用程序的ISurface.
225 | 对应的变量是surfaceHandle,由layer通过getSurface()产生。
226 |
227 | ```sh
228 |
229 | spSurfaceFlinger::createSurface(ISurfaceComposerClient::surface_data_t* params,
230 | constString8& name, const sp& client, DisplayID d,
231 | uint32_tw, uint32_t h, PixelFormat format, uint32_t flags)
232 | ...
233 | if (layer != 0) {…
234 | surfaceHandle = layer->getSurface();
235 | …
236 | }
237 | return surfaceHandle;
238 | }
239 | ```
240 | >ISurfaceComposerClient::createSurface()得到一个ISurface,
241 |
242 | >ISurface使用ISurface::getSurfaceTexture()来取得可用的texture.
243 |
244 | >通过Surface::init->setISurfaceTexture来将ISurfaceTexture赋值给
245 | SurfaceTextureClient::mSurfaceTexture),
246 |
247 | >最终是通过SurfaceTexture::getBufferQueue()来获得ISurfaceTexture
248 |
249 | ```sh
250 | /*frameworks/native/libs/gui/SurfaceTexture.cpp*/
251 | sp SurfaceTexture::getBufferQueue() const {
252 | Mutex::Autolocklock(mMutex);
253 | return mBufferQueue;
254 | }
255 | ```
256 |
257 | >函数直接返回了mBufferQueue,它指向一个BufferQueue对象。
258 |
259 | 总体流程
260 |
261 |
--------------------------------------------------------------------------------
/repo/android启动图形界面相关log报告/surface分析文档.md:
--------------------------------------------------------------------------------
1 | ### surfacefliner
2 |
3 | #### [初始化](./surfacelinger-init.md) [点击](./surfacelinger-init.md)
4 |
5 | #### onMessageReceived
6 |
7 | > surfacefliner 在初始化之后就会等待信息
8 | >> 由以下三个函数处理不同的信息
9 | >> [handleMessageTransaction函数处理系统显示屏以及应用程序窗口的属性变化,并不进行绘制](http://blog.csdn.net/yangwen123/article/details/17001405)。
10 | >> handleMessageInvalidate 会确定是否需要重绘,若需要以及区域。
11 | >> handleMessageRefresh 进行窗口绘制。
12 |
13 | ### handleMessageRefresh 绘制
14 | void SurfaceFlinger::handleMessageRefresh() {
15 | ATRACE_CALL();
16 | preComposition();
17 | rebuildLayerStacks();
18 | setUpHWComposer();
19 | doDebugFlashRegions();
20 | doComposition();
21 | postComposition();
22 | }
23 |
24 | - preComposition 依照层次排序,过滤去需要刷新的图层;
25 | - rebuildLayerStacks(); 对需要绘制进行再次过滤(对图层进行仿射变换后,考虑图层的属性进行过滤,同时显示某个屏幕是否有效也会被考虑)。
26 | - setUpHWComposer();初始化一个硬件容器
27 | - doComposition();主要的合成过程,将合成完的BUFFER由mesa处理。
28 | - postComposition();
29 |
30 | ### doComposition()
31 |
32 | void SurfaceFlinger::doComposition() {
33 | .....
34 | // transform the dirty region into this screen's coordinate space
35 | const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
36 |
37 | // repaint the framebuffer (if needed)
38 | doDisplayComposition(hw, dirtyRegion);
39 |
40 | hw->dirtyRegion.clear();
41 | hw->flip(hw->swapRegion);
42 | hw->swapRegion.clear();
43 | .....
44 | }
45 | postFramebuffer();
46 |
47 | - - -
48 |
49 | > 是mesa的交互接口。重绘操作在doDisplayComposition(hw, dirtyRegion);执行。
50 | 而上面这个函数主要操作为hw->swapBuffers(getHwComposer());
51 |
52 | void SurfaceFlinger::doDisplayComposition(const sp& hw,
53 | const Region& inDirtyRegion)
54 | {
55 | ......
56 |
57 | // update the swap region and clear the dirty region
58 | hw->swapRegion.orSelf(dirtyRegion);
59 |
60 | // swap buffers (presentation)
61 | hw->swapBuffers(getHwComposer());
62 | }
63 | - - -
64 | void DisplayDevice::swapBuffers(HWComposer& hwc) const {
65 |
66 | if (hwc.initCheck() != NO_ERROR ||(hwc.hasGlesComposition(mHwcDisplayId) &&
67 | (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
68 | EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
69 | if (!success) {
70 | ......
71 | }
72 | }
73 | .....
74 | }
75 |
76 | - - -
77 |
78 |
79 | > 这步调用了mesa的eglSwapBuffers。而这里的参数mDisplay与mSurface来自DisplayDevice构造函数
80 |
81 | EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
82 | if (config == EGL_NO_CONFIG) {
83 | config = RenderEngine::chooseEglConfig(display, format);
84 | }
85 | surface = eglCreateWindowSurface(display, config, window, NULL);
86 |
87 | > eglSwapBuffers使用了使用API.SwapBuffers,而之前已经介绍了这个分发表的机制。其对应函数为以下。
88 | _EGL_CHECK_SURFACE 中将drv 赋值为disp->driver
89 |
90 | EGLBoolean EGLAPIENTRY
91 | eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
92 | {
93 | ......
94 | _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
95 | ......
96 | ret = drv->API.SwapBuffers(drv, disp, surf);
97 | RETURN_EGL_EVAL(disp, ret);
98 | }
99 | - - -
100 |
101 | egl_dri2.c
102 | dri2_drv->base.API.SwapBuffers = dri2_swap_buffers;
103 |
104 | - - -
105 |
106 | #### dri2_swap_buffers
107 |
108 | > 对应dri2_swap_buffers代码很简单,具体实现牵扯很多。
109 |
110 | - - -
111 | static EGLBoolean
112 | dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
113 | {
114 | struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
115 | return dri2_dpy->vtbl->swap_buffers(drv, dpy, surf);
116 | }
117 |
118 |
119 |
120 | ##### dri2_swap_buffers 内部类型转换
121 |
122 | > 1.对_EGLDriver类型变量的DriverData(void*)变量强制转换为dri2_egl_display类型变量。具体实现就是使用了一个宏定义,这个宏会在egl_dri.h文件中直接被调用---> _EGL_DRIVER_STANDARD_TYPECASTS(dri2_egl)。
123 | - - -
124 | // eglDriver.h
125 | #define _EGL_DRIVER_STANDARD_TYPECASTS(drvname) \
126 | _EGL_DRIVER_TYPECAST(drvname ## _driver, _EGLDriver, obj) \
127 | /* note that this is not a direct cast */ \
128 | _EGL_DRIVER_TYPECAST(drvname ## _display, _EGLDisplay, obj->DriverData) \
129 | _EGL_DRIVER_TYPECAST(drvname ## _context, _EGLContext, obj) \
130 | _EGL_DRIVER_TYPECAST(drvname ## _surface, _EGLSurface, obj) \
131 | _EGL_DRIVER_TYPECAST(drvname ## _config, _EGLConfig, obj)
132 |
133 |
134 | #define _EGL_DRIVER_TYPECAST(drvtype, egltype, code) \
135 | static inline struct drvtype *drvtype(const egltype *obj) \
136 | { return (struct drvtype *) code; }
137 | //也就是定义了以下函数:
138 | static inline struct dri2_egl_driver *dri2_egl_driver(const _EGLDriver *obj)
139 | { return (struct dri2_egl_driver *) obj; }
140 |
141 | static inline struct dri2_egl_driver *dri2_egl_display(const_EGLDisplay *obj)
142 | { return (struct dri2_egl_display *) obj->DriverData; }
143 |
144 | static inline struct dri2_egl_driver *dri2_egl_context(const _EGLContext *obj)
145 | { return (struct dri2_egl_context *) obj; }
146 |
147 | static inline struct dri2_egl_driver *dri2_egl_surface(const _EGLSurface *obj)
148 | { return (struct dri2_egl_surface *) obj; }
149 |
150 | static inline struct dri2_egl_driver *dri2_egl_config(const _EGLConfig *obj)
151 | { return (struct dri2_egl_config *) obj; }
152 |
153 |
154 | ##### dri2_swap_buffers 调用swap_buffers [droid_swap_buffers]
155 |
156 | > 2.dri2_dpy的vtbl属性从哪里来。surfacefliner在初始化时候会初始化display以及它对应driver模块(存放在_eglGlobal.DisplayList),同时调用_EGLdriver变量的API的Initialize()函数,这个函数的实现为dri2_initialize,在android平台下会调用 dri2_initialize_android。在dri2_initialize_android完成_EGLdriver变量的DriverData(void*)赋值。是一个dri2_egl_display_vtbl结构的静态变量。
157 |
158 | //platform_android.c
159 | EGLBoolean
160 | dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *dpy)
161 | {
162 | struct dri2_egl_display *dri2_dpy;
163 | ......
164 | dpy->DriverData = (void *) dri2_dpy;
165 |
166 | ......
167 | dri2_dpy->vtbl = &droid_display_vtbl;
168 |
169 | return EGL_TRUE;
170 | ......
171 | }
172 | //platform_android.c
173 | static struct dri2_egl_display_vtbl droid_display_vtbl = {
174 | .....
175 | .swap_buffers = droid_swap_buffers,
176 | .....
177 | };
178 |
179 |
180 | > 因此这里vtbl->swap_buffers函数指针所对应函数为droid_swap_buffers
181 | > dri2_drv->glFlush = (void (*)(void))dri2_drv->get_proc_address("glFlush");
182 | > 这里flush是通过dlsym 实现初始化,具体实现在libglapi.so,也就是mesa的glflush,强制执行缓冲区刷新。
183 | >
184 | static EGLBoolean
185 | droid_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
186 | {
187 | struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
188 | struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
189 | struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
190 | _EGLContext *ctx;
191 |
192 | if (dri2_surf->base.Type != EGL_WINDOW_BIT)
193 | return EGL_TRUE;
194 |
195 | if (dri2_drv->glFlush) {
196 | ctx = _eglGetCurrentContext();
197 | if (ctx && ctx->DrawSurface == &dri2_surf->base)
198 | dri2_drv->glFlush();
199 | }
200 |
201 | dri2_flush_drawable_for_swapbuffers(disp, draw);
202 |
203 | if (dri2_surf->buffer)
204 | droid_window_enqueue_buffer(dri2_surf);
205 |
206 | (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
207 |
208 | return EGL_TRUE;
209 | }
210 |
211 |
212 | ### void SurfaceFlinger::postFramebuffer() 将后台buffer交换到前台(显示)。
213 |
214 | > 首先调用 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);这个函数会调用eglMakecurrent 使得context绑定当前的缓冲线程和读写buffer。
215 | 接着调用 hwc.commit();在这个函数中会调用mHwc->set(mHwc,mDpy, mSur, mList);
216 |
217 | void SurfaceFlinger::postFramebuffer()
218 | {
219 | ATRACE_CALL();
220 |
221 | const nsecs_t now = systemTime();
222 | mDebugInSwapBuffers = now;
223 |
224 | HWComposer& hwc(getHwComposer());
225 | if (hwc.initCheck() == NO_ERROR) {
226 | if (!hwc.supportsFramebufferTarget()) {
227 | getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
228 | }
229 | hwc.commit();
230 | }
231 | .......
232 | getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
233 | 进行按层次刷新
234 | }
235 |
236 | > mHwc->set是个函数指针会调用egl_window_surface_v2_t::swapBuffers()
237 | > swapBuffers这里,通过queueBuffer来入队显示,然后通过dequeueBuffer重新申请一个buffer以用于下一轮的刷新。
238 |
239 | EGLBoolean egl_window_surface_v2_t::swapBuffers()
240 | {
241 | .....
242 |
243 | if (previousBuffer) {
244 | previousBuffer->common.decRef(&previousBuffer->common);
245 | previousBuffer = 0;
246 | }
247 |
248 | unlock(buffer);
249 | previousBuffer = buffer;
250 | nativeWindow->queueBuffer(nativeWindow, buffer, -1);
251 | buffer = 0;
252 |
253 | // dequeue a new buffer
254 | int fenceFd = -1;
255 | if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) {
256 | .....
257 | }
258 | .....
259 | .....
260 | }
261 |
--------------------------------------------------------------------------------
/_a_资料/0001-Enable-radeonsi-on-Android-x86-lollipop.patch:
--------------------------------------------------------------------------------
1 | From 15b1a3dfc84be620cc9ca5f34a32bc0012ef26fa Mon Sep 17 00:00:00 2001
2 | From: Paulo Sergio Travaglia
3 | Date: Tue, 21 Apr 2015 22:03:00 -0300
4 | Subject: [PATCH] Enable radeonsi on Android-x86 (lollipop)
5 |
6 | These changes enables radeonsi compiling on Android-x86.
7 |
8 | The main modifications are:
9 |
10 | - Include paths for LLVM header files and shared/static libraries
11 | - Set C++ flag "c++11" to avoid compiling errors on LLVM header files
12 | - Set defines for LLVM (-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -DHAVE_LLVM=0x0305 -DLLVM_VERSION_PATCH=2)
13 | (Note: llvm on Android seems a mix of 3.4 and 3.5. If set to 3.4, complains about missing include files...)
14 | - Add GALLIVM source files
15 | - Changes path of libelf library for lollipop
16 | ---
17 | Android.common.mk | 9 +++++++--
18 | Android.mk | 1 +
19 | src/egl/drivers/dri2/Android.mk | 3 ++-
20 | src/egl/main/Android.mk | 8 +++++++-
21 | src/gallium/auxiliary/Android.mk | 13 +++++++++++--
22 | src/gallium/drivers/radeon/Android.mk | 7 ++++++-
23 | src/gallium/state_trackers/egl/Android.mk | 3 ++-
24 | src/util/Android.mk | 30 ++++++++++++++++--------------
25 | 8 files changed, 52 insertions(+), 22 deletions(-)
26 |
27 | diff --git a/Android.common.mk b/Android.common.mk
28 | index 26c91f5..5aa7eb1 100644
29 | --- a/Android.common.mk
30 | +++ b/Android.common.mk
31 | @@ -39,7 +39,9 @@ LOCAL_CFLAGS += \
32 | -DHAVE___BUILTIN_UNREACHABLE \
33 | -DPACKAGE_VERSION=\"$(MESA_VERSION)\" \
34 | -DPACKAGE_BUGREPORT=\"https://bugs.freedesktop.org/enter_bug.cgi?product=Mesa\" \
35 | - -DANDROID_VERSION=0x0$(MESA_ANDROID_MAJOR_VERSION)0$(MESA_ANDROID_MINOR_VERSION)
36 | + -DANDROID_VERSION=0x0$(MESA_ANDROID_MAJOR_VERSION)0$(MESA_ANDROID_MINOR_VERSION) \
37 | + -DHAVE_LLVM=0x0305 -DLLVM_VERSION_PATCH=2 \
38 | + -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
39 |
40 | LOCAL_CFLAGS += \
41 | -DHAVE_PTHREAD=1 \
42 | @@ -57,7 +59,10 @@ endif
43 |
44 | LOCAL_CPPFLAGS += \
45 | -Wno-error=non-virtual-dtor \
46 | - -Wno-non-virtual-dtor
47 | + -Wno-non-virtual-dtor \
48 | + -DHAVE_LLVM=0x0305 -DLLVM_VERSION_PATCH=2 \
49 | + -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
50 | +
51 |
52 | # uncomment to keep the debug symbols
53 | #LOCAL_STRIP_MODULE := false
54 | diff --git a/Android.mk b/Android.mk
55 | index b81c060..4b8f507 100644
56 | --- a/Android.mk
57 | +++ b/Android.mk
58 | @@ -40,6 +40,7 @@ MESA_PYTHON2 := python
59 |
60 | DRM_TOP := external/drm
61 | DRM_GRALLOC_TOP := hardware/drm_gralloc
62 | +LLVM_TOP := external/llvm
63 |
64 | classic_drivers := i915 i965
65 | gallium_drivers := swrast freedreno i915g ilo nouveau r300g r600g radeonsi vmwgfx
66 | diff --git a/src/egl/drivers/dri2/Android.mk b/src/egl/drivers/dri2/Android.mk
67 | index 984dcf0..738c219 100644
68 | --- a/src/egl/drivers/dri2/Android.mk
69 | +++ b/src/egl/drivers/dri2/Android.mk
70 | @@ -41,7 +41,8 @@ LOCAL_C_INCLUDES := \
71 | $(MESA_TOP)/src/egl/main \
72 | $(MESA_TOP)/src/loader \
73 | $(DRM_TOP)/include/drm \
74 | - $(DRM_GRALLOC_TOP)
75 | + $(DRM_GRALLOC_TOP) \
76 | + system/core/libsync/include
77 |
78 | LOCAL_STATIC_LIBRARIES := \
79 | libmesa_loader
80 | diff --git a/src/egl/main/Android.mk b/src/egl/main/Android.mk
81 | index e3d6f8b..d283dd8 100644
82 | --- a/src/egl/main/Android.mk
83 | +++ b/src/egl/main/Android.mk
84 | @@ -43,7 +43,11 @@ LOCAL_CFLAGS := \
85 | -D_EGL_DRIVER_SEARCH_DIR=\"/system/lib/egl\" \
86 | -D_EGL_OS_UNIX=1
87 |
88 | -LOCAL_STATIC_LIBRARIES :=
89 | +LOCAL_STATIC_LIBRARIES := \
90 | + libLLVMR600CodeGen \
91 | + libLLVMR600Desc \
92 | + libLLVMR600Info \
93 | + libLLVMR600AsmPrinter \
94 |
95 | LOCAL_SHARED_LIBRARIES := \
96 | libglapi \
97 | @@ -52,6 +56,7 @@ LOCAL_SHARED_LIBRARIES := \
98 | liblog \
99 | libcutils \
100 | libgralloc_drm \
101 | + libLLVM \
102 |
103 | ifeq ($(shell echo "$(MESA_ANDROID_VERSION) >= 4.2" | bc),1)
104 | LOCAL_SHARED_LIBRARIES += libsync
105 | @@ -148,6 +153,7 @@ LOCAL_STATIC_LIBRARIES := \
106 | libmesa_glsl \
107 | libmesa_glsl_utils \
108 | libmesa_gallium \
109 | + libelf \
110 | $(LOCAL_STATIC_LIBRARIES)
111 |
112 | endif # MESA_BUILD_GALLIUM
113 | diff --git a/src/gallium/auxiliary/Android.mk b/src/gallium/auxiliary/Android.mk
114 | index 8046943..f876d0b 100644
115 | --- a/src/gallium/auxiliary/Android.mk
116 | +++ b/src/gallium/auxiliary/Android.mk
117 | @@ -28,11 +28,20 @@ include $(LOCAL_PATH)/Makefile.sources
118 |
119 | include $(CLEAR_VARS)
120 |
121 | -LOCAL_SRC_FILES := $(C_SOURCES)
122 | +LOCAL_CPPFLAGS += \
123 | + -std=c++11
124 | +
125 | +LOCAL_SRC_FILES := \
126 | + $(C_SOURCES) \
127 | + $(GALLIVM_SOURCES) \
128 | + $(GALLIVM_CPP_SOURCES)
129 |
130 | LOCAL_C_INCLUDES := \
131 | $(GALLIUM_TOP)/auxiliary/util \
132 | - $(MESA_TOP)/src
133 | + $(MESA_TOP)/src \
134 | + $(LLVM_TOP)/include \
135 | + $(LLVM_TOP)/device/include \
136 | + external/libcxx/include
137 |
138 | LOCAL_MODULE := libmesa_gallium
139 |
140 | diff --git a/src/gallium/drivers/radeon/Android.mk b/src/gallium/drivers/radeon/Android.mk
141 | index 7220d17..b41f58a 100644
142 | --- a/src/gallium/drivers/radeon/Android.mk
143 | +++ b/src/gallium/drivers/radeon/Android.mk
144 | @@ -28,10 +28,15 @@ include $(LOCAL_PATH)/Makefile.sources
145 |
146 | include $(CLEAR_VARS)
147 |
148 | -LOCAL_SRC_FILES := $(C_SOURCES)
149 | +LOCAL_SRC_FILES := \
150 | + $(C_SOURCES) \
151 | + $(LLVM_C_FILES)
152 |
153 | LOCAL_C_INCLUDES := \
154 | $(DRM_TOP)/radeon \
155 | + $(LLVM_TOP)/include \
156 | + $(LLVM_TOP)/device/include \
157 | + external/elfutils/0.153/libelf \
158 |
159 | LOCAL_MODULE := libmesa_pipe_radeon
160 |
161 | diff --git a/src/gallium/state_trackers/egl/Android.mk b/src/gallium/state_trackers/egl/Android.mk
162 | index d198762..3c013ec 100644
163 | --- a/src/gallium/state_trackers/egl/Android.mk
164 | +++ b/src/gallium/state_trackers/egl/Android.mk
165 | @@ -40,7 +40,8 @@ LOCAL_CFLAGS := \
166 | LOCAL_C_INCLUDES := \
167 | $(GALLIUM_TOP)/state_trackers/egl \
168 | $(GALLIUM_TOP)/winsys \
169 | - $(MESA_TOP)/src/egl/main
170 | + $(MESA_TOP)/src/egl/main \
171 | + system/core/libsync/include
172 |
173 | # swrast only
174 | ifeq ($(MESA_GPU_DRIVERS),swrast)
175 | diff --git a/src/util/Android.mk b/src/util/Android.mk
176 | index 2eb0ef7..2ad27d7 100644
177 | --- a/src/util/Android.mk
178 | +++ b/src/util/Android.mk
179 | @@ -31,7 +31,8 @@ include $(LOCAL_PATH)/Makefile.sources
180 | include $(CLEAR_VARS)
181 |
182 | LOCAL_SRC_FILES := \
183 | - $(MESA_UTIL_FILES)
184 | + $(MESA_UTIL_FILES) \
185 | + $(MESA_UTIL_GENERATED_FILES)
186 |
187 | LOCAL_C_INCLUDES := \
188 | $(MESA_TOP)/src/mesa \
189 | @@ -44,13 +45,13 @@ LOCAL_MODULE := libmesa_util
190 |
191 | LOCAL_MODULE_CLASS := STATIC_LIBRARIES
192 |
193 | -intermediates := $(call local-intermediates-dir)
194 | -LOCAL_GENERATED_SOURCES := $(addprefix $(intermediates)/,$(MESA_UTIL_GENERATED_FILES))
195 | +#intermediates := $(call local-intermediates-dir)
196 | +#LOCAL_GENERATED_SOURCES := $(addprefix $(intermediates)/,$(MESA_UTIL_GENERATED_FILES))
197 |
198 | -$(LOCAL_GENERATED_SOURCES): PRIVATE_PYTHON := $(MESA_PYTHON2)
199 | -$(LOCAL_GENERATED_SOURCES): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PYTHON) $^ > $@
200 | -$(LOCAL_GENERATED_SOURCES): $(intermediates)/%.c: $(LOCAL_PATH)/%.py
201 | - $(transform-generated-source)
202 | +#$(LOCAL_GENERATED_SOURCES): PRIVATE_PYTHON := $(MESA_PYTHON2)
203 | +#$(LOCAL_GENERATED_SOURCES): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PYTHON) $^ > $@
204 | +#$(LOCAL_GENERATED_SOURCES): $(intermediates)/%.c: $(LOCAL_PATH)/%.py
205 | +# $(transform-generated-source)
206 |
207 | include $(MESA_COMMON_MK)
208 | include $(BUILD_STATIC_LIBRARY)
209 | @@ -65,7 +66,8 @@ LOCAL_IS_HOST_MODULE := true
210 | LOCAL_CFLAGS := -D_POSIX_C_SOURCE=199309L
211 |
212 | LOCAL_SRC_FILES := \
213 | - $(MESA_UTIL_FILES)
214 | + $(MESA_UTIL_FILES) \
215 | + $(MESA_UTIL_GENERATED_FILES)
216 |
217 | LOCAL_C_INCLUDES := \
218 | $(MESA_TOP)/src/mesa \
219 | @@ -78,13 +80,13 @@ LOCAL_MODULE := libmesa_util
220 |
221 | LOCAL_MODULE_CLASS := STATIC_LIBRARIES
222 |
223 | -intermediates := $(call local-intermediates-dir)
224 | -LOCAL_GENERATED_SOURCES := $(addprefix $(intermediates)/,$(MESA_UTIL_GENERATED_FILES))
225 | +#intermediates := $(call local-intermediates-dir)
226 | +#LOCAL_GENERATED_SOURCES := $(addprefix $(intermediates)/,$(MESA_UTIL_GENERATED_FILES))
227 |
228 | -$(LOCAL_GENERATED_SOURCES): PRIVATE_PYTHON := $(MESA_PYTHON2)
229 | -$(LOCAL_GENERATED_SOURCES): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PYTHON) $^ > $@
230 | -$(LOCAL_GENERATED_SOURCES): $(intermediates)/%.c: $(LOCAL_PATH)/%.py
231 | - $(transform-generated-source)
232 | +#$(LOCAL_GENERATED_SOURCES): PRIVATE_PYTHON := $(MESA_PYTHON2)
233 | +#$(LOCAL_GENERATED_SOURCES): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PYTHON) $^ > $@
234 | +#$(LOCAL_GENERATED_SOURCES): $(intermediates)/%.c: $(LOCAL_PATH)/%.py
235 | +# $(transform-generated-source)
236 |
237 | include $(MESA_COMMON_MK)
238 | include $(BUILD_HOST_STATIC_LIBRARY)
239 | --
240 | 1.7.12.1
241 |
242 |
--------------------------------------------------------------------------------
/setting应用/Setting_01/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
22 |
29 |
30 |
40 |
48 |
49 |
58 |
59 |
68 |
69 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
92 |
101 |
109 |
110 |
111 |
112 |
121 |
130 |
138 |
139 |
140 |
141 |
150 |
159 |
163 |
171 |
176 |
179 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
--------------------------------------------------------------------------------
/repo/android启动图形界面相关log报告/surfacelinger-init.md:
--------------------------------------------------------------------------------
1 | #### 参照
2 | - [1][ SurfaceFlinger启动过程分析](http://blog.chinaunix.net/uid-29043620-id-4859377.html)
3 |
4 |
5 |
6 | ###surfaceFlinger
7 |
8 | > surfacelinger中维护mEGLContext,mEGLDisplay。通过mEGLContext能实现与mesa的同步,这个变量也是mesa维护的一个全局变量,mesa绘图操作会使用读写缓存。
9 | > mEGLDisplay中包含了驱动信息与链接,egl平台(这里就是android平台)。
10 | ###surfcacelinger main函数
11 | > main 函数中flinger->init()函数初始化了egl,display,driver,eglcontext等等
12 |
13 |
14 | //Main_surfaceFlinger.cpp
15 | int main(int, char**) {
16 | // When SF is launched in its own process, limit the number of
17 | // binder threads to 4.
18 | ProcessState::self()->setThreadPoolMaxThreadCount(4);
19 |
20 | // start the thread pool
21 | sp ps(ProcessState::self());
22 | ps->startThreadPool();
23 |
24 | // instantiate surfaceflinger
25 | sp flinger = new SurfaceFlinger();
26 |
27 | #if defined(HAVE_PTHREADS)
28 | setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY);
29 | #endif
30 | set_sched_policy(0, SP_FOREGROUND);
31 |
32 | // initialize before clients can connect
33 | flinger->init();//init
34 |
35 | // publish surface flinger
36 | sp sm(defaultServiceManager());
37 | sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
38 |
39 | // run in this thread
40 | flinger->run();
41 |
42 | return 0;
43 | }
44 |
45 |
46 | ### SurfaceFlinger::init函数
47 |
48 |
49 | > eglInitialize(mEGLDisplay, NULL, NULL);初始化为Display设置对应驱动
50 |
51 |
52 | //SurfaceFlinger.h SurfaceFlinger.c
53 | void SurfaceFlinger::init() {
54 | ALOGI( "SurfaceFlinger's main thread ready to run. "
55 | "Initializing graphics H/W...");
56 |
57 | status_t err;
58 | Mutex::Autolock _l(mStateLock);
59 |
60 | // initialize EGL for the default display
61 | mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
62 | eglInitialize(mEGLDisplay, NULL, NULL);
63 |
64 | // Initialize the H/W composer object. There may or may not be an
65 | // actual hardware composer underneath.
66 | mHwc = new HWComposer(this,
67 | *static_cast(this));
68 |
69 | // get a RenderEngine for the given display / config (can't fail)
70 | mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
71 |
72 | // retrieve the EGL context that was selected/created
73 | mEGLContext = mRenderEngine->getEGLContext();
74 |
75 | LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
76 | "couldn't create EGLContext");
77 | .......
78 | startBootAnim();
79 | }
80 |
81 | <<<<<<< HEAD
82 | ### surfacelinger 初始化函数中会调用eglGetDisplay并返回一个display[_EGLDisplay* 变量]
83 | =======
84 | ###surfaceFlinger 初始化函数中会调用eglGetDisplay并返回一个display[_EGLDisplay* 变量]
85 | >>>>>>> a677db62b8e00b0812dd3ba8b0c64e1f4bb0423f
86 | > 这个函数会先获取系统EGL的平台
87 |
88 | - { _EGL_PLATFORM_X11, "x11" },
89 | - { _EGL_PLATFORM_WAYLAND, "wayland" },
90 | - { _EGL_PLATFORM_DRM, "drm" },
91 | - { _EGL_PLATFORM_ANDROID, "android" },
92 | - { _EGL_PLATFORM_HAIKU, "haiku" },
93 | - { _EGL_PLATFORM_SURFACELESS, "surfaceless" }
94 |
95 | > 再依据平台找到一个display[_EGLDisplay* 变量],若不存在就创建一个display
96 | > _EGLDisplay是struct _egl_display的别名
97 |
98 |
99 |
100 | ### Driver初始化
101 | > 接着初始化函数调用eglInitialize,在这里才会真正加载硬件驱动。
102 | > 主要操作_eglMatchDriver(disp, EGL_FALSE),为display匹配的驱动
103 |
104 |
105 |
106 | /**
107 | * This is typically the second EGL function that an application calls.
108 | * Here we load/initialize the actual hardware driver.
109 | */
110 | EGLBoolean EGLAPIENTRY
111 | eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
112 | {
113 | _EGLDisplay *disp = _eglLockDisplay(dpy);
114 | ....
115 | if (!disp->Initialized) {
116 | if (!_eglMatchDriver(disp, EGL_FALSE))
117 | RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
118 | .....
119 | RETURN_EGL_SUCCESS(disp, EGL_TRUE);
120 | }
121 | ----------------------------------------------------------
122 | > _eglMatchDriver 主要操作就是执行 _eglMatchAndInitialize。
123 |
124 | _EGLDriver *
125 | _eglMatchDriver(_EGLDisplay *dpy, EGLBoolean test_only)
126 | {
127 | _EGLDriver *best_drv;
128 |
129 | .....
130 | best_drv = _eglMatchAndInitialize(dpy);
131 | if (!best_drv) {
132 | dpy->Options.UseFallback = EGL_TRUE;
133 | best_drv = _eglMatchAndInitialize(dpy);
134 | }
135 | .....
136 | dpy->Driver = best_drv;
137 | dpy->Initialized = EGL_TRUE;
138 | .....
139 | return best_drv;
140 | ----------------------------------------------------------
141 |
142 | #### 匹配Dirver
143 | > 以下是 _eglMatchAndInitialize的具体实现。可以看出首先是调用_eglAddDrivers。
144 |
145 | /**
146 | * A helper function for _eglMatchDriver. It finds the first driver that can
147 | * initialize the display and return.
148 | */
149 | static _EGLDriver *
150 | _eglMatchAndInitialize(_EGLDisplay *dpy)
151 | {
152 | _EGLDriver *drv = NULL;
153 | EGLint i = 0;
154 |
155 | if (!_eglAddDrivers()) {
156 | _eglLog(_EGL_WARNING, "failed to find any driver");
157 | return NULL;
158 | }
159 |
160 | if (dpy->Driver) {
161 | drv = dpy->Driver;
162 | /* no re-matching? */
163 | if (!drv->API.Initialize(drv, dpy))
164 | drv = NULL;
165 | return drv;
166 | }
167 |
168 | while (i < _eglModules->Size) {
169 | _EGLModule *mod = (_EGLModule *) _eglModules->Elements[i];
170 |
171 | if (!_eglLoadModule(mod)) {
172 | /* remove invalid modules */
173 | _eglEraseArray(_eglModules, i, _eglFreeModule);
174 | continue;
175 | }
176 |
177 | if (mod->Driver->API.Initialize(mod->Driver, dpy)) {
178 | drv = mod->Driver;
179 | break;
180 | }
181 | else {
182 | i++;
183 | }
184 | }
185 |
186 | return drv;
187 | }
188 |
189 | static EGLBoolean
190 | _eglAddDrivers(void)
191 | {
192 | if (_eglModules)
193 | return EGL_TRUE;
194 |
195 | if (!_eglAddUserDriver()) {
196 | /*
197 | * Add other drivers only when EGL_DRIVER is not set. The order here
198 | * decides the priorities.
199 | */
200 | _eglAddBuiltInDrivers();
201 | }
202 |
203 | return (_eglModules != NULL);
204 | }
205 | #### 加载Driver 模块
206 |
207 | > _eglBuiltInDrivers 数组最多会包含{{ "egl_dri2", _eglBuiltInDriverDRI2 }
208 | > { "egl_haiku", _eglBuiltInDriverHaiku },{ NULL, NULL }} 。
209 | > _eglModules 是eglDrivers的一个全局变量(初次使用_eglAddModule会被初始化)。
210 | > 同时这里为对应driver模块复制入口函数。
211 | > _eglAddBuiltInDrivers 功能与 _eglAddUserDriver类似,汇总后者调用失败是调用,这里会将预置的driverModule都加入。.
212 | > driverModule 会保存在一个全局变量 _eglModules中。
213 |
214 | static EGLBoolean
215 | _eglAddUserDriver(void)
216 | {
217 | char *env;
218 |
219 | env = getenv("EGL_DRIVER");
220 | if (env) {
221 | EGLint i;
222 |
223 | for (i = 0; _eglBuiltInDrivers[i].name; i++) {
224 | if (!strcmp(_eglBuiltInDrivers[i].name, env)) {
225 | _EGLModule *mod = _eglAddModule(env);
226 | if (mod)
227 | mod->BuiltIn = _eglBuiltInDrivers[i].main;
228 |
229 | return EGL_TRUE;
230 | }
231 | }
232 | }
233 |
234 | return EGL_FALSE;
235 | ----------------------------------------------------------
236 |
237 | #### 初始化eglAPI函数
238 |
239 | > 这一步非常关键,_eglLoadModule不仅仅只加载模块。它会执行一步操作drv = mod->BuiltIn(NULL),而BuiltIn函数指针在android平台下就是 _eglBuiltInDriverDRI2。
240 |
241 | if (!_eglLoadModule(mod)) {
242 | /* remove invalid modules */
243 | _eglEraseArray(_eglModules, i, _eglFreeModule);
244 | continue;
245 | }
246 |
247 | > 进一步查看 _eglBuiltInDriverDRI2。首先是
248 | _eglInitDriverFallbacks这里也是为dri2_drv这个变量设置函数指针所指向的函数。
249 | > dri2_drv->base.API.Initialize = dri2_initialize; 这一句会将API.Initialize指向dri2_initialize,而这个函数会在下面用到。最后mod->Driver会被设置为一个 _EGLDriver 变量(已初始化,包含函数分发表)
250 |
251 | /**
252 | * This is the main entrypoint into the driver, called by libEGL.
253 | * Create a new _EGLDriver object and init its dispatch table.
254 | */
255 | _EGLDriver *
256 | _eglBuiltInDriverDRI2(const char *args)
257 | {
258 | struct dri2_egl_driver *dri2_drv;
259 |
260 | (void) args;
261 |
262 | dri2_drv = calloc(1, sizeof *dri2_drv);
263 | if (!dri2_drv)
264 | return NULL;
265 |
266 | if (!dri2_load(&dri2_drv->base)) {
267 | free(dri2_drv);
268 | return NULL;
269 | }
270 |
271 | _eglInitDriverFallbacks(&dri2_drv->base);
272 | dri2_drv->base.API.Initialize = dri2_initialize;
273 | dri2_drv->base.API.Terminate = dri2_terminate;
274 | .....
275 | return &dri2_drv->base;
276 | }
277 |
278 | #### 为display 设置与初始化 Driver
279 |
280 | > 这里看代码,首先是调用一个Initialize函数,这里的Initialize函数就是上一步中的dri2_initialize。在android平台下
281 | 这一部会执行 dri2_initialize_android.
282 |
283 | /**
284 | * Called via eglInitialize(), GLX_drv->API.Initialize().
285 | */
286 | static EGLBoolean
287 | dri2_initialize(_EGLDriver *drv, _EGLDisplay *disp)
288 | {
289 | /* not until swrast_dri is supported */
290 | if (disp->Options.UseFallback) // 环境变量重不存在driver就会执行这步操作
291 | return EGL_FALSE;
292 |
293 | ......
294 | #ifdef HAVE_X11_PLATFORM
295 | case _EGL_PLATFORM_X11:
296 | if (disp->Options.TestOnly)
297 | return EGL_TRUE;
298 | return dri2_initialize_x11(drv, disp);
299 | #endif
300 | ......
301 | #ifdef HAVE_ANDROID_PLATFORM
302 | case _EGL_PLATFORM_ANDROID:
303 | if (disp->Options.TestOnly)
304 | return EGL_TRUE;
305 | return dri2_initialize_android(drv, disp);
306 | #endif
307 | .....
308 | }
309 |
310 | > dri2_initialize_android 看不太明白,大致是完成一些初始化,往后分析应该能确认它的作用。
311 |
312 | > 初始化结束后会返回一个_EGLDriver 变量,这个变量会赋值到display
313 |
314 |
315 | > 这里的API也是一个 _egl_api 对象,里面包含着函数指针。
316 |
317 |
318 | ### 接着调用RenderEngine::create(mEGLDisplay, mHwc->getVisualID())
319 |
320 | > 从log信息来看,这里是实现对eglContext的设置
321 | > 主要操作在create的eglMakeCurrent,这个函数会调用函数分发表的MakeCurrent。
322 | > 之前理解错误。实际上这个函数会指向dri2_make_current。这一步会传递Driver对象,以及用于读写的EGlsurface。
323 |
324 |
325 |
326 |
327 |
328 | #### struct _egl_display
329 |
330 | struct _egl_display
331 | {
332 | /* used to link displays */
333 | _EGLDisplay *Next;
334 |
335 | mtx_t Mutex;
336 |
337 | _EGLPlatformType Platform; /**< The type of the platform display */
338 | void *PlatformDisplay; /**< A pointer to the platform display */
339 |
340 | _EGLDriver *Driver; /**< Matched driver of the display */
341 | EGLBoolean Initialized; /**< True if the display is initialized */
342 |
343 | /* options that affect how the driver initializes the display */
344 | struct {
345 | EGLBoolean TestOnly; /**< Driver should not set fields when true */
346 | EGLBoolean UseFallback; /**< Use fallback driver (sw or less features) */
347 | } Options;
348 |
349 | /* these fields are set by the driver during init */
350 | void *DriverData; /**< Driver private data */
351 | EGLint Version; /**< EGL version major*10+minor */
352 | EGLint ClientAPIs; /**< Bitmask of APIs supported (EGL_xxx_BIT) */
353 | _EGLExtensions Extensions; /**< Extensions supported */
354 |
355 | /* these fields are derived from above */
356 | char VersionString[100]; /**< EGL_VERSION */
357 | char ClientAPIsString[100]; /**< EGL_CLIENT_APIS */
358 | char ExtensionsString[_EGL_MAX_EXTENSIONS_LEN]; /**< EGL_EXTENSIONS */
359 |
360 | _EGLArray *Screens;
361 | _EGLArray *Configs;
362 |
363 | /* lists of resources */
364 | _EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
365 | };
366 | <<<<<<< HEAD
367 | http://blog.csdn.net/DroidPhone/article/details/5799792
368 | =======
369 | >>>>>>> a677db62b8e00b0812dd3ba8b0c64e1f4bb0423f
370 |
--------------------------------------------------------------------------------
/repo/busybox的fbset命令简单实现.c:
--------------------------------------------------------------------------------
1 | /* vi: set sw=4 ts=4: */
2 | /*
3 | * Mini fbset implementation for busybox
4 | *
5 | * Copyright (C) 1999 by Randolph Chung
6 | *
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 | *
9 | * This is a from-scratch implementation of fbset; but the de facto fbset
10 | * implementation was a good reference. fbset (original) is released under
11 | * the GPL, and is (c) 1995-1999 by:
12 | * Geert Uytterhoeven (Geert.Uytterhoeven@cs.kuleuven.ac.be)
13 | */
14 |
15 | #include "libbb.h"
16 |
17 | #define DEFAULTFBDEV FB_0
18 | #define DEFAULTFBMODE "/etc/fb.modes"
19 |
20 | enum {
21 | OPT_CHANGE = (1 << 0),
22 | OPT_INFO = (1 << 1),
23 | OPT_READMODE = (1 << 2),
24 | OPT_ALL = (1 << 9),
25 |
26 | CMD_FB = 1,
27 | CMD_DB = 2,
28 | CMD_GEOMETRY = 3,
29 | CMD_TIMING = 4,
30 | CMD_ACCEL = 5,
31 | CMD_HSYNC = 6,
32 | CMD_VSYNC = 7,
33 | CMD_LACED = 8,
34 | CMD_DOUBLE = 9,
35 | /* CMD_XCOMPAT = 10, */
36 | CMD_ALL = 11,
37 | CMD_INFO = 12,
38 | CMD_CHANGE = 13,
39 |
40 | #ifdef CONFIG_FEATURE_FBSET_FANCY
41 | CMD_XRES = 100,
42 | CMD_YRES = 101,
43 | CMD_VXRES = 102,
44 | CMD_VYRES = 103,
45 | CMD_DEPTH = 104,
46 | CMD_MATCH = 105,
47 | CMD_PIXCLOCK = 106,
48 | CMD_LEFT = 107,
49 | CMD_RIGHT = 108,
50 | CMD_UPPER = 109,
51 | CMD_LOWER = 110,
52 | CMD_HSLEN = 111,
53 | CMD_VSLEN = 112,
54 | CMD_CSYNC = 113,
55 | CMD_GSYNC = 114,
56 | CMD_EXTSYNC = 115,
57 | CMD_BCAST = 116,
58 | CMD_RGBA = 117,
59 | CMD_STEP = 118,
60 | CMD_MOVE = 119,
61 | #endif
62 | };
63 |
64 | static unsigned g_options;
65 |
66 | /* Stuff stolen from the kernel's fb.h */
67 | #define FB_ACTIVATE_ALL 64
68 | enum {
69 | FBIOGET_VSCREENINFO = 0x4600,
70 | FBIOPUT_VSCREENINFO = 0x4601
71 | };
72 | struct fb_bitfield {
73 | uint32_t offset; /* beginning of bitfield */
74 | uint32_t length; /* length of bitfield */
75 | uint32_t msb_right; /* !=0: Most significant bit is right */
76 | };
77 | struct fb_var_screeninfo {
78 | uint32_t xres; /* visible resolution */
79 | uint32_t yres;
80 | uint32_t xres_virtual; /* virtual resolution */
81 | uint32_t yres_virtual;
82 | uint32_t xoffset; /* offset from virtual to visible */
83 | uint32_t yoffset; /* resolution */
84 |
85 | uint32_t bits_per_pixel;
86 | uint32_t grayscale; /* !=0 Graylevels instead of colors */
87 |
88 | struct fb_bitfield red; /* bitfield in fb mem if true color, */
89 | struct fb_bitfield green; /* else only length is significant */
90 | struct fb_bitfield blue;
91 | struct fb_bitfield transp; /* transparency */
92 |
93 | uint32_t nonstd; /* !=0 Non standard pixel format */
94 |
95 | uint32_t activate; /* see FB_ACTIVATE_x */
96 |
97 | uint32_t height; /* height of picture in mm */
98 | uint32_t width; /* width of picture in mm */
99 |
100 | uint32_t accel_flags; /* acceleration flags (hints) */
101 |
102 | /* Timing: All values in pixclocks, except pixclock (of course) */
103 | uint32_t pixclock; /* pixel clock in ps (pico seconds) */
104 | uint32_t left_margin; /* time from sync to picture */
105 | uint32_t right_margin; /* time from picture to sync */
106 | uint32_t upper_margin; /* time from sync to picture */
107 | uint32_t lower_margin;
108 | uint32_t hsync_len; /* length of horizontal sync */
109 | uint32_t vsync_len; /* length of vertical sync */
110 | uint32_t sync; /* see FB_SYNC_x */
111 | uint32_t vmode; /* see FB_VMODE_x */
112 | uint32_t reserved[6]; /* Reserved for future compatibility */
113 | };
114 |
115 |
116 | static const struct cmdoptions_t {
117 | const char name[10];
118 | const unsigned char param_count;
119 | const unsigned char code;
120 | } g_cmdoptions[] = {
121 | { "-fb", 1, CMD_FB },
122 | { "-db", 1, CMD_DB },
123 | { "-a", 0, CMD_ALL },
124 | { "-i", 0, CMD_INFO },
125 | { "-g", 5, CMD_GEOMETRY },
126 | { "-t", 7, CMD_TIMING },
127 | { "-accel", 1, CMD_ACCEL },
128 | { "-hsync", 1, CMD_HSYNC },
129 | { "-vsync", 1, CMD_VSYNC },
130 | { "-laced", 1, CMD_LACED },
131 | { "-double", 1, CMD_DOUBLE },
132 | { "-n", 0, CMD_CHANGE },
133 | #ifdef CONFIG_FEATURE_FBSET_FANCY
134 | { "-all", 0, CMD_ALL },
135 | { "-xres", 1, CMD_XRES },
136 | { "-yres", 1, CMD_YRES },
137 | { "-vxres", 1, CMD_VXRES },
138 | { "-vyres", 1, CMD_VYRES },
139 | { "-depth", 1, CMD_DEPTH },
140 | { "-match", 0, CMD_MATCH },
141 | { "-geometry", 5, CMD_GEOMETRY },
142 | { "-pixclock", 1, CMD_PIXCLOCK },
143 | { "-left", 1, CMD_LEFT },
144 | { "-right", 1, CMD_RIGHT },
145 | { "-upper", 1, CMD_UPPER },
146 | { "-lower", 1, CMD_LOWER },
147 | { "-hslen", 1, CMD_HSLEN },
148 | { "-vslen", 1, CMD_VSLEN },
149 | { "-timings", 7, CMD_TIMING },
150 | { "-csync", 1, CMD_CSYNC },
151 | { "-gsync", 1, CMD_GSYNC },
152 | { "-extsync", 1, CMD_EXTSYNC },
153 | { "-bcast", 1, CMD_BCAST },
154 | { "-rgba", 1, CMD_RGBA },
155 | { "-step", 1, CMD_STEP },
156 | { "-move", 1, CMD_MOVE },
157 | #endif
158 | { "", 0, 0 }
159 | };
160 |
161 | #ifdef CONFIG_FEATURE_FBSET_READMODE
162 | /* taken from linux/fb.h */
163 | enum {
164 | FB_VMODE_INTERLACED = 1, /* interlaced */
165 | FB_VMODE_DOUBLE = 2, /* double scan */
166 | FB_SYNC_HOR_HIGH_ACT = 1, /* horizontal sync high active */
167 | FB_SYNC_VERT_HIGH_ACT = 2, /* vertical sync high active */
168 | FB_SYNC_EXT = 4, /* external sync */
169 | FB_SYNC_COMP_HIGH_ACT = 8 /* composite sync high active */
170 | };
171 | #endif
172 |
173 | static int readmode(struct fb_var_screeninfo *base, const char *fn,
174 | const char *mode)
175 | {
176 | #ifdef CONFIG_FEATURE_FBSET_READMODE
177 | FILE *f;
178 | char buf[256];
179 | char *p = buf;
180 |
181 | f = xfopen(fn, "r");
182 | while (!feof(f)) {
183 | fgets(buf, sizeof(buf), f);
184 | if (!(p = strstr(buf, "mode ")) && !(p = strstr(buf, "mode\t")))
185 | continue;
186 | p += 5;
187 | if (!(p = strstr(buf, mode)))
188 | continue;
189 | p += strlen(mode);
190 | if (!isspace(*p) && (*p != 0) && (*p != '"')
191 | && (*p != '\r') && (*p != '\n'))
192 | continue; /* almost, but not quite */
193 |
194 | while (!feof(f)) {
195 | fgets(buf, sizeof(buf), f);
196 | if ((p = strstr(buf, "geometry "))) {
197 | p += 9;
198 | /* FIXME: catastrophic on arches with 64bit ints */
199 | sscanf(p, "%d %d %d %d %d",
200 | &(base->xres), &(base->yres),
201 | &(base->xres_virtual), &(base->yres_virtual),
202 | &(base->bits_per_pixel));
203 | } else if ((p = strstr(buf, "timings "))) {
204 | p += 8;
205 | sscanf(p, "%d %d %d %d %d %d %d",
206 | &(base->pixclock),
207 | &(base->left_margin), &(base->right_margin),
208 | &(base->upper_margin), &(base->lower_margin),
209 | &(base->hsync_len), &(base->vsync_len));
210 | } else if ((p = strstr(buf, "laced "))) {
211 | //p += 6;
212 | if (strstr(buf, "false")) {
213 | base->vmode &= ~FB_VMODE_INTERLACED;
214 | } else {
215 | base->vmode |= FB_VMODE_INTERLACED;
216 | }
217 | } else if ((p = strstr(buf, "double "))) {
218 | //p += 7;
219 | if (strstr(buf, "false")) {
220 | base->vmode &= ~FB_VMODE_DOUBLE;
221 | } else {
222 | base->vmode |= FB_VMODE_DOUBLE;
223 | }
224 | } else if ((p = strstr(buf, "vsync "))) {
225 | //p += 6;
226 | if (strstr(buf, "low")) {
227 | base->sync &= ~FB_SYNC_VERT_HIGH_ACT;
228 | } else {
229 | base->sync |= FB_SYNC_VERT_HIGH_ACT;
230 | }
231 | } else if ((p = strstr(buf, "hsync "))) {
232 | //p += 6;
233 | if (strstr(buf, "low")) {
234 | base->sync &= ~FB_SYNC_HOR_HIGH_ACT;
235 | } else {
236 | base->sync |= FB_SYNC_HOR_HIGH_ACT;
237 | }
238 | } else if ((p = strstr(buf, "csync "))) {
239 | //p += 6;
240 | if (strstr(buf, "low")) {
241 | base->sync &= ~FB_SYNC_COMP_HIGH_ACT;
242 | } else {
243 | base->sync |= FB_SYNC_COMP_HIGH_ACT;
244 | }
245 | } else if ((p = strstr(buf, "extsync "))) {
246 | //p += 8;
247 | if (strstr(buf, "false")) {
248 | base->sync &= ~FB_SYNC_EXT;
249 | } else {
250 | base->sync |= FB_SYNC_EXT;
251 | }
252 | }
253 |
254 | if (strstr(buf, "endmode"))
255 | return 1;
256 | }
257 | }
258 | #else
259 | bb_error_msg("mode reading not compiled in");
260 | #endif
261 | return 0;
262 | }
263 |
264 | static inline void setmode(struct fb_var_screeninfo *base,
265 | struct fb_var_screeninfo *set)
266 | {
267 | if ((int) set->xres > 0)
268 | base->xres = set->xres;
269 | if ((int) set->yres > 0)
270 | base->yres = set->yres;
271 | if ((int) set->xres_virtual > 0)
272 | base->xres_virtual = set->xres_virtual;
273 | if ((int) set->yres_virtual > 0)
274 | base->yres_virtual = set->yres_virtual;
275 | if ((int) set->bits_per_pixel > 0)
276 | base->bits_per_pixel = set->bits_per_pixel;
277 | }
278 |
279 | static inline void showmode(struct fb_var_screeninfo *v)
280 | {
281 | double drate = 0, hrate = 0, vrate = 0;
282 |
283 | if (v->pixclock) {
284 | drate = 1e12 / v->pixclock;
285 | hrate = drate / (v->left_margin + v->xres + v->right_margin + v->hsync_len);
286 | vrate = hrate / (v->upper_margin + v->yres + v->lower_margin + v->vsync_len);
287 | }
288 | printf("\nmode \"%ux%u-%u\"\n"
289 | #ifdef CONFIG_FEATURE_FBSET_FANCY
290 | "\t# D: %.3f MHz, H: %.3f kHz, V: %.3f Hz\n"
291 | #endif
292 | "\tgeometry %u %u %u %u %u\n"
293 | "\ttimings %u %u %u %u %u %u %u\n"
294 | "\taccel %s\n"
295 | "\trgba %u/%u,%u/%u,%u/%u,%u/%u\n"
296 | "endmode\n\n",
297 | v->xres, v->yres, (int) (vrate + 0.5),
298 | #ifdef CONFIG_FEATURE_FBSET_FANCY
299 | drate / 1e6, hrate / 1e3, vrate,
300 | #endif
301 | v->xres, v->yres, v->xres_virtual, v->yres_virtual, v->bits_per_pixel,
302 | v->pixclock, v->left_margin, v->right_margin, v->upper_margin, v->lower_margin,
303 | v->hsync_len, v->vsync_len,
304 | (v->accel_flags > 0 ? "true" : "false"),
305 | v->red.length, v->red.offset, v->green.length, v->green.offset,
306 | v->blue.length, v->blue.offset, v->transp.length, v->transp.offset);
307 | }
308 |
309 | #ifdef STANDALONE
310 | int main(int argc, char **argv)
311 | #else
312 | int fbset_main(int argc, char **argv);
313 | int fbset_main(int argc, char **argv)
314 | #endif
315 | {
316 | struct fb_var_screeninfo var, varset;
317 | int fh, i;
318 | const char *fbdev = DEFAULTFBDEV;
319 | const char *modefile = DEFAULTFBMODE;
320 | char *thisarg, *mode = NULL;
321 |
322 | memset(&varset, 0xFF, sizeof(varset));
323 |
324 | /* parse cmd args.... why do they have to make things so difficult? */
325 | argv++;
326 | argc--;
327 | for (; argc > 0 && (thisarg = *argv); argc--, argv++) {
328 | for (i = 0; g_cmdoptions[i].name[0]; i++) {
329 | if (strcmp(thisarg, g_cmdoptions[i].name))
330 | continue;
331 | if (argc-1 < g_cmdoptions[i].param_count)
332 | bb_show_usage();
333 |
334 | switch (g_cmdoptions[i].code) {
335 | case CMD_FB:
336 | fbdev = argv[1];
337 | break;
338 | case CMD_DB:
339 | modefile = argv[1];
340 | break;
341 | case CMD_GEOMETRY:
342 | varset.xres = xatou32(argv[1]);
343 | varset.yres = xatou32(argv[2]);
344 | varset.xres_virtual = xatou32(argv[3]);
345 | varset.yres_virtual = xatou32(argv[4]);
346 | varset.bits_per_pixel = xatou32(argv[5]);
347 | break;
348 | case CMD_TIMING:
349 | varset.pixclock = xatou32(argv[1]);
350 | varset.left_margin = xatou32(argv[2]);
351 | varset.right_margin = xatou32(argv[3]);
352 | varset.upper_margin = xatou32(argv[4]);
353 | varset.lower_margin = xatou32(argv[5]);
354 | varset.hsync_len = xatou32(argv[6]);
355 | varset.vsync_len = xatou32(argv[7]);
356 | break;
357 | case CMD_ALL:
358 | g_options |= OPT_ALL;
359 | break;
360 | case CMD_CHANGE:
361 | g_options |= OPT_CHANGE;
362 | break;
363 | #ifdef CONFIG_FEATURE_FBSET_FANCY
364 | case CMD_XRES:
365 | varset.xres = xatou32(argv[1]);
366 | break;
367 | case CMD_YRES:
368 | varset.yres = xatou32(argv[1]);
369 | break;
370 | case CMD_DEPTH:
371 | varset.bits_per_pixel = xatou32(argv[1]);
372 | break;
373 | #endif
374 | }
375 | argc -= g_cmdoptions[i].param_count;
376 | argv += g_cmdoptions[i].param_count;
377 | break;
378 | }
379 | if (!g_cmdoptions[i].name[0]) {
380 | if (argc != 1)
381 | bb_show_usage();
382 | mode = *argv;
383 | g_options |= OPT_READMODE;
384 | }
385 | }
386 |
387 | fh = xopen(fbdev, O_RDONLY);
388 | if (ioctl(fh, FBIOGET_VSCREENINFO, &var))
389 | bb_perror_msg_and_die("ioctl(%sT_VSCREENINFO)", "GE");
390 | if (g_options & OPT_READMODE) {
391 | if (!readmode(&var, modefile, mode)) {
392 | bb_error_msg_and_die("unknown video mode '%s'", mode);
393 | }
394 | }
395 |
396 | setmode(&var, &varset);
397 | if (g_options & OPT_CHANGE) {
398 | if (g_options & OPT_ALL)
399 | var.activate = FB_ACTIVATE_ALL;
400 | if (ioctl(fh, FBIOPUT_VSCREENINFO, &var))
401 | bb_perror_msg_and_die("ioctl(%sT_VSCREENINFO)", "PU");
402 | }
403 | showmode(&var);
404 | /* Don't close the file, as exiting will take care of that */
405 | /* close(fh); */
406 |
407 | return EXIT_SUCCESS;
408 | }
--------------------------------------------------------------------------------
/_a_资料/0001-Enable-R600-support-on-Android-x86-mesa-gallium-rade.patch:
--------------------------------------------------------------------------------
1 | From cce3a956db45bbbed63a53b83331d81d512c5f1c Mon Sep 17 00:00:00 2001
2 | From: Paulo Sergio Travaglia
3 | Date: Tue, 21 Apr 2015 22:01:17 -0300
4 | Subject: [PATCH] Enable R600 support on Android-x86 (mesa/gallium radeonsi)
5 |
6 | Gallium driver radeonsi requires LLVM. Some required features
7 | (like compiling the R600 Taget itself) are not enabled.
8 |
9 | These changes enable these features and fix a problem
10 | with "intrinsic" related sources (apparently a typo
11 | when formating a parameter)
12 | ---
13 | Android.mk | 7 +++
14 | lib/ExecutionEngine/Android.mk | 6 ++-
15 | lib/ExecutionEngine/JIT/Android.mk | 6 ++-
16 | lib/Target/R600/Android.mk | 89 +++++++++++++++++++++++++++++++++
17 | lib/Target/R600/InstPrinter/Android.mk | 54 ++++++++++++++++++++
18 | lib/Target/R600/MCTargetDesc/Android.mk | 59 ++++++++++++++++++++++
19 | lib/Target/R600/TargetInfo/Android.mk | 63 +++++++++++++++++++++++
20 | lib/Transforms/Scalar/Android.mk | 3 +-
21 | lib/Transforms/Utils/Android.mk | 3 +-
22 | llvm-tblgen-rules.mk | 9 +++-
23 | llvm.mk | 2 +-
24 | shared_llvm.mk | 13 ++++-
25 | 12 files changed, 305 insertions(+), 9 deletions(-)
26 | create mode 100644 lib/Target/R600/Android.mk
27 | create mode 100644 lib/Target/R600/InstPrinter/Android.mk
28 | create mode 100644 lib/Target/R600/MCTargetDesc/Android.mk
29 | create mode 100644 lib/Target/R600/TargetInfo/Android.mk
30 |
31 | diff --git a/Android.mk b/Android.mk
32 | index 75dd2a0..5869f6c 100644
33 | --- a/Android.mk
34 | +++ b/Android.mk
35 | @@ -80,6 +80,13 @@ subdirs += \
36 | lib/Target/X86/TargetInfo \
37 | lib/Target/X86/Utils
38 |
39 | +# R600 Code Generation Libraries
40 | +subdirs += \
41 | + lib/Target/R600 \
42 | + lib/Target/R600/InstPrinter \
43 | + lib/Target/R600/MCTargetDesc \
44 | + lib/Target/R600/TargetInfo
45 | +
46 | # LLVM Command Line Tools
47 | subdirs += \
48 | tools/bugpoint \
49 | diff --git a/lib/ExecutionEngine/Android.mk b/lib/ExecutionEngine/Android.mk
50 | index 9f1befd..10ef965 100644
51 | --- a/lib/ExecutionEngine/Android.mk
52 | +++ b/lib/ExecutionEngine/Android.mk
53 | @@ -14,5 +14,7 @@ LOCAL_MODULE:= libLLVMExecutionEngine
54 |
55 | LOCAL_MODULE_TAGS := optional
56 |
57 | -include $(LLVM_HOST_BUILD_MK)
58 | -include $(BUILD_HOST_STATIC_LIBRARY)
59 | +include $(LLVM_DEVICE_BUILD_MK)
60 | +include $(LLVM_GEN_INTRINSICS_MK)
61 | +include $(BUILD_STATIC_LIBRARY)
62 | +
63 | diff --git a/lib/ExecutionEngine/JIT/Android.mk b/lib/ExecutionEngine/JIT/Android.mk
64 | index 0466ba0..54fff9e 100644
65 | --- a/lib/ExecutionEngine/JIT/Android.mk
66 | +++ b/lib/ExecutionEngine/JIT/Android.mk
67 | @@ -13,5 +13,7 @@ LOCAL_MODULE:= libLLVMJIT
68 |
69 | LOCAL_MODULE_TAGS := optional
70 |
71 | -include $(LLVM_HOST_BUILD_MK)
72 | -include $(BUILD_HOST_STATIC_LIBRARY)
73 | +include $(LLVM_DEVICE_BUILD_MK)
74 | +include $(LLVM_GEN_INTRINSICS_MK)
75 | +include $(BUILD_STATIC_LIBRARY)
76 | +
77 | diff --git a/lib/Target/R600/Android.mk b/lib/Target/R600/Android.mk
78 | new file mode 100644
79 | index 0000000..79cfa3d
80 | --- /dev/null
81 | +++ b/lib/Target/R600/Android.mk
82 | @@ -0,0 +1,89 @@
83 | +LOCAL_PATH := $(call my-dir)
84 | +
85 | +AMDGPU_codegen_TBLGEN_TABLES := \
86 | + AMDGPUGenRegisterInfo.inc \
87 | + AMDGPUGenInstrInfo.inc \
88 | + AMDGPUGenDAGISel.inc \
89 | + AMDGPUGenSubtargetInfo.inc \
90 | + AMDGPUGenMCCodeEmitter.inc \
91 | + AMDGPUGenCallingConv.inc \
92 | + AMDGPUGenIntrinsics.inc \
93 | + AMDGPUGenDFAPacketizer.inc \
94 | + AMDGPUGenAsmWriter.inc
95 | +
96 | +AMDGPU_codegen_SRC_FILES := \
97 | + AMDILCFGStructurizer.cpp \
98 | + AMDGPUAsmPrinter.cpp \
99 | + AMDGPUFrameLowering.cpp \
100 | + AMDGPUIntrinsicInfo.cpp \
101 | + AMDGPUISelDAGToDAG.cpp \
102 | + AMDGPUMCInstLower.cpp \
103 | + AMDGPUMachineFunction.cpp \
104 | + AMDGPUSubtarget.cpp \
105 | + AMDGPUTargetMachine.cpp \
106 | + AMDGPUTargetTransformInfo.cpp \
107 | + AMDGPUISelLowering.cpp \
108 | + AMDGPUInstrInfo.cpp \
109 | + AMDGPUPromoteAlloca.cpp \
110 | + AMDGPURegisterInfo.cpp \
111 | + R600ClauseMergePass.cpp \
112 | + R600ControlFlowFinalizer.cpp \
113 | + R600EmitClauseMarkers.cpp \
114 | + R600ExpandSpecialInstrs.cpp \
115 | + R600InstrInfo.cpp \
116 | + R600ISelLowering.cpp \
117 | + R600MachineFunctionInfo.cpp \
118 | + R600MachineScheduler.cpp \
119 | + R600OptimizeVectorRegisters.cpp \
120 | + R600Packetizer.cpp \
121 | + R600RegisterInfo.cpp \
122 | + R600TextureIntrinsicsReplacer.cpp \
123 | + SIAnnotateControlFlow.cpp \
124 | + SIFixSGPRCopies.cpp \
125 | + SIFixSGPRLiveRanges.cpp \
126 | + SIInsertWaits.cpp \
127 | + SIInstrInfo.cpp \
128 | + SIISelLowering.cpp \
129 | + SILowerControlFlow.cpp \
130 | + SILowerI1Copies.cpp \
131 | + SIMachineFunctionInfo.cpp \
132 | + SIRegisterInfo.cpp \
133 | + SITypeRewriter.cpp
134 | +
135 | +# For the host
136 | +# =====================================================
137 | +include $(CLEAR_VARS)
138 | +include $(CLEAR_TBLGEN_VARS)
139 | +
140 | +TBLGEN_TABLES := $(AMDGPU_codegen_TBLGEN_TABLES)
141 | +
142 | +LOCAL_SRC_FILES := $(AMDGPU_codegen_SRC_FILES)
143 | +
144 | +LOCAL_MODULE:= libLLVMR600CodeGen
145 | +
146 | +LOCAL_MODULE_TAGS := optional
147 | +
148 | +include $(LLVM_HOST_BUILD_MK)
149 | +include $(LLVM_TBLGEN_RULES_MK)
150 | +include $(LLVM_GEN_INTRINSICS_MK)
151 | +include $(BUILD_HOST_STATIC_LIBRARY)
152 | +
153 | +# For the device only
154 | +# =====================================================
155 | +ifneq (true,$(DISABLE_LLVM_DEVICE_BUILDS))
156 | +include $(CLEAR_VARS)
157 | +include $(CLEAR_TBLGEN_VARS)
158 | +
159 | +TBLGEN_TABLES := $(AMDGPU_codegen_TBLGEN_TABLES)
160 | +
161 | +LOCAL_SRC_FILES := $(AMDGPU_codegen_SRC_FILES)
162 | +
163 | +LOCAL_MODULE:= libLLVMR600CodeGen
164 | +
165 | +LOCAL_MODULE_TAGS := optional
166 | +
167 | +include $(LLVM_DEVICE_BUILD_MK)
168 | +include $(LLVM_TBLGEN_RULES_MK)
169 | +include $(LLVM_GEN_INTRINSICS_MK)
170 | +include $(BUILD_STATIC_LIBRARY)
171 | +endif
172 | diff --git a/lib/Target/R600/InstPrinter/Android.mk b/lib/Target/R600/InstPrinter/Android.mk
173 | new file mode 100644
174 | index 0000000..9afb4f7
175 | --- /dev/null
176 | +++ b/lib/Target/R600/InstPrinter/Android.mk
177 | @@ -0,0 +1,54 @@
178 | +LOCAL_PATH := $(call my-dir)
179 | +
180 | +AMDGPU_instprinter_TBLGEN_TABLES := \
181 | + AMDGPUGenAsmWriter.inc \
182 | + AMDGPUGenInstrInfo.inc \
183 | + AMDGPUGenRegisterInfo.inc \
184 | + AMDGPUGenSubtargetInfo.inc
185 | +
186 | +AMDGPU_instprinter_SRC_FILES := \
187 | + AMDGPUInstPrinter.cpp
188 | +
189 | +# For the device
190 | +# =====================================================
191 | +ifneq (true,$(DISABLE_LLVM_DEVICE_BUILDS))
192 | +include $(CLEAR_VARS)
193 | +include $(CLEAR_TBLGEN_VARS)
194 | +
195 | +TBLGEN_TABLES := $(AMDGPU_instprinter_TBLGEN_TABLES)
196 | +
197 | +TBLGEN_TD_DIR := $(LOCAL_PATH)/..
198 | +
199 | +LOCAL_SRC_FILES := $(AMDGPU_instprinter_SRC_FILES)
200 | +
201 | +LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
202 | +
203 | +LOCAL_MODULE:= libLLVMR600AsmPrinter
204 | +
205 | +LOCAL_MODULE_TAGS := optional
206 | +
207 | +include $(LLVM_DEVICE_BUILD_MK)
208 | +include $(LLVM_TBLGEN_RULES_MK)
209 | +include $(BUILD_STATIC_LIBRARY)
210 | +endif
211 | +
212 | +# For the host
213 | +# =====================================================
214 | +include $(CLEAR_VARS)
215 | +include $(CLEAR_TBLGEN_VARS)
216 | +
217 | +TBLGEN_TABLES := $(AMDGPU_instprinter_TBLGEN_TABLES)
218 | +
219 | +TBLGEN_TD_DIR := $(LOCAL_PATH)/..
220 | +
221 | +LOCAL_SRC_FILES := $(AMDGPU_instprinter_SRC_FILES)
222 | +
223 | +LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
224 | +
225 | +LOCAL_MODULE := libLLVMR600AsmPrinter
226 | +
227 | +LOCAL_MODULE_TAGS := optional
228 | +
229 | +include $(LLVM_HOST_BUILD_MK)
230 | +include $(LLVM_TBLGEN_RULES_MK)
231 | +include $(BUILD_HOST_STATIC_LIBRARY)
232 | diff --git a/lib/Target/R600/MCTargetDesc/Android.mk b/lib/Target/R600/MCTargetDesc/Android.mk
233 | new file mode 100644
234 | index 0000000..b44b224
235 | --- /dev/null
236 | +++ b/lib/Target/R600/MCTargetDesc/Android.mk
237 | @@ -0,0 +1,59 @@
238 | +LOCAL_PATH := $(call my-dir)
239 | +
240 | +AMDGPU_mc_desc_TBLGEN_TABLES := \
241 | + AMDGPUGenRegisterInfo.inc \
242 | + AMDGPUGenInstrInfo.inc \
243 | + AMDGPUGenSubtargetInfo.inc
244 | +
245 | +AMDGPU_mc_desc_SRC_FILES := \
246 | + AMDGPUAsmBackend.cpp \
247 | + AMDGPUELFObjectWriter.cpp \
248 | + AMDGPUMCCodeEmitter.cpp \
249 | + AMDGPUMCTargetDesc.cpp \
250 | + AMDGPUMCAsmInfo.cpp \
251 | + R600MCCodeEmitter.cpp \
252 | + SIMCCodeEmitter.cpp
253 | +
254 | +# For the host
255 | +# =====================================================
256 | +include $(CLEAR_VARS)
257 | +include $(CLEAR_TBLGEN_VARS)
258 | +
259 | +LOCAL_MODULE:= libLLVMR600Desc
260 | +LOCAL_MODULE_TAGS := optional
261 | +LOCAL_MODULE_CLASS := STATIC_LIBRARIES
262 | +
263 | +LOCAL_SRC_FILES := $(AMDGPU_mc_desc_SRC_FILES)
264 | +intermediates := $(call local-intermediates-dir)
265 | +LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. \
266 | + $(intermediates)/../libLLVMR600CodeGen_intermediates/
267 | +TBLGEN_TABLES := $(AMDGPU_mc_desc_TBLGEN_TABLES)
268 | +TBLGEN_TD_DIR := $(LOCAL_PATH)/..
269 | +
270 | +include $(LLVM_HOST_BUILD_MK)
271 | +include $(LLVM_TBLGEN_RULES_MK)
272 | +include $(LLVM_GEN_INTRINSICS_MK)
273 | +include $(BUILD_HOST_STATIC_LIBRARY)
274 | +
275 | +# For the device only
276 | +# =====================================================
277 | +ifneq (true,$(DISABLE_LLVM_DEVICE_BUILDS))
278 | +include $(CLEAR_VARS)
279 | +include $(CLEAR_TBLGEN_VARS)
280 | +
281 | +LOCAL_MODULE:= libLLVMR600Desc
282 | +LOCAL_MODULE_TAGS := optional
283 | +LOCAL_MODULE_CLASS := STATIC_LIBRARIES
284 | +
285 | +LOCAL_SRC_FILES := $(AMDGPU_mc_desc_SRC_FILES)
286 | +intermediates := $(call local-intermediates-dir)
287 | +LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. \
288 | + $(intermediates)/../libLLVMR600CodeGen_intermediates/
289 | +TBLGEN_TABLES := $(AMDGPU_mc_desc_TBLGEN_TABLES)
290 | +TBLGEN_TD_DIR := $(LOCAL_PATH)/..
291 | +
292 | +include $(LLVM_DEVICE_BUILD_MK)
293 | +include $(LLVM_TBLGEN_RULES_MK)
294 | +include $(LLVM_GEN_INTRINSICS_MK)
295 | +include $(BUILD_STATIC_LIBRARY)
296 | +endif
297 | diff --git a/lib/Target/R600/TargetInfo/Android.mk b/lib/Target/R600/TargetInfo/Android.mk
298 | new file mode 100644
299 | index 0000000..1d2f5df
300 | --- /dev/null
301 | +++ b/lib/Target/R600/TargetInfo/Android.mk
302 | @@ -0,0 +1,63 @@
303 | +LOCAL_PATH := $(call my-dir)
304 | +
305 | +AMDGPU_target_info_TBLGEN_TABLES := \
306 | + AMDGPUGenRegisterInfo.inc \
307 | + AMDGPUGenSubtargetInfo.inc \
308 | + AMDGPUGenInstrInfo.inc
309 | +
310 | +AMDGPU_target_info_SRC_FILES := \
311 | + AMDGPUTargetInfo.cpp
312 | +
313 | +# For the host
314 | +# =====================================================
315 | +include $(CLEAR_VARS)
316 | +include $(CLEAR_TBLGEN_VARS)
317 | +
318 | +TBLGEN_TABLES := $(AMDGPU_target_info_TBLGEN_TABLES)
319 | +
320 | +TBLGEN_TD_DIR := $(LOCAL_PATH)/..
321 | +
322 | +LOCAL_SRC_FILES := $(AMDGPU_target_info_SRC_FILES)
323 | +
324 | +LOCAL_MODULE:= libLLVMR600Info
325 | +
326 | +LOCAL_MODULE_TAGS := optional
327 | +
328 | +LOCAL_MODULE_CLASS := STATIC_LIBRARIES
329 | +
330 | +intermediates := $(call local-intermediates-dir)
331 | +LOCAL_C_INCLUDES += \
332 | + $(LOCAL_PATH)/.. \
333 | + $(intermediates)/../libLLVMR600CodeGen_intermediates
334 | +
335 | +include $(LLVM_HOST_BUILD_MK)
336 | +include $(LLVM_TBLGEN_RULES_MK)
337 | +include $(BUILD_HOST_STATIC_LIBRARY)
338 | +
339 | +# For the device
340 | +# =====================================================
341 | +ifneq (true,$(DISABLE_LLVM_DEVICE_BUILDS))
342 | +include $(CLEAR_VARS)
343 | +include $(CLEAR_TBLGEN_VARS)
344 | +
345 | +TBLGEN_TABLES := $(AMDGPU_target_info_TBLGEN_TABLES)
346 | +
347 | +TBLGEN_TD_DIR := $(LOCAL_PATH)/..
348 | +
349 | +LOCAL_SRC_FILES := $(AMDGPU_target_info_SRC_FILES)
350 | +
351 | +LOCAL_MODULE:= libLLVMR600Info
352 | +
353 | +LOCAL_MODULE_TAGS := optional
354 | +
355 | +LOCAL_MODULE_CLASS := STATIC_LIBRARIES
356 | +
357 | +intermediates := $(call local-intermediates-dir)
358 | +LOCAL_C_INCLUDES += \
359 | + $(LOCAL_PATH)/.. \
360 | + $(intermediates)/../libLLVMR600CodeGen_intermediates
361 | +
362 | +include $(LLVM_DEVICE_BUILD_MK)
363 | +include $(LLVM_TBLGEN_RULES_MK)
364 | +include $(BUILD_STATIC_LIBRARY)
365 | +endif
366 | diff --git a/lib/Transforms/Scalar/Android.mk b/lib/Transforms/Scalar/Android.mk
367 | index 5e22de6..d27a88b 100644
368 | --- a/lib/Transforms/Scalar/Android.mk
369 | +++ b/lib/Transforms/Scalar/Android.mk
370 | @@ -36,7 +36,8 @@ transforms_scalar_SRC_FILES := \
371 | SimplifyCFGPass.cpp \
372 | Sink.cpp \
373 | StructurizeCFG.cpp \
374 | - TailRecursionElimination.cpp
375 | + TailRecursionElimination.cpp \
376 | + FlattenCFGPass.cpp
377 |
378 | # For the host
379 | # =====================================================
380 | diff --git a/lib/Transforms/Utils/Android.mk b/lib/Transforms/Utils/Android.mk
381 | index 2390027..e2ebe53 100644
382 | --- a/lib/Transforms/Utils/Android.mk
383 | +++ b/lib/Transforms/Utils/Android.mk
384 | @@ -35,7 +35,8 @@ transforms_utils_SRC_FILES := \
385 | SimplifyLibCalls.cpp \
386 | UnifyFunctionExitNodes.cpp \
387 | Utils.cpp \
388 | - ValueMapper.cpp
389 | + ValueMapper.cpp \
390 | + FlattenCFG.cpp
391 |
392 | # For the host
393 | # =====================================================
394 | diff --git a/llvm-tblgen-rules.mk b/llvm-tblgen-rules.mk
395 | index 57be1a7..cb9b8c2 100644
396 | --- a/llvm-tblgen-rules.mk
397 | +++ b/llvm-tblgen-rules.mk
398 | @@ -192,7 +192,14 @@ ifneq ($(filter %GenIntrinsics.inc,$(tblgen_gen_tables)),)
399 | $(generated_sources)/%GenIntrinsics.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
400 | $(generated_sources)/%GenIntrinsics.inc: $(tblgen_source_dir)/%.td \
401 | $(tblgen_td_deps) | $(LLVM_TBLGEN)
402 | - $(call transform-td-to-out,tgt_intrinsics)
403 | + $(call transform-td-to-out,tgt-intrinsic)
404 | +endif
405 | +
406 | +ifneq ($(filter %GenDFAPacketizer.inc,$(tblgen_gen_tables)),)
407 | +$(generated_sources)/%GenDFAPacketizer.inc: TBLGEN_LOCAL_MODULE := $(LOCAL_MODULE)
408 | +$(generated_sources)/%GenDFAPacketizer.inc: $(tblgen_source_dir)/%.td \
409 | + $(tblgen_td_deps) | $(LLVM_TBLGEN)
410 | + $(call transform-td-to-out,dfa-packetizer)
411 | endif
412 |
413 | ifneq ($(findstring ARMGenDecoderTables.inc,$(tblgen_gen_tables)),)
414 | diff --git a/llvm.mk b/llvm.mk
415 | index c9d0e19..0fbb5af 100644
416 | --- a/llvm.mk
417 | +++ b/llvm.mk
418 | @@ -8,4 +8,4 @@ LLVM_DEVICE_BUILD_MK := $(LLVM_ROOT_PATH)/llvm-device-build.mk
419 | LLVM_GEN_INTRINSICS_MK := $(LLVM_ROOT_PATH)/llvm-gen-intrinsics.mk
420 | LLVM_TBLGEN_RULES_MK := $(LLVM_ROOT_PATH)/llvm-tblgen-rules.mk
421 |
422 | -LLVM_SUPPORTED_ARCH := arm arm64 mips mips64 x86 x86_64
423 | +LLVM_SUPPORTED_ARCH := arm arm64 mips mips64 x86 x86_64 r600
424 | diff --git a/shared_llvm.mk b/shared_llvm.mk
425 | index d244a45..a50655d 100644
426 | --- a/shared_llvm.mk
427 | +++ b/shared_llvm.mk
428 | @@ -22,7 +22,15 @@ llvm_x86_static_libraries := \
429 | libLLVMX86AsmParser \
430 | libLLVMX86AsmPrinter \
431 | libLLVMX86Utils \
432 | - libLLVMX86Disassembler
433 | + libLLVMX86Disassembler \
434 | + libLLVMExecutionEngine \
435 | + libLLVMJIT
436 | +
437 | +llvm_r600_static_libraries := \
438 | + libLLVMR600CodeGen \
439 | + libLLVMR600Info \
440 | + libLLVMR600Desc \
441 | + libLLVMR600AsmPrinter
442 |
443 | llvm_mips_static_libraries := \
444 | libLLVMMipsCodeGen \
445 | @@ -84,6 +92,7 @@ LOCAL_WHOLE_STATIC_LIBRARIES := \
446 | $(llvm_pre_static_libraries) \
447 | $(llvm_arm_static_libraries) \
448 | $(llvm_x86_static_libraries) \
449 | + $(llvm_r600_static_libraries) \
450 | $(llvm_mips_static_libraries) \
451 | $(llvm_aarch64_static_libraries) \
452 | $(llvm_host_static_libraries) \
453 | @@ -118,6 +127,7 @@ LOCAL_WHOLE_STATIC_LIBRARIES := \
454 | LOCAL_WHOLE_STATIC_LIBRARIES_arm += $(llvm_arm_static_libraries)
455 | LOCAL_WHOLE_STATIC_LIBRARIES_x86 += $(llvm_x86_static_libraries)
456 | LOCAL_WHOLE_STATIC_LIBRARIES_x86_64 += $(llvm_x86_static_libraries)
457 | +LOCAL_WHOLE_STATIC_LIBRARIES_r600 += $(llvm_r600_static_libraries)
458 | LOCAL_WHOLE_STATIC_LIBRARIES_mips += $(llvm_mips_static_libraries)
459 | LOCAL_WHOLE_STATIC_LIBRARIES_mips64 += $(llvm_mips_static_libraries)
460 | LOCAL_WHOLE_STATIC_LIBRARIES_arm64 += $(llvm_aarch64_static_libraries)
461 | @@ -126,6 +136,7 @@ LOCAL_WHOLE_STATIC_LIBRARIES_arm64 += $(llvm_arm_static_libraries)
462 | ifeq ($(BUILD_ARM_FOR_X86),true)
463 | LOCAL_WHOLE_STATIC_LIBRARIES_x86 += $(llvm_arm_static_libraries)
464 | LOCAL_WHOLE_STATIC_LIBRARIES_x86_64 += $(llvm_arm_static_libraries)
465 | +LOCAL_WHOLE_STATIC_LIBRARIES_R600 += $(llvm_r600_static_libraries)
466 | endif
467 |
468 | LOCAL_WHOLE_STATIC_LIBRARIES += $(llvm_post_static_libraries)
469 | --
470 | 1.7.12.1
471 |
472 |
--------------------------------------------------------------------------------
/setting应用/Setting_01/app/src/main/java/com/example/zhu/setting_01/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.zhu.setting_01;
2 |
3 | import android.app.AlertDialog;
4 | import android.content.Context;
5 | import android.content.DialogInterface;
6 | import android.content.Intent;
7 | import android.content.pm.ActivityInfo;
8 | import android.graphics.Point;
9 | import android.os.Bundle;
10 | import android.provider.Settings;
11 | import android.support.v7.app.AppCompatActivity;
12 | import android.util.DisplayMetrics;
13 | import android.util.Log;
14 | import android.view.Display;
15 | import android.view.View;
16 | import android.view.Menu;
17 | import android.view.MenuItem;
18 | import android.view.Window;
19 | import android.view.WindowManager;
20 | import android.widget.AdapterView;
21 | import android.widget.ArrayAdapter;
22 | import android.widget.CompoundButton;
23 | import android.widget.SeekBar;
24 | import android.widget.Spinner;
25 | import android.widget.TextView;
26 | import android.widget.Toast;
27 | import android.widget.ToggleButton;
28 |
29 | import java.io.BufferedReader;
30 | import java.io.File;
31 | import java.io.FileFilter;
32 | import java.io.FileReader;
33 | import java.io.IOException;
34 | import java.io.InputStream;
35 | import java.text.DecimalFormat;
36 | import java.util.ArrayList;
37 | import java.util.regex.Pattern;
38 |
39 | public class MainActivity extends AppCompatActivity {
40 | //获取分辨率
41 | Display display;
42 |
43 | private static final String[] pixels={"1920 × 1080","1600 × 900","1376 × 768","1280 × 1024","800 × 600"};
44 | private static final String[] muti_screens={"仅在 1 上显示","仅在 2 上显示","扩展屏幕","复制屏幕"};
45 | private static final String[] screen_orient={"自动","横屏","竖屏","翻转横屏","翻转竖屏"};
46 |
47 | private Spinner muti_spinner=null;
48 | private Spinner orient_spinner=null;
49 | private Spinner pixel_spinner=null;
50 | //亮度进度条
51 | private SeekBar light_seekbar = null;
52 | //自动按钮
53 | private ToggleButton auto_toggle=null;
54 | private SetLight setLight = null;
55 |
56 | //属性按钮
57 | private TextView attribution_text=null;
58 | //显示器对话框构造器
59 | AlertDialog.Builder builder;
60 | //显卡型号
61 | private String gpu_info = null;
62 |
63 | private ArrayAdapter muti_adapter;
64 | private ArrayAdapter pixel_adapter;
65 | private ArrayAdapter orient_adapter;
66 |
67 |
68 | @Override
69 | protected void onCreate(Bundle savedInstanceState) {
70 | super.onCreate(savedInstanceState);
71 | setContentView(R.layout.activity_main);
72 | if (pixel_spinner==null)
73 | setPixelFun();
74 | if (muti_spinner==null)
75 | setMutiScreenFun();
76 | if (orient_spinner ==null)
77 | setOrientSpinnerFun();
78 | if (light_seekbar==null)
79 | setLightFun();
80 | if(gpu_info==null)
81 | startGLForGPUInfo();
82 | //申请root权限
83 | String apkRoot="chmod 777 "+getPackageCodePath();
84 | LinuxTools.RootCommand(apkRoot);
85 |
86 |
87 |
88 | //属性按钮
89 | if (attribution_text==null){
90 | attribution_text = (TextView)findViewById(R.id.attribution_text);
91 | attribution_text.setOnClickListener(new View.OnClickListener() {
92 | @Override
93 | public void onClick(View v) {
94 | // String section_cmd = "ls /proc/";
95 | // String info = LinuxTools.exec(section_cmd);
96 | // Toast toast = Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT);
97 | // toast.show();
98 |
99 | //颜色深度
100 | //int depth = display.getPixelFormat();
101 |
102 |
103 | //// Toast toast = Toast.makeText(getApplicationContext(), depth, Toast.LENGTH_SHORT);
104 | //// toast.show();
105 | // Log.e("!!!!!!!!!!!!!!!!!!!!!","widthPixels"+screenWidth);
106 | // Log.e("!!!!!!!!!!!!!!!!!!!!!","heightPixels"+screenHeight);
107 | // Log.e("!!!!!!!!!!!!!!!!!!!!!","density"+density);
108 | // Log.e("!!!!!!!!!!!!!!!!!!!!!","xdpi"+xdpi);
109 | // Log.e("!!!!!!!!!!!!!!!!!!!!!","ydpi"+ydpi);
110 | if(builder==null)
111 | screen_info_dialog();
112 | builder.show();
113 | }
114 | });
115 | }
116 | }
117 | //设置亮度功能函数
118 | private void setLightFun(){
119 | //亮度进度条
120 | light_seekbar = (SeekBar)findViewById(R.id.light_seekBar);
121 | light_seekbar.setOnSeekBarChangeListener(new SeekBarListener());
122 | //亮度自动按钮
123 | auto_toggle = (ToggleButton)findViewById(R.id.auto_toggle);
124 | setLight = new SetLight();
125 | //获取当前亮度,并且设置进度条的值
126 | light_seekbar.setProgress(setLight.getScreenBrightness());
127 | //1 为自动调节屏幕亮度,检查当前屏幕亮度调节的模式
128 | if (setLight.getScreenMode()==1){
129 | auto_toggle.setChecked(true);
130 | light_seekbar.setEnabled(false);
131 | }else {
132 | auto_toggle.setChecked(false);
133 | light_seekbar.setEnabled(true);
134 | }
135 |
136 | auto_toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
137 | @Override
138 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
139 | if (isChecked) {
140 | //已开启
141 | setLight.setScreenMode(1);
142 | light_seekbar.setEnabled(false);
143 | } else {
144 | //已关闭
145 | setLight.setScreenMode(0);
146 | light_seekbar.setEnabled(true);
147 | }
148 | }
149 | });
150 | }
151 | //设置分辨率的函数
152 | private void setPixelFun(){
153 | // //获取分辨率
154 | // display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
155 | // //display = getWindowManager().getDefaultDisplay(); //Activity#getWindowManager()
156 | // Point size = new Point();
157 | // display.getSize(size);
158 | // String current_pixel=size.y +" × "+size.x;
159 | // int i;
160 | // for ( i=0; i(this,android.R.layout.simple_spinner_item,pixels);
172 | pixel_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
173 | pixel_spinner.setAdapter(pixel_adapter);
174 | pixel_spinner.setOnItemSelectedListener(new PixelSpinnerSelectedListener());
175 | pixel_spinner.setVisibility(View.VISIBLE);
176 | }
177 | //设置多屏显示函数
178 | private void setMutiScreenFun(){
179 | //多显示器
180 | muti_spinner=(Spinner)findViewById(R.id.muti_spinner);
181 | muti_adapter=new ArrayAdapter(this,android.R.layout.simple_spinner_item,muti_screens);
182 | muti_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
183 | muti_spinner.setAdapter(muti_adapter);
184 | muti_spinner.setOnItemSelectedListener(new MutiSpinnerSelectedListener());
185 | muti_spinner.setVisibility(View.VISIBLE);
186 | }
187 | //设置屏幕方向功能函数
188 | private void setOrientSpinnerFun(){
189 | //方向
190 | orient_spinner=(Spinner)findViewById(R.id.orient_spinner);
191 | orient_adapter=new ArrayAdapter(this,android.R.layout.simple_spinner_item,screen_orient);
192 | orient_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
193 | orient_spinner.setAdapter(orient_adapter);
194 | int orientation = ChangeOrientationService.getOrientation();
195 | Log.e(LinuxTools.TAG,"orientation "+orientation);
196 | Log.e(LinuxTools.TAG,"自动"+ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
197 | Log.e(LinuxTools.TAG,"SCREEN_ORIENTATION_PORTRAIT "+ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
198 | Log.e(LinuxTools.TAG,"SCREEN_ORIENTATION_SENSOR "+ActivityInfo.SCREEN_ORIENTATION_SENSOR);
199 | if (orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
200 | orient_spinner.setSelection(1,true);
201 | }
202 | else if (orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
203 | orient_spinner.setSelection(2,true);
204 | }
205 | else if (orientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR){
206 | orient_spinner.setSelection(0,true);
207 | }else if (orientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE){
208 | orient_spinner.setSelection(3,true);
209 | }else if (orientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT){
210 | orient_spinner.setSelection(4,true);
211 | }
212 |
213 | orient_spinner.setOnItemSelectedListener(new OrientSpinnerSelectedListener());
214 | orient_spinner.setVisibility(View.VISIBLE);
215 |
216 |
217 | }
218 | @Override
219 | public boolean onCreateOptionsMenu(Menu menu) {
220 | // Inflate the menu; this adds items to the action bar if it is present.
221 | getMenuInflater().inflate(R.menu.menu_main, menu);
222 | return true;
223 | }
224 | @Override
225 | public boolean onOptionsItemSelected(MenuItem item) {
226 | // Handle action bar item clicks here. The action bar will
227 | // automatically handle clicks on the Home/Up button, so long
228 | // as you specify a parent activity in AndroidManifest.xml.
229 | int id = item.getItemId();
230 |
231 | //noinspection SimplifiableIfStatement
232 | if (id == R.id.action_settings) {
233 | return true;
234 | }
235 | return super.onOptionsItemSelected(item);
236 | }
237 |
238 |
239 | //使用数组形式操作 显示器
240 | class MutiSpinnerSelectedListener implements AdapterView.OnItemSelectedListener{
241 |
242 | public void onItemSelected(AdapterView> arg0, View arg1, int arg2, long arg3) {
243 | // Toast toast=Toast.makeText(getApplicationContext(), muti_screens[arg2], Toast.LENGTH_SHORT);
244 | // toast.show();
245 | }
246 | public void onNothingSelected(AdapterView> arg0) {
247 | }
248 | }
249 | //分辨率
250 | class PixelSpinnerSelectedListener implements AdapterView.OnItemSelectedListener{
251 | public void onItemSelected(AdapterView> arg0, View arg1, int arg2, long arg3) {
252 | // Toast toast=Toast.makeText(getApplicationContext(), pixels[arg2], Toast.LENGTH_SHORT);
253 | // toast.show();
254 | }
255 | public void onNothingSelected(AdapterView> arg0) {
256 | }
257 | }
258 | //方向
259 | class OrientSpinnerSelectedListener implements AdapterView.OnItemSelectedListener{
260 |
261 | public void onItemSelected(AdapterView> arg0, View arg1, int arg2, long arg3) {
262 |
263 | if(screen_orient[arg2].equals("自动")){
264 | Log.e(LinuxTools.TAG,"onItemSelected 自动");
265 | ChangeOrientationHelper.setOrientation(ChangeOrientationHelper.Orientation.SENSOR,MainActivity.this);
266 | }else if(screen_orient[arg2].equals("横屏")){
267 | Log.e(LinuxTools.TAG,"onItemSelected横屏");
268 | ChangeOrientationHelper.setOrientation(ChangeOrientationHelper.Orientation.LANDSCAPE,MainActivity.this);
269 | }else if(screen_orient[arg2].equals("竖屏")){
270 | Log.e(LinuxTools.TAG,"onItemSelected竖屏");
271 | ChangeOrientationHelper.setOrientation(ChangeOrientationHelper.Orientation.PORTRAIT,MainActivity.this);
272 | }else if(screen_orient[arg2].equals("翻转横屏")){
273 | ChangeOrientationHelper.setOrientation(ChangeOrientationHelper.Orientation.REVERSE_LANDSCAPE,MainActivity.this);
274 | // LinuxTools.exec("xrandr -o inverted");
275 | }else if(screen_orient[arg2].equals("翻转竖屏")){
276 | Log.e(LinuxTools.TAG,"翻转竖屏");
277 | ChangeOrientationHelper.setOrientation(ChangeOrientationHelper.Orientation.REVERSE_PORTRAIT,MainActivity.this);
278 | }
279 | }
280 |
281 | public void onNothingSelected(AdapterView> arg0) {
282 | }
283 | }
284 | //亮度进度条的监控
285 | public class SeekBarListener implements SeekBar.OnSeekBarChangeListener{
286 | @Override
287 | public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}
288 | @Override
289 | public void onStartTrackingTouch(SeekBar seekBar) {}
290 | @Override
291 | public void onStopTrackingTouch(SeekBar seekBar) {
292 | // Toast toast=Toast.makeText(getApplicationContext(),"停止:"+ light_seekbar.getProgress(), Toast.LENGTH_SHORT);
293 | // toast.show();
294 |
295 | setLight.setScreenBrightness(light_seekbar.getProgress());
296 | setLight.saveScreenBrightness(light_seekbar.getProgress());
297 | }
298 | }
299 |
300 | /**
301 | *
302 | * 设置当前系统的亮度类
303 | */
304 | public class SetLight {
305 | /**
306 | * 获得当前屏幕亮度的模式
307 | * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度
308 | * SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度
309 | */
310 | private int getScreenMode(){
311 | int screenMode=0;
312 | try{
313 | screenMode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
314 | }
315 | catch (Exception localException){
316 |
317 | }
318 | return screenMode;
319 | }
320 |
321 | /**
322 | * 获得当前屏幕亮度值 0--255
323 | */
324 | private int getScreenBrightness(){
325 | int screenBrightness=255;
326 | try{
327 | screenBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
328 | }
329 | catch (Exception localException){
330 |
331 | }
332 | return screenBrightness;
333 | }
334 | /**
335 | * 设置当前屏幕亮度的模式
336 | * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度
337 | * SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度
338 | */
339 | private void setScreenMode(int paramInt){
340 | try{
341 | Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, paramInt);
342 | }catch (Exception localException){
343 | localException.printStackTrace();
344 | }
345 | }
346 | /**
347 | * 设置系统亮度值 0--255
348 | */
349 | private void saveScreenBrightness(int paramInt){
350 | try{
351 | Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, paramInt);
352 | }
353 | catch (Exception localException){
354 | Log.e("###################","设置系统亮度有问题");
355 | localException.printStackTrace();
356 | }
357 | }
358 | /**
359 | * 设置当前的屏幕亮度值 0--1.0之间
360 | */
361 | private void setScreenBrightness(int paramInt){
362 | Window localWindow = getWindow();
363 | WindowManager.LayoutParams localLayoutParams = localWindow.getAttributes();
364 | float f = paramInt / 255.0F;
365 | localLayoutParams.screenBrightness = f;
366 | localWindow.setAttributes(localLayoutParams);
367 | }
368 | }
369 |
370 | //显示器信息对话框
371 | private void screen_info_dialog() {
372 | final String items[]={"CPU "+getCpuName()+" "+getNumCores()+"核","CPU频率 "+getMinCpuFreq()+"GHZ","RAM "
373 | +getRamMemory(this)+"GB","GPU "+gpu_info,"分辨率 "+getScreenResolution()};
374 |
375 |
376 | //dialog参数设置
377 | builder=new AlertDialog.Builder(this); //先得到构造器
378 | builder.setTitle("提示"); //设置标题
379 | //builder.setMessage("是否确认退出?"); //设置内容
380 | builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
381 | //设置列表显示,注意设置了列表显示就不要设置builder.setMessage()了,否则列表不起作用。
382 | builder.setItems(items, new DialogInterface.OnClickListener() {
383 | @Override
384 | public void onClick(DialogInterface dialog, int which) {
385 | dialog.dismiss();
386 | }
387 | });
388 | builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
389 | @Override
390 | public void onClick(DialogInterface dialog, int which) {
391 | dialog.dismiss();
392 | //Toast.makeText(MainActivity.this, "确定", Toast.LENGTH_SHORT).show();
393 | }
394 | });
395 | builder.create();
396 | }
397 | //获取显卡的辅助函数
398 | private void startGLForGPUInfo()
399 | {
400 | Intent localIntent = new Intent(this, GpuInfo.class);
401 | localIntent.setFlags(65536);
402 | startActivityForResult(localIntent, 1001);
403 | overridePendingTransition(0, 0);
404 | }
405 | protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent) {
406 | super.onActivityResult(paramInt1, paramInt2, paramIntent);
407 | if ((paramInt1 == 1001) && (paramInt2 == -1))
408 | {
409 | gpu_info = paramIntent.getStringExtra("GLInfo");
410 | }
411 | }
412 | //获取CPU型号
413 | private static String getCpuName(){
414 | try{
415 | FileReader fr = new FileReader("/proc/cpuinfo");
416 | BufferedReader br = new BufferedReader(fr);
417 | String text = br.readLine();
418 | String[] array = text.split(":\\s+",2);
419 | for(int i = 0; i < array.length; i++){
420 | }
421 | return array[1];
422 | }catch (IOException e){
423 | e.printStackTrace();
424 | }
425 | return null;
426 | }
427 | //获取CPU核心数
428 | private int getNumCores() {
429 | //Private Class to display only CPU devices in the directory listing
430 | class CpuFilter implements FileFilter {
431 | @Override
432 | public boolean accept(File pathname) {
433 | //Check if filename is "cpu", followed by a single digit number
434 | if(Pattern.matches("cpu[0-9]", pathname.getName())) {
435 | return true;
436 | }
437 | return false;
438 | }
439 | }
440 | try {
441 | //Get directory containing CPU info
442 | File dir = new File("/sys/devices/system/cpu/");
443 | //Filter to only list the devices we care about
444 | File[] files = dir.listFiles(new CpuFilter());
445 | Log.d("@@@@@@@@@@@@", "CPU Count: "+files.length);
446 | //Return the number of cores (virtual CPU devices)
447 | return files.length;
448 | } catch(Exception e) {
449 | //Print exception
450 | Log.d("@@@@@@@@@@@@", "CPU Count: Failed.");
451 | e.printStackTrace();
452 | //Default to return 1 core
453 | return 1;
454 | }
455 | }
456 | //获取CPU最大频率
457 | public static String getMinCpuFreq() {
458 | String result = "";
459 | ProcessBuilder cmd;
460 | try {
461 | String[] args = { "/system/bin/cat",
462 | "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" };
463 | cmd = new ProcessBuilder(args);
464 | Process process = cmd.start();
465 | InputStream in = process.getInputStream();
466 | byte[] re = new byte[24];
467 | while (in.read(re) != -1) {
468 | result = result + new String(re);
469 | }
470 | in.close();
471 | } catch (IOException ex) {
472 | ex.printStackTrace();
473 | result = "N/A";
474 | }
475 | float temp = (float) (Integer.parseInt(result.trim())/1000000.0);
476 | return format(temp);
477 | }
478 | //RAM内存大小
479 | private String getRamMemory(Context context){
480 | String str1 = "/proc/meminfo";// 系统内存信息文件
481 | String str2;
482 | String[] arrayOfString;
483 | long initial_memory = 0;
484 |
485 | try
486 | {
487 | FileReader localFileReader = new FileReader(str1);
488 | BufferedReader localBufferedReader = new BufferedReader(
489 | localFileReader, 8192);
490 | str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小
491 |
492 | arrayOfString = str2.split("\\s+");
493 | for (String num : arrayOfString) {
494 | Log.i(str2, num + "\t");
495 | }
496 |
497 | initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte
498 | localBufferedReader.close();
499 |
500 | } catch (IOException e) {
501 | }
502 | //return Formatter.formatFileSize(context, initial_memory);// Byte转换为KB或者MB,内存大小规格化
503 | System.out.println("总运存--->>>"+initial_memory/(1024*1024));
504 | return format((initial_memory/(1000*1000*1000.0)));
505 | }
506 | //获取屏幕分辨率
507 | private String getScreenResolution(){
508 | DisplayMetrics dm = new DisplayMetrics();
509 | getWindowManager().getDefaultDisplay().getMetrics(dm);
510 | String strOpt = dm.heightPixels + " x " + dm.widthPixels;
511 | return strOpt;
512 | }
513 |
514 | public static String format(double d){
515 | DecimalFormat df=new DecimalFormat(".#");
516 | String st=df.format(d);
517 | return st;
518 | }
519 | }
520 |
--------------------------------------------------------------------------------