Turnip Option Added

This commit is contained in:
Caten
2024-08-10 15:49:35 +08:00
parent 0d2f5f4e91
commit cb1f4b23ee
6 changed files with 108 additions and 69 deletions

Binary file not shown.

View File

@@ -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 mirror_sites=(
"https://github.moeyy.xyz/"
"https://mirror.ghproxy.com/"
""
)
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 rm -rf $HOME/.local/share/tiny/tmp
echo '仓库克隆失败...退出安装...' echo '仓库克隆失败...退出安装...'
exit exit
fi fi
fi done
git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box64 for mirror in "${mirror_sites[@]}"; do
if [ $? -ne 0 ]; then local url="${mirror}${box64_url}"
git clone https://github.com/ptitSeb/box64 echo "尝试从 $url 下载box64..."
if [ $? -ne 0 ]; then git clone "${url}"
if [ $? -eq 0 ]; then
echo "成功下载box64"
break
fi
if [ -z "$mirror" ]; then
rm -rf $HOME/.local/share/tiny/tmp rm -rf $HOME/.local/share/tiny/tmp
echo '仓库克隆失败...退出安装...' echo '仓库克隆失败...退出安装...'
exit exit
fi fi
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

View File

@@ -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 ""
)
for mirror in "${mirror_sites[@]}"; do
local url="${mirror}$LATEST_DXVK_LINK"
echo "尝试从 $url 下载dxvk..."
wget "${url}"
if [ $? -eq 0 ]; then
echo "成功下载dxvk"
break
fi
if [ -z "$mirror" ]; then
rm -rf $HOME/.local/share/tiny/tmp rm -rf $HOME/.local/share/tiny/tmp
echo '下载失败...退出安装...' echo '下载失败...退出安装...'
exit exit
fi fi
fi done
wineboot wineboot
tar xvf $LATEST_DXVK_NAME tar xvf $LATEST_DXVK_NAME

View File

@@ -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 ""
)
for mirror in "${mirror_sites[@]}"; do
local url="${mirror}$LATEST_WINE_LINK"
echo "尝试从 $url 下载wine..."
wget "${url}"
if [ $? -eq 0 ]; then
echo "成功下载wine"
break
fi
if [ -z "$mirror" ]; then
rm -rf $HOME/.local/share/tiny/tmp rm -rf $HOME/.local/share/tiny/tmp
echo '下载失败...退出安装...' echo '下载失败...退出安装...'
exit exit
fi fi
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

View File

@@ -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],

View File

@@ -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 ";