mirror of
https://github.com/Cateners/tiny_computer.git
synced 2026-05-20 16:35:47 +08:00
Turnip Option Added
This commit is contained in:
Binary file not shown.
@@ -12,26 +12,46 @@ rm -rf $HOME/.local/share/tiny/tmp
|
|||||||
mkdir $HOME/.local/share/tiny/tmp
|
mkdir $HOME/.local/share/tiny/tmp
|
||||||
cd $HOME/.local/share/tiny/tmp
|
cd $HOME/.local/share/tiny/tmp
|
||||||
|
|
||||||
git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box86
|
box86_url="https://github.com/ptitSeb/box86"
|
||||||
if [ $? -ne 0 ]; then
|
box64_url="https://github.com/ptitSeb/box64"
|
||||||
git clone https://github.com/ptitSeb/box86
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
|
||||||
echo '仓库克隆失败...退出安装...'
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box64
|
mirror_sites=(
|
||||||
if [ $? -ne 0 ]; then
|
"https://github.moeyy.xyz/"
|
||||||
git clone https://github.com/ptitSeb/box64
|
"https://mirror.ghproxy.com/"
|
||||||
if [ $? -ne 0 ]; then
|
""
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
)
|
||||||
echo '仓库克隆失败...退出安装...'
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
|
local url="${mirror}${box86_url}"
|
||||||
|
echo "尝试从 $url 下载box86..."
|
||||||
|
git clone "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载box86"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '仓库克隆失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
|
local url="${mirror}${box64_url}"
|
||||||
|
echo "尝试从 $url 下载box64..."
|
||||||
|
git clone "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载box64"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '仓库克隆失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "正在编译box86..."
|
||||||
cd box86
|
cd box86
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
@@ -41,6 +61,7 @@ cd ../..
|
|||||||
mv box86/build/box86 ../cross
|
mv box86/build/box86 ../cross
|
||||||
mv box86/x86lib ../cross
|
mv box86/x86lib ../cross
|
||||||
|
|
||||||
|
echo "正在编译box64..."
|
||||||
cd box64
|
cd box64
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
|
|||||||
@@ -4,25 +4,35 @@ rm -rf $HOME/.local/share/tiny/tmp
|
|||||||
mkdir $HOME/.local/share/tiny/tmp
|
mkdir $HOME/.local/share/tiny/tmp
|
||||||
cd $HOME/.local/share/tiny/tmp
|
cd $HOME/.local/share/tiny/tmp
|
||||||
|
|
||||||
MIRROR_SITE=https://mirror.ghproxy.com
|
|
||||||
RELEASE_PAGE=https://github.com/doitsujin/dxvk/releases
|
RELEASE_PAGE=https://github.com/doitsujin/dxvk/releases
|
||||||
LATEST_DXVK_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Version \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1)
|
LATEST_DXVK_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Version \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1)
|
||||||
if [ -z "$LATEST_DXVK_TAG" ]
|
if [ -z "$LATEST_DXVK_TAG" ]
|
||||||
then
|
then
|
||||||
LATEST_DXVK_TAG="2.3"
|
LATEST_DXVK_TAG="2.4"
|
||||||
fi
|
fi
|
||||||
LATEST_DXVK_NAME="dxvk-$LATEST_DXVK_TAG.tar.gz"
|
LATEST_DXVK_NAME="dxvk-$LATEST_DXVK_TAG.tar.gz"
|
||||||
LATEST_DXVK_LINK="https://github.com/doitsujin/dxvk/releases/download/v$LATEST_DXVK_TAG/$LATEST_DXVK_NAME"
|
LATEST_DXVK_LINK="https://github.com/doitsujin/dxvk/releases/download/v$LATEST_DXVK_TAG/$LATEST_DXVK_NAME"
|
||||||
|
|
||||||
wget $MIRROR_SITE/$LATEST_DXVK_LINK
|
mirror_sites=(
|
||||||
if [ $? -ne 0 ]; then
|
"https://github.moeyy.xyz/"
|
||||||
wget $LATEST_DXVK_LINK
|
"https://mirror.ghproxy.com/"
|
||||||
if [ $? -ne 0 ]; then
|
""
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
)
|
||||||
echo '下载失败...退出安装...'
|
|
||||||
exit
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
fi
|
local url="${mirror}$LATEST_DXVK_LINK"
|
||||||
fi
|
echo "尝试从 $url 下载dxvk..."
|
||||||
|
wget "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载dxvk"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '下载失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
wineboot
|
wineboot
|
||||||
tar xvf $LATEST_DXVK_NAME
|
tar xvf $LATEST_DXVK_NAME
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ rm -rf $HOME/.local/share/tiny/tmp
|
|||||||
mkdir $HOME/.local/share/tiny/tmp
|
mkdir $HOME/.local/share/tiny/tmp
|
||||||
cd $HOME/.local/share/tiny/tmp
|
cd $HOME/.local/share/tiny/tmp
|
||||||
|
|
||||||
MIRROR_SITE=https://mirror.ghproxy.com
|
|
||||||
RELEASE_PAGE=https://github.com/Kron4ek/Wine-Builds/releases
|
RELEASE_PAGE=https://github.com/Kron4ek/Wine-Builds/releases
|
||||||
#LATEST_WINE_TAG=proton-$(curl -L $RELEASE_PAGE | grep -oP 'Proton \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #proton
|
#LATEST_WINE_TAG=proton-$(curl -L $RELEASE_PAGE | grep -oP 'Proton \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #proton
|
||||||
LATEST_WINE_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Wine \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #vanilla
|
LATEST_WINE_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Wine \K[^"]*</h2>' | cut -d "<" -f 1 | head -n 1) #vanilla
|
||||||
@@ -43,15 +42,26 @@ fi
|
|||||||
LATEST_WINE_NAME=wine-$LATEST_WINE_TAG-amd64.tar.xz
|
LATEST_WINE_NAME=wine-$LATEST_WINE_TAG-amd64.tar.xz
|
||||||
LATEST_WINE_LINK=$RELEASE_PAGE/download/$LATEST_WINE_TAG/$LATEST_WINE_NAME
|
LATEST_WINE_LINK=$RELEASE_PAGE/download/$LATEST_WINE_TAG/$LATEST_WINE_NAME
|
||||||
|
|
||||||
wget $MIRROR_SITE/$LATEST_WINE_LINK
|
mirror_sites=(
|
||||||
if [ $? -ne 0 ]; then
|
"https://github.moeyy.xyz/"
|
||||||
wget $LATEST_WINE_LINK
|
"https://mirror.ghproxy.com/"
|
||||||
if [ $? -ne 0 ]; then
|
""
|
||||||
rm -rf $HOME/.local/share/tiny/tmp
|
)
|
||||||
echo '下载失败...退出安装...'
|
|
||||||
exit
|
for mirror in "${mirror_sites[@]}"; do
|
||||||
fi
|
local url="${mirror}$LATEST_WINE_LINK"
|
||||||
fi
|
echo "尝试从 $url 下载wine..."
|
||||||
|
wget "${url}"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "成功下载wine"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ -z "$mirror" ]; then
|
||||||
|
rm -rf $HOME/.local/share/tiny/tmp
|
||||||
|
echo '下载失败...退出安装...'
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
tar xvf $LATEST_WINE_NAME
|
tar xvf $LATEST_WINE_NAME
|
||||||
mv wine-$LATEST_WINE_TAG-amd64 ../cross/wine
|
mv wine-$LATEST_WINE_TAG-amd64 ../cross/wine
|
||||||
|
|||||||
@@ -459,14 +459,11 @@ sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)""");
|
|||||||
ExpansionPanel(
|
ExpansionPanel(
|
||||||
isExpanded: _expandState[5],
|
isExpanded: _expandState[5],
|
||||||
headerBuilder: ((context, isExpanded) {
|
headerBuilder: ((context, isExpanded) {
|
||||||
return const ListTile(title: Text("virgl加速"), subtitle: Text("实验性功能"));
|
return const ListTile(title: Text("图形加速"), subtitle: Text("实验性功能"));
|
||||||
}), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [
|
}), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [
|
||||||
const Text("""virgl加速可部分利用设备GPU提升系统图形处理表现,但由于设备差异也可能导致容器系统及软件运行不稳定甚至异常退出。
|
const Text("""图形加速可部分利用设备GPU提升系统图形处理表现,但由于设备差异也可能导致容器系统及软件运行不稳定甚至异常退出。
|
||||||
|
|
||||||
请先开启测试按钮启动virgl服务器,如果按钮没有自动关闭说明至少启动没问题;
|
Virgl可为使用OpenGL ES的应用提供加速。"""),
|
||||||
|
|
||||||
不过运行情况依然无法保证。
|
|
||||||
"""),
|
|
||||||
const SizedBox.square(dimension: 16),
|
const SizedBox.square(dimension: 16),
|
||||||
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglCommand") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl服务器参数"),
|
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglCommand") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl服务器参数"),
|
||||||
onChanged: (value) async {
|
onChanged: (value) async {
|
||||||
@@ -474,37 +471,34 @@ sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)""");
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
const SizedBox.square(dimension: 8),
|
const SizedBox.square(dimension: 8),
|
||||||
SwitchListTile(title: const Text("测试"), subtitle: const Text("启动virgl_test_server"), value: G.isVirglServerStarted, onChanged:(value) {
|
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl环境变量"),
|
||||||
switch (value) {
|
|
||||||
case true: {
|
|
||||||
G.virglServerPty = Pty.start("/system/bin/sh");
|
|
||||||
G.virglServerPty.write(const Utf8Encoder().convert("export CONTAINER_DIR=${G.dataPath}/containers/${G.currentContainer}\n${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}\nexit\n"));
|
|
||||||
G.virglServerPty.exitCode.then((value) {
|
|
||||||
G.isVirglServerStarted = false;
|
|
||||||
setState(() {});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case false: {
|
|
||||||
G.virglServerPty.write(const Utf8Encoder().convert("\x03exit\n"));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
G.isVirglServerStarted = value;
|
|
||||||
setState(() {});
|
|
||||||
},),
|
|
||||||
const SizedBox.square(dimension: 16),
|
|
||||||
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "图形环境变量"),
|
|
||||||
onChanged: (value) async {
|
onChanged: (value) async {
|
||||||
await G.prefs.setString("defaultVirglOpt", value);
|
await G.prefs.setString("defaultVirglOpt", value);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
const SizedBox.square(dimension: 8),
|
const SizedBox.square(dimension: 8),
|
||||||
SwitchListTile(title: const Text("启用virgl加速"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("virgl") as bool, onChanged:(value) {
|
SwitchListTile(title: const Text("启用Virgl加速"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("virgl") as bool, onChanged:(value) {
|
||||||
G.prefs.setBool("virgl", value);
|
G.prefs.setBool("virgl", value);
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},),
|
},),
|
||||||
const SizedBox.square(dimension: 16),
|
const SizedBox.square(dimension: 16),
|
||||||
|
const Divider(height: 2, indent: 8, endIndent: 8),
|
||||||
|
const SizedBox.square(dimension: 16),
|
||||||
|
const Text("""搭载Adreno GPU的设备通常可以使用Turnip驱动加速使用Vulkan的软件。
|
||||||
|
|
||||||
|
(也就是搭载不太新也不太旧的骁龙处理器的设备)"""),
|
||||||
|
const SizedBox.square(dimension: 8),
|
||||||
|
TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultTurnipOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "Turnip环境变量"),
|
||||||
|
onChanged: (value) async {
|
||||||
|
await G.prefs.setString("defaultTurnipOpt", value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox.square(dimension: 8),
|
||||||
|
SwitchListTile(title: const Text("启用Turnip驱动"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("turnip") as bool, onChanged:(value) async {
|
||||||
|
G.prefs.setBool("turnip", value);
|
||||||
|
setState(() {});
|
||||||
|
},),
|
||||||
|
const SizedBox.square(dimension: 16),
|
||||||
],))),
|
],))),
|
||||||
ExpansionPanel(
|
ExpansionPanel(
|
||||||
isExpanded: _expandState[6],
|
isExpanded: _expandState[6],
|
||||||
|
|||||||
@@ -116,12 +116,14 @@ class Util {
|
|||||||
case "isBoxEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "isBoxEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "isWineEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "isWineEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "virgl" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "virgl" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
|
case "turnip" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "wakelock" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "wakelock" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "isHidpiEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
case "isHidpiEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false);
|
||||||
case "useAvnc" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(true);
|
case "useAvnc" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(true);
|
||||||
case "defaultFFmpegCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("-hide_banner -an -max_delay 1000000 -r 30 -f android_camera -camera_index 0 -i 0:0 -vf scale=iw/2:-1 -rtsp_transport udp -f rtsp rtsp://127.0.0.1:8554/stream");
|
case "defaultFFmpegCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("-hide_banner -an -max_delay 1000000 -r 30 -f android_camera -camera_index 0 -i 0:0 -vf scale=iw/2:-1 -rtsp_transport udp -f rtsp rtsp://127.0.0.1:8554/stream");
|
||||||
case "defaultVirglCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("--socket-path=\$CONTAINER_DIR/tmp/.virgl_test");
|
case "defaultVirglCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("--socket-path=\$CONTAINER_DIR/tmp/.virgl_test");
|
||||||
case "defaultVirglOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GALLIUM_DRIVER=virpipe");
|
case "defaultVirglOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GALLIUM_DRIVER=virpipe");
|
||||||
|
case "defaultTurnipOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("VK_ICD_FILENAMES=/home/tiny/.local/share/tiny/extra/freedreno_icd.aarch64.json TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw");
|
||||||
case "defaultHidpiOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GDK_SCALE=2 QT_FONT_DPI=192");
|
case "defaultHidpiOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GDK_SCALE=2 QT_FONT_DPI=192");
|
||||||
case "containersInfo" : return G.prefs.getStringList(key)!;
|
case "containersInfo" : return G.prefs.getStringList(key)!;
|
||||||
}
|
}
|
||||||
@@ -398,6 +400,7 @@ VSCode、输入法
|
|||||||
|
|
||||||
请几个小时后再试一次"""},
|
请几个小时后再试一次"""},
|
||||||
{"q":"找不到sys/cdefs.h", "a":"""点击上面无法编译C语言程序的快捷指令"""},
|
{"q":"找不到sys/cdefs.h", "a":"""点击上面无法编译C语言程序的快捷指令"""},
|
||||||
|
{"q":"安装box86/box64/wine很慢", "a":"""请尝试使用魔法"""},
|
||||||
];
|
];
|
||||||
|
|
||||||
//默认快捷指令
|
//默认快捷指令
|
||||||
@@ -510,8 +513,6 @@ class G {
|
|||||||
//static int? streamingPid;
|
//static int? streamingPid;
|
||||||
static String streamingOutput = "";
|
static String streamingOutput = "";
|
||||||
static late Pty streamServerPty;
|
static late Pty streamServerPty;
|
||||||
static bool isVirglServerStarted = false;
|
|
||||||
static late Pty virglServerPty;
|
|
||||||
//static int? virglPid;
|
//static int? virglPid;
|
||||||
static ValueNotifier<int> pageIndex = ValueNotifier(0); //主界面索引
|
static ValueNotifier<int> pageIndex = ValueNotifier(0); //主界面索引
|
||||||
static ValueNotifier<bool> terminalPageChange = ValueNotifier(true); //更改值,用于刷新小键盘
|
static ValueNotifier<bool> terminalPageChange = ValueNotifier(true); //更改值,用于刷新小键盘
|
||||||
@@ -772,6 +773,9 @@ export CONTAINER_DIR=\$DATA_DIR/containers/${G.currentContainer}
|
|||||||
${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}""");
|
${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}""");
|
||||||
extraOpt += "${Util.getGlobal("defaultVirglOpt")} ";
|
extraOpt += "${Util.getGlobal("defaultVirglOpt")} ";
|
||||||
}
|
}
|
||||||
|
if (Util.getGlobal("turnip")) {
|
||||||
|
extraOpt += "${Util.getGlobal("defaultTurnipOpt")} ";
|
||||||
|
}
|
||||||
if (Util.getGlobal("isBoxEnabled")) {
|
if (Util.getGlobal("isBoxEnabled")) {
|
||||||
G.wasBoxEnabled = true;
|
G.wasBoxEnabled = true;
|
||||||
extraMount += "--x86=/home/tiny/.local/bin/box86 --x64=/home/tiny/.local/bin/box64 ";
|
extraMount += "--x86=/home/tiny/.local/bin/box86 --x64=/home/tiny/.local/bin/box64 ";
|
||||||
|
|||||||
Reference in New Issue
Block a user