Skip to content

Turnip MTR Build

Turnip MTR Build #163

Workflow file for this run

name: Turnip MTR Build
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
variant: [A840P, A8XX]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y bison flex python3-pip pkg-config patchelf ninja-build zip rsync glslang-tools
# Using pip with break-system-packages is okay in ephemeral CI, but ensure they are in PATH
pip3 install meson mako jinja2 pyyaml ply --break-system-packages
- name: Cache Android NDK
id: cache-ndk
uses: actions/cache@v4
with:
path: android-ndk-r27d
key: ndk-r27d-linux-v1 # Incremented version to ensure fresh start
- name: Install NDK
if: steps.cache-ndk.outputs.cache-hit != 'true'
run: |
wget -nv https://dl.google.com/android/repository/android-ndk-r27d-linux.zip
unzip -q android-ndk-r27d-linux.zip
- name: Setup Environment
run: |
echo "ANDROID_NDK_HOME=$GITHUB_WORKSPACE/android-ndk-r27d" >> $GITHUB_ENV
# Pre-create the cross file in a predictable location
mkdir -p $GITHUB_WORKSPACE/meson-config
- name: Clone Mesa
run: |
git clone --depth=200 https://gitlab.freedesktop.org/mesa/mesa.git
cd mesa
echo "MESA_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Create Meson Cross File
run: |
cat <<EOF > $GITHUB_WORKSPACE/meson-config/android-aarch64
[binaries]
ar = '$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar'
c = ['$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang']
cpp = ['$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang++']
c_ld = 'lld'
cpp_ld = 'lld'
strip = '$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip'
pkg-config = ['env', 'PKG_CONFIG_LIBDIR=DISABLED', 'pkg-config']
[host_machine]
system = 'android'
cpu_family = 'aarch64'
cpu = 'armv8'
endian = 'little'
EOF
- name: Apply Common Patches
working-directory: ./mesa
run: |
# 1. Scaling / Clamp Fix (tu_pipeline.cc)
sed -i 's/min.x = MAX2(min.x, 0);/min.x = CLAMP(min.x, 0, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/min.y = MAX2(min.y, 0);/min.y = CLAMP(min.y, 0, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/max.x = MAX2(max.x, 1);/max.x = CLAMP(max.x, 1, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/max.y = MAX2(max.y, 1);/max.y = CLAMP(max.y, 1, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/uint32_t min_x = scissor->offset.x;/uint32_t min_x = CLAMP(scissor->offset.x, 0, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/uint32_t min_y = scissor->offset.y;/uint32_t min_y = CLAMP(scissor->offset.y, 0, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/uint32_t max_x = min_x + scissor->extent.width - 1;/uint32_t max_x = CLAMP(min_x + scissor->extent.width - 1, 0, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
sed -i 's/uint32_t max_y = min_y + scissor->extent.height - 1;/uint32_t max_y = CLAMP(min_y + scissor->extent.height - 1, 0, 16383);/' src/freedreno/vulkan/tu_pipeline.cc
# 2. DECK_EMU Flag
sed -i '/TU_DEBUG_FORCE_CONCURRENT_BINNING = BITFIELD64_BIT(36),/a \ TU_DEBUG_DECK_EMU = BITFIELD64_BIT(37),' src/freedreno/vulkan/tu_util.h
sed -i '/{ "dynamic", TU_DEBUG_DYNAMIC },/a \ { "deck_emu", TU_DEBUG_DECK_EMU },' src/freedreno/vulkan/tu_util.cc
# 3. AMD Spoofing
sed -i '/props->deviceID = pdevice->dev_id.chip_id;/a \ \n if (TU_DEBUG(DECK_EMU)) {\n props->vendorID = 0x1002;\n props->deviceID = 0x163F;\n }' src/freedreno/vulkan/tu_device.cc
sed -i 's/strcpy(props->deviceName, pdevice->name);/strcpy(props->deviceName, pdevice->name);\n if (TU_DEBUG(DECK_EMU)) {\n strcpy(props->deviceName, "AMD Custom GPU 0405 (RADV VANGOGH)");\n }/' src/freedreno/vulkan/tu_device.cc
# 4. vk_sync_timeline Fix
cat <<'EOF' > vk_sync_fix.py
import sys
path = 'src/vulkan/runtime/vk_sync_timeline.c'
try:
with open(path, 'r') as f: content = f.read()
except FileNotFoundError:
print(f"File not found: {path}"); sys.exit(1)
# ... (rest of your python script remains the same)
EOF
python3 vk_sync_fix.py
# 5. A7xx Stability Fixes
sed -i '/a7xx_gen1 = GPUProps(/,/)/ s/cs_lock_unlock_quirk = True,/cs_lock_unlock_quirk = True,\n has_early_preamble = False,\n has_scalar_predicates = False,/' src/freedreno/common/freedreno_devices.py
sed -i '/a7xx_gen2 = GPUProps(/,/)/ s/has_image_processing = True,/has_image_processing = True,\n has_early_preamble = False,\n has_scalar_predicates = False,/' src/freedreno/common/freedreno_devices.py
sed -i '/a7xx_gen3 = GPUProps(/,/)/ s/has_image_processing = True,/has_image_processing = True,\n has_early_preamble = False,\n has_scalar_predicates = False,/' src/freedreno/common/freedreno_devices.py
# 6. Additional logic
sed -i '/case 8:/,/tu_device_entrypoints_a8xx/ { /TU_DEBUG_FLUSHALL/d }' src/freedreno/vulkan/tu_device.cc
sed -i '/case KGSL_UBWC_4_0:/a \ case 5:\n case 6:' src/freedreno/vulkan/tu_knl_kgsl.cc
# Export ICD symbols
echo -e "vk_icdGetInstanceProcAddr\nvk_icdGetPhysicalDeviceProcAddr\nvk_icdNegotiateLoaderICDInterfaceVersion" >> src/vulkan/vulkan-icd-android-symbols.txt
# 7. Fix sync.h symlink
cd include/android_stub/sync && rm -f sync.h && cp ../android/sync.h sync.h
- name: Apply Variant Specific Patches
working-directory: ./mesa
run: |
if [ "${{ matrix.variant }}" = "A8XX" ]; then
# A8XX Logic (Python scripts as provided in your prompt)
# ... [Insert your A8XX python snippets here] ...
sed -i 's/if (info->chip >= 8)/if (info->chip >= 8 \&\& info->num_slices > 1)/' src/freedreno/common/fd6_gmem_cache.h
# Fixed the 'c' command for sed to be more portable
sed -i '/if (info->chip >= 8 \&\& info->num_slices > 1)/!b;n;s/.*/ {}/' src/freedreno/common/fd6_gmem_cache.h
elif [ "${{ matrix.variant }}" = "A840P" ]; then
sed -i 's/if (cmd_buffer->state.rp.drawcall_count > 5)/if (cmd_buffer->state.rp.drawcall_count > 10)/' src/freedreno/vulkan/tu_autotune.cc
sed -i 's/gmem_bandwidth = (gmem_bandwidth \* 11 + total_draw_call_bandwidth) \/ 10;/gmem_bandwidth = (gmem_bandwidth \* 10 + total_draw_call_bandwidth) \/ 10;/' src/freedreno/vulkan/tu_autotune.cc
fi
- name: Build Mesa
working-directory: ./mesa
run: |
meson setup build-android-aarch64 \
-Dplatforms=android \
-Dplatform-sdk-version=35 \
-Dandroid-stub=true \
-Dandroid-libbacktrace=disabled \
-Degl=disabled \
-Dgallium-drivers= \
-Dvulkan-drivers=freedreno \
-Dfreedreno-kmds=kgsl \
-Dbuildtype=release \
-Dstrip=true \
-Dvulkan-beta=true \
--cross-file=$GITHUB_WORKSPACE/meson-config/android-aarch64
ninja -C build-android-aarch64 src/freedreno/vulkan/libvulkan_freedreno.so
- name: Package Driver
run: |
SO=mesa/build-android-aarch64/src/freedreno/vulkan/libvulkan_freedreno.so
patchelf --set-soname libvulkan_freedreno.so $SO
patchelf --remove-rpath $SO
mkdir -p package
cp $SO package/
# Generate Changelog
echo "Mesa commit: ${{ env.MESA_COMMIT }}" > package/CHANGELOG_UPSTREAM_24H.txt
cd mesa && git log --since="24 hours ago" --format="* %h - %s" >> ../package/CHANGELOG_UPSTREAM_24H.txt && cd ..
cat <<EOF > package/meta.json
{
"schemaVersion": 1,
"name": "Turnip MTR Nightly ${{ matrix.variant }}",
"description": "Mesa 26.1.0 Devel Nightly ${{ matrix.variant }}",
"author": "MaxsTechReview",
"packageVersion": "13",
"vendor": "mesa",
"driverVersion": "Mesa 26.1.0 Devel Nightly",
"minApi": 29,
"libraryName": "libvulkan_freedreno.so"
}
EOF
cd package && zip -j ../Turnip_MTR_Nightly_${{ env.MESA_COMMIT }}_${{ matrix.variant }}.zip meta.json libvulkan_freedreno.so CHANGELOG_UPSTREAM_24H.txt
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: Turnip_MTR_Nightly_${{ env.MESA_COMMIT }}_${{ matrix.variant }}
path: Turnip_MTR_Nightly_${{ env.MESA_COMMIT }}_${{ matrix.variant }}.zip