From a20bd1ffdbb67e4ebd0e87eb876e2973056f5c68 Mon Sep 17 00:00:00 2001 From: MaxsTechReview Date: Mon, 28 Sep 2026 07:24:04 -0400 Subject: [PATCH 1/4] Anchor the a7xx_gen1 quirks on the whole GPUProps block Upstream Mesa renamed the a7xx_gen1 quirks to QCTDD ids, so the exact-text anchor stopped matching and every build since has shipped A720/A725/A730 without the early preamble and scalar predicate overrides. Match the block itself, ending at its first unindented line, and set each override in place or add it, so renamed or upstream-set keys still apply. --- patches/apply_a7xx_gen1_quirks.py | 64 +++++++++++++++---------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/patches/apply_a7xx_gen1_quirks.py b/patches/apply_a7xx_gen1_quirks.py index 0947ca6..408f7af 100644 --- a/patches/apply_a7xx_gen1_quirks.py +++ b/patches/apply_a7xx_gen1_quirks.py @@ -10,6 +10,7 @@ Idempotent. """ +import re import sys DEVICES_PY = "src/freedreno/common/freedreno_devices.py" @@ -17,40 +18,35 @@ with open(DEVICES_PY, "r") as f: content = f.read() -OLD = ( - "a7xx_gen1 = GPUProps(\n" - " supports_uav_ubwc = True,\n" - " fs_must_have_non_zero_constlen_quirk = True,\n" - " enable_tp_ubwc_flag_hint = True,\n" - " reading_shading_rate_requires_smask_quirk = True,\n" - " cs_lock_unlock_quirk = True,\n" - " )" -) -NEW = ( - "a7xx_gen1 = GPUProps(\n" - " supports_uav_ubwc = True,\n" - " fs_must_have_non_zero_constlen_quirk = True,\n" - " enable_tp_ubwc_flag_hint = True,\n" - " reading_shading_rate_requires_smask_quirk = True,\n" - " cs_lock_unlock_quirk = True,\n" - " has_early_preamble = False,\n" - " has_scalar_predicates = False,\n" - " )" -) - -if NEW in content: - print(f" {DEVICES_PY}: a7xx_gen1 quirks already applied") -elif OLD in content: - content = content.replace(OLD, NEW, 1) - try: - compile(content, DEVICES_PY, "exec") - except SyntaxError as e: - print(f" FATAL: syntax error after patching at line {e.lineno}: {e.msg}", file=sys.stderr) - sys.exit(1) - with open(DEVICES_PY, "w") as f: - f.write(content) - print(f" {DEVICES_PY}: appended has_early_preamble=False, has_scalar_predicates=False to a7xx_gen1") -else: +KEYS = ("has_early_preamble", "has_scalar_predicates") + +# Anchor on the block itself: upstream keeps renaming the quirks inside it. The +# body ends at the first unindented line, so it cannot run into the next block. +match = re.search(r"^a7xx_gen1 = GPUProps\(\n((?:[ \t]+.*\n|\n)*?)^[ \t]*\)", content, re.M) + +if not match: print(f" WARNING: a7xx_gen1 anchor not matched, skipping", file=sys.stderr) +else: + body = match.group(1) + new_body = body + for key in KEYS: + entry = re.compile(rf"^([ \t]*{key}[ \t]*=[ \t]*)\w+", re.M) + if entry.search(new_body): + new_body = entry.sub(r"\g<1>False", new_body, count=1) + else: + new_body += f" {key} = False,\n" + + if new_body == body: + print(f" {DEVICES_PY}: a7xx_gen1 quirks already applied") + else: + content = content[:match.start(1)] + new_body + content[match.end(1):] + try: + compile(content, DEVICES_PY, "exec") + except SyntaxError as e: + print(f" FATAL: syntax error after patching at line {e.lineno}: {e.msg}", file=sys.stderr) + sys.exit(1) + with open(DEVICES_PY, "w") as f: + f.write(content) + print(f" {DEVICES_PY}: set has_early_preamble=False, has_scalar_predicates=False in a7xx_gen1") print("apply_a7xx_gen1_quirks.py: done") From c5a4f5f3732744d1f8729ba0a84254ab07ead4d3 Mon Sep 17 00:00:00 2001 From: MaxsTechReview Date: Mon, 28 Sep 2026 07:24:04 -0400 Subject: [PATCH 2/4] Fail the Android build when a patch script misses its anchor The a7xx_gen1 skip above passed verification: the check only looked for each script's "done" line, which prints on every path. Fail on any WARNING or FATAL line in the patch stage. Deliberate skips such as the autotune drawcall gate print neither. --- verify_patches.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/verify_patches.sh b/verify_patches.sh index af097cd..33c757c 100755 --- a/verify_patches.sh +++ b/verify_patches.sh @@ -15,10 +15,8 @@ variants=("$@") if [ -n "${GITHUB_ACTIONS:-}" ]; then err() { echo "::error::$*"; } - warn() { echo "::warning::$*"; } else err() { echo "ERROR: $*" >&2; } - warn() { echo "WARNING: $*" >&2; } fi # Reported by every variant. The RedMagic display fixes ride EXTRA_SCRIPT, so a @@ -76,12 +74,19 @@ for v in "${variants[@]}"; do done fi - # Anchor drift, excluding the autotune drawcall gate upstream restructured - # away on purpose (see MAINTENANCE.md). - drift=$(grep -E "anchor absent" "$log" | grep -v "drawcall anchor absent" || true) + # Scripts print WARNING/FATAL when an anchor misses; a skip upstream made + # on purpose (the autotune drawcall gate, see MAINTENANCE.md) has neither. + # Only the patch stage counts: the Mesa build prints its own warnings. + stage=$(sed -n '/==== Building Mesa on /,/Generating build files\.\.\./p' "$log") + if [ -z "$stage" ]; then + err "variant ${v}: patch stage not found in $log" + missing=1 + fi + drift=$(printf '%s\n' "$stage" | grep -E "(WARNING|FATAL):" || true) if [ -n "$drift" ]; then - warn "variant ${v} has a drifted anchor:" + err "variant ${v}: a patch script missed its anchor:" printf '%s\n' "$drift" + missing=1 fi if [ "$missing" -eq 0 ]; then From 22e66826daecab660c1c9af8d68647ed986e02bd Mon Sep 17 00:00:00 2001 From: MaxsTechReview Date: Mon, 28 Sep 2026 07:24:04 -0400 Subject: [PATCH 3/4] Linux Turnip: rebase the Mesa patches onto current main Mesa 1887e21 removed tu_has_multiview and moved the a8xx quirks into their own section, so 0001 and 0003 no longer applied. The code the patches add is unchanged. --- ...late-VK_EXT_mesh_shader-with-compute.patch | 88 +++++++++---------- ...-required-subgroup-size-of-half-a-wa.patch | 36 ++++---- ...Sanitize-cube-map-directions-on-A8XX.patch | 22 ++--- ...ndless-descriptors-through-the-A8XX-.patch | 10 +-- ...XX-command-streams-through-a-virtual.patch | 4 +- 5 files changed, 80 insertions(+), 80 deletions(-) diff --git a/linux/patches/0001-tu-Emulate-VK_EXT_mesh_shader-with-compute.patch b/linux/patches/0001-tu-Emulate-VK_EXT_mesh_shader-with-compute.patch index 0881724..846d568 100644 --- a/linux/patches/0001-tu-Emulate-VK_EXT_mesh_shader-with-compute.patch +++ b/linux/patches/0001-tu-Emulate-VK_EXT_mesh_shader-with-compute.patch @@ -29,7 +29,7 @@ predicated on those tables. create mode 100644 src/freedreno/vulkan/tu_mesh.h diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c -index d45de5b..63ce20f 100644 +index d45de5bf..63ce20f2 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -353,6 +353,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) @@ -41,7 +41,7 @@ index d45de5b..63ce20f 100644 case nir_intrinsic_preamble_start_ir3: case nir_intrinsic_optimization_barrier_sgpr_amd: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py -index c80a232..463e0c2 100644 +index c80a232f..463e0c2e 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1638,6 +1638,9 @@ system_value("tess_param_base_ir3", 2) @@ -55,7 +55,7 @@ index c80a232..463e0c2 100644 system_value("subgroup_id_shift_ir3", 1) diff --git a/src/freedreno/vulkan/meson.build b/src/freedreno/vulkan/meson.build -index b019710..4647b23 100644 +index b0197103..4647b23a 100644 --- a/src/freedreno/vulkan/meson.build +++ b/src/freedreno/vulkan/meson.build @@ -49,6 +49,7 @@ libtu_files = files( @@ -67,7 +67,7 @@ index b019710..4647b23 100644 'tu_nir_lower_multiview.cc', 'tu_nir_lower_ray_query.cc', diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc -index 01f0aa6..f87b236 100644 +index ef00cecf..35b054e8 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -1346,12 +1346,21 @@ tu6_update_msaa(struct tu_cmd_buffer *cmd) @@ -382,7 +382,7 @@ index 01f0aa6..f87b236 100644 if (primtype == DI_PT_PATCHES0) primtype = (enum pc_di_primtype) (primtype + -@@ -9481,10 +9529,10 @@ template +@@ -9586,10 +9634,10 @@ template static void tu_emit_compute_driver_params(struct tu_cmd_buffer *cmd, struct tu_cs *cs, @@ -394,7 +394,7 @@ index 01f0aa6..f87b236 100644 const struct ir3_shader_variant *variant = shader->variant; const struct ir3_const_state *const_state = variant->const_state; unsigned subgroup_size = variant->info.subgroup_size; -@@ -9678,11 +9726,14 @@ tu_dispatch(struct tu_cmd_buffer *cmd, +@@ -9783,11 +9831,14 @@ tu_dispatch(struct tu_cmd_buffer *cmd, cmd->device->physical_device->info->props.instr_cache_size; /* We don't use draw states for dispatches, so the bound pipeline @@ -411,7 +411,7 @@ index 01f0aa6..f87b236 100644 } /* There appears to be a HW bug where in some rare circumstances it appears -@@ -9715,7 +9766,7 @@ tu_dispatch(struct tu_cmd_buffer *cmd, +@@ -9820,7 +9871,7 @@ tu_dispatch(struct tu_cmd_buffer *cmd, /* note: no reason to have this in a separate IB */ tu_cs_emit_state_ib(cs, tu_emit_consts(cmd, true)); @@ -420,7 +420,7 @@ index 01f0aa6..f87b236 100644 if (cmd->state.dirty & TU_CMD_DIRTY_COMPUTE_DESC_SETS) { tu6_emit_descriptor_sets(cmd, VK_PIPELINE_BIND_POINT_COMPUTE); -@@ -9996,6 +10047,484 @@ tu_dispatch_unaligned_indirect(VkCommandBuffer commandBuffer, +@@ -10101,6 +10152,484 @@ tu_dispatch_unaligned_indirect(VkCommandBuffer commandBuffer, TU_CALLX(cmd_buffer->device, tu_dispatch)(cmd_buffer, &info); } @@ -906,10 +906,10 @@ index 01f0aa6..f87b236 100644 tu_CmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h -index 1a78b9e..3372fb3 100644 +index c7db208a..4b87b019 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h -@@ -312,6 +312,7 @@ struct tu_render_pass_state +@@ -319,6 +319,7 @@ struct tu_render_pass_state { bool xfb_used; bool has_tess; @@ -917,7 +917,7 @@ index 1a78b9e..3372fb3 100644 bool has_prim_generated_query_in_rp; bool has_vtx_stats_query_in_rp; bool has_zpass_done_sample_count_write_in_rp; -@@ -475,7 +476,7 @@ struct tu_cmd_state +@@ -482,7 +483,7 @@ struct tu_cmd_state { uint32_t dirty; @@ -926,7 +926,7 @@ index 1a78b9e..3372fb3 100644 struct tu_program_state program; -@@ -596,6 +597,12 @@ struct tu_cmd_state +@@ -603,6 +604,12 @@ struct tu_cmd_state bool fdm_custom_resolve_subsampled; bool tessfactor_addr_set; @@ -940,7 +940,7 @@ index 1a78b9e..3372fb3 100644 bool msaa_disable; tu_lrz_blend_status lrz_blend_status; diff --git a/src/freedreno/vulkan/tu_common.h b/src/freedreno/vulkan/tu_common.h -index dfa46d8..589daf6 100644 +index dfa46d8b..589daf6f 100644 --- a/src/freedreno/vulkan/tu_common.h +++ b/src/freedreno/vulkan/tu_common.h @@ -160,6 +160,8 @@ enum tu_predicate_bit { @@ -953,11 +953,11 @@ index dfa46d8..589daf6 100644 /* Onchip timestamp register layout. */ diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc -index 180591a..ff079f7 100644 +index eeebdc59..12c21f1e 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc -@@ -205,6 +205,16 @@ static bool tu_is_vk_1_1(const struct tu_physical_device *device) - return tu_has_multiview(device); +@@ -194,6 +194,16 @@ is_kgsl(struct tu_instance *instance) + return strcmp(instance->knl->name, "kgsl") == 0; } +/* Mesh and task shaders are emulated with compute dispatches inside @@ -973,7 +973,7 @@ index 180591a..ff079f7 100644 static uint32_t tu_subgroup_size(const struct tu_physical_device *device) { -@@ -378,6 +388,7 @@ get_device_extensions(const struct tu_physical_device *device, +@@ -366,6 +376,7 @@ get_device_extensions(const struct tu_physical_device *device, .EXT_load_store_op_none = true, .EXT_map_memory_placed = true, .EXT_memory_budget = true, @@ -981,7 +981,7 @@ index 180591a..ff079f7 100644 .EXT_multi_draw = true, .EXT_multisampled_render_to_single_sampled = true, .EXT_mutable_descriptor_type = true, -@@ -829,6 +840,13 @@ tu_get_features(struct tu_physical_device *pdevice, +@@ -817,6 +828,13 @@ tu_get_features(struct tu_physical_device *pdevice, features->memoryMapRangePlaced = false; features->memoryUnmapReserve = true; @@ -995,7 +995,7 @@ index 180591a..ff079f7 100644 /* VK_EXT_multi_draw */ features->multiDraw = true; -@@ -993,6 +1011,10 @@ tu_get_physical_device_properties_1_1(struct tu_physical_device *pdevice, +@@ -981,6 +999,10 @@ tu_get_physical_device_properties_1_1(struct tu_physical_device *pdevice, VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR | VK_SUBGROUP_FEATURE_CLUSTERED_BIT | VK_SUBGROUP_FEATURE_ARITHMETIC_BIT; @@ -1006,7 +1006,7 @@ index 180591a..ff079f7 100644 if (pdevice->info->props.has_getfiberid) { p->subgroupSupportedStages |= VK_SHADER_STAGE_ALL_GRAPHICS; p->subgroupSupportedOperations |= VK_SUBGROUP_FEATURE_QUAD_BIT; -@@ -1130,7 +1152,8 @@ tu_get_physical_device_properties_1_3(struct tu_physical_device *pdevice, +@@ -1117,7 +1139,8 @@ tu_get_physical_device_properties_1_3(struct tu_physical_device *pdevice, p->requiredSubgroupSizeStages = p->minSubgroupSize == p->maxSubgroupSize ? VK_SHADER_STAGE_ALL @@ -1016,7 +1016,7 @@ index 180591a..ff079f7 100644 p->maxInlineUniformBlockSize = MAX_INLINE_UBO_RANGE; p->maxPerStageDescriptorInlineUniformBlocks = MAX_INLINE_UBOS; -@@ -1459,6 +1482,44 @@ tu_get_properties(struct tu_physical_device *pdevice, +@@ -1444,6 +1467,44 @@ tu_get_properties(struct tu_physical_device *pdevice, os_get_page_size(&os_page_size); props->minPlacedMemoryMapAlignment = os_page_size; @@ -1061,7 +1061,7 @@ index 180591a..ff079f7 100644 /* VK_EXT_multi_draw */ props->maxMultiDrawCount = 2048; -@@ -3371,6 +3432,11 @@ tu_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) +@@ -3364,6 +3425,11 @@ tu_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) tu_destroy_empty_shaders(device); @@ -1074,10 +1074,10 @@ index 180591a..ff079f7 100644 vk_meta_device_finish(&device->vk, &device->meta); diff --git a/src/freedreno/vulkan/tu_device.h b/src/freedreno/vulkan/tu_device.h -index a0295de..2b15ae7 100644 +index 15d65a27..917d7faa 100644 --- a/src/freedreno/vulkan/tu_device.h +++ b/src/freedreno/vulkan/tu_device.h -@@ -374,6 +374,12 @@ struct tu_device +@@ -377,6 +377,12 @@ struct tu_device /* Lazily allocated, protected by the device mutex. */ struct tu_bo *tess_bo; @@ -1092,7 +1092,7 @@ index a0295de..2b15ae7 100644 uint64_t global_shader_va[GLOBAL_SH_COUNT]; diff --git a/src/freedreno/vulkan/tu_mesh.cc b/src/freedreno/vulkan/tu_mesh.cc new file mode 100644 -index 0000000..f6770d7 +index 00000000..f6770d71 --- /dev/null +++ b/src/freedreno/vulkan/tu_mesh.cc @@ -0,0 +1,992 @@ @@ -2090,7 +2090,7 @@ index 0000000..f6770d7 +} diff --git a/src/freedreno/vulkan/tu_mesh.h b/src/freedreno/vulkan/tu_mesh.h new file mode 100644 -index 0000000..1e9fda0 +index 00000000..1e9fda0a --- /dev/null +++ b/src/freedreno/vulkan/tu_mesh.h @@ -0,0 +1,127 @@ @@ -2222,7 +2222,7 @@ index 0000000..1e9fda0 + +#endif /* TU_MESH_H */ diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc -index 75c0782..949a4e0 100644 +index c05ffc45..569bf613 100644 --- a/src/freedreno/vulkan/tu_pipeline.cc +++ b/src/freedreno/vulkan/tu_pipeline.cc @@ -53,6 +53,17 @@ emit_load_state(struct tu_cs *cs, unsigned opcode, enum a6xx_state_type st, @@ -2322,7 +2322,7 @@ index 75c0782..949a4e0 100644 shader_blake3[BLAKE3_KEY_LEN] = (unsigned char) stage; shaders[stage] = diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h -index 791a4fc..31bf5c4 100644 +index 791a4fcb..31bf5c4e 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -70,7 +70,7 @@ struct tu_nir_shaders @@ -2366,7 +2366,7 @@ index 791a4fc..31bf5c4 100644 void tu6_emit_vpc(struct tu_cs *cs, diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc -index 57c95e6..ad9d563 100644 +index 4fb42f2d..8ed25ac8 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -1165,7 +1165,8 @@ lower_inline_ubo(nir_builder *b, nir_intrinsic_instr *intrin, void *cb_data) @@ -2426,7 +2426,7 @@ index 57c95e6..ad9d563 100644 /* Returns whether we can speculatively access through a Vulkan descriptor. * Used for SSBO/UBO accesses, where vtn produces * vulkan_resource_index/load_vulkan_descriptor. See build_bindless() for the -@@ -1553,6 +1594,20 @@ tu_lower_io(nir_shader *shader, struct tu_device *dev, +@@ -1554,6 +1595,20 @@ tu_lower_io(nir_shader *shader, struct tu_device *dev, } } @@ -2447,7 +2447,7 @@ index 57c95e6..ad9d563 100644 ir3_const_alloc(const_allocs, IR3_CONST_ALLOC_INLINE_UNIFORM_ADDRS, ldgk_consts, 1); if (dev->physical_device->compiler_options.enable_ssbo_emulation) { -@@ -1584,6 +1639,9 @@ tu_lower_io(nir_shader *shader, struct tu_device *dev, +@@ -1585,6 +1640,9 @@ tu_lower_io(nir_shader *shader, struct tu_device *dev, progress |= nir_shader_intrinsics_pass(shader, lower_inline_ubo, nir_metadata_none, ¶ms); @@ -2457,7 +2457,7 @@ index 57c95e6..ad9d563 100644 } progress |= nir_shader_instructions_pass(shader, -@@ -3347,6 +3405,9 @@ tu_shader_serialize(struct vk_pipeline_cache_object *object, +@@ -3355,6 +3413,9 @@ tu_shader_serialize(struct vk_pipeline_cache_object *object, case MESA_SHADER_FRAGMENT: blob_write_bytes(blob, &shader->fs, sizeof(shader->fs)); break; @@ -2467,7 +2467,7 @@ index 57c95e6..ad9d563 100644 default: break; } -@@ -3388,6 +3449,9 @@ tu_shader_deserialize(struct vk_pipeline_cache *cache, +@@ -3396,6 +3457,9 @@ tu_shader_deserialize(struct vk_pipeline_cache *cache, case MESA_SHADER_FRAGMENT: blob_copy_bytes(blob, &shader->fs, sizeof(shader->fs)); break; @@ -2477,7 +2477,7 @@ index 57c95e6..ad9d563 100644 default: break; } -@@ -3575,6 +3639,8 @@ tu_shader_create(struct tu_device *dev, +@@ -3613,6 +3677,8 @@ tu_shader_create(struct tu_device *dev, return VK_ERROR_OUT_OF_HOST_MEMORY; shader->per_layer_viewport = info->per_layer_viewport; @@ -2486,7 +2486,7 @@ index 57c95e6..ad9d563 100644 if (nir->info.stage == MESA_SHADER_FRAGMENT && key->fdm_per_layer) { -@@ -3788,6 +3854,50 @@ tu6_get_tessmode(const struct nir_shader *shader) +@@ -3826,6 +3892,50 @@ tu6_get_tessmode(const struct nir_shader *shader) } } @@ -2537,7 +2537,7 @@ index 57c95e6..ad9d563 100644 VkResult tu_compile_shaders(struct tu_device *device, VkPipelineCreateFlags2KHR pipeline_flags, -@@ -3803,11 +3913,13 @@ tu_compile_shaders(struct tu_device *device, +@@ -3841,11 +3951,13 @@ tu_compile_shaders(struct tu_device *device, VkPipelineCreationFeedback *stage_feedbacks) { struct ir3_shader_key ir3_key = {}; @@ -2553,7 +2553,7 @@ index 57c95e6..ad9d563 100644 stage = (mesa_shader_stage) (stage + 1)) { const VkPipelineShaderStageCreateInfo *stage_info = stage_infos[stage]; if (!stage_info) -@@ -3831,7 +3943,7 @@ tu_compile_shaders(struct tu_device *device, +@@ -3885,7 +3997,7 @@ tu_compile_shaders(struct tu_device *device, if (nir_initial_disasm) { for (mesa_shader_stage stage = MESA_SHADER_VERTEX; @@ -2562,7 +2562,7 @@ index 57c95e6..ad9d563 100644 stage = (mesa_shader_stage) (stage + 1)) { if (!nir[stage]) continue; -@@ -3841,7 +3953,20 @@ tu_compile_shaders(struct tu_device *device, +@@ -3895,7 +4007,20 @@ tu_compile_shaders(struct tu_device *device, } } @@ -2584,7 +2584,7 @@ index 57c95e6..ad9d563 100644 stage = (mesa_shader_stage) (stage + 1)) { if (!nir[stage]) continue; -@@ -3853,16 +3978,18 @@ tu_compile_shaders(struct tu_device *device, +@@ -3907,16 +4032,18 @@ tu_compile_shaders(struct tu_device *device, stage_feedbacks[stage].duration += os_time_get_nano() - stage_start; } @@ -2606,7 +2606,7 @@ index 57c95e6..ad9d563 100644 } /* With pipelines, tessellation modes can be set on either shader, for -@@ -3915,7 +4042,8 @@ tu_compile_shaders(struct tu_device *device, +@@ -3969,7 +4096,8 @@ tu_compile_shaders(struct tu_device *device, if (nir[MESA_SHADER_TESS_CTRL] && !nir[MESA_SHADER_FRAGMENT]) ir3_key.tcs_store_primid = true; @@ -2616,7 +2616,7 @@ index 57c95e6..ad9d563 100644 stage = (mesa_shader_stage) (stage + 1)) { if (!nir[stage] || shaders[stage]) continue; -@@ -3945,7 +4073,8 @@ tu_compile_shaders(struct tu_device *device, +@@ -3999,7 +4127,8 @@ tu_compile_shaders(struct tu_device *device, fail: ralloc_free(mem_ctx); @@ -2626,7 +2626,7 @@ index 57c95e6..ad9d563 100644 stage = (mesa_shader_stage) (stage + 1)) { if (shaders[stage]) { tu_shader_destroy(device, shaders[stage]); -@@ -4125,6 +4254,45 @@ tu_destroy_empty_shaders(struct tu_device *dev) +@@ -4179,6 +4308,45 @@ tu_destroy_empty_shaders(struct tu_device *dev) vk_pipeline_cache_object_unref(&dev->vk, &dev->empty_fs_fdm->base); } @@ -2673,7 +2673,7 @@ index 57c95e6..ad9d563 100644 tu_shader_destroy(struct tu_device *dev, struct tu_shader *shader) diff --git a/src/freedreno/vulkan/tu_shader.h b/src/freedreno/vulkan/tu_shader.h -index b19287b..5665d21 100644 +index e729d44d..cc9f4e87 100644 --- a/src/freedreno/vulkan/tu_shader.h +++ b/src/freedreno/vulkan/tu_shader.h @@ -14,6 +14,7 @@ @@ -2721,7 +2721,7 @@ index b19287b..5665d21 100644 }; extern const struct vk_pipeline_cache_object_ops tu_shader_ops; -@@ -265,6 +273,9 @@ tu_init_empty_shaders(struct tu_device *device); +@@ -271,6 +279,9 @@ tu_init_empty_shaders(struct tu_device *device); void tu_destroy_empty_shaders(struct tu_device *device); diff --git a/linux/patches/0002-tu-ir3-Support-a-required-subgroup-size-of-half-a-wa.patch b/linux/patches/0002-tu-ir3-Support-a-required-subgroup-size-of-half-a-wa.patch index 616c600..6026807 100644 --- a/linux/patches/0002-tu-ir3-Support-a-required-subgroup-size-of-half-a-wa.patch +++ b/linux/patches/0002-tu-ir3-Support-a-required-subgroup-size-of-half-a-wa.patch @@ -23,7 +23,7 @@ both sides of a divergent branch. 9 files changed, 329 insertions(+), 10 deletions(-) diff --git a/src/freedreno/ir3/ir3_lower_subgroups.c b/src/freedreno/ir3/ir3_lower_subgroups.c -index c354289..cb9ad27 100644 +index c3542897..cb9ad27b 100644 --- a/src/freedreno/ir3/ir3_lower_subgroups.c +++ b/src/freedreno/ir3/ir3_lower_subgroups.c @@ -876,3 +876,293 @@ ir3_nir_lower_shuffle(nir_shader *nir, struct ir3_shader *shader) @@ -321,10 +321,10 @@ index c354289..cb9ad27 100644 + return progress; +} diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c -index 554cf57..0edc5ea 100644 +index 4e1961fc..df8e07b1 100644 --- a/src/freedreno/ir3/ir3_nir.c +++ b/src/freedreno/ir3/ir3_nir.c -@@ -1054,6 +1054,9 @@ ir3_nir_post_finalize(struct ir3_shader *shader) +@@ -1058,6 +1058,9 @@ ir3_nir_post_finalize(struct ir3_shader *shader) * it here. Beyond this point nir_intrinsic_load_subgroup_size will return * the "real" subgroup size. */ @@ -335,10 +335,10 @@ index 554cf57..0edc5ea 100644 ir3_shader_get_subgroup_size(compiler, &shader->options, s->info.stage, &subgroup_size, &max_subgroup_size); diff --git a/src/freedreno/ir3/ir3_nir.h b/src/freedreno/ir3/ir3_nir.h -index 19355dd..4cb1031 100644 +index 4e9cff95..5e35cd1b 100644 --- a/src/freedreno/ir3/ir3_nir.h +++ b/src/freedreno/ir3/ir3_nir.h -@@ -118,6 +118,7 @@ nir_def *ir3_nir_try_propagate_bit_shift(nir_builder *b, +@@ -119,6 +119,7 @@ nir_def *ir3_nir_try_propagate_bit_shift(nir_builder *b, bool ir3_nir_lower_subgroups_filter(const nir_intrinsic_instr *intrin, const void *data); bool ir3_nir_lower_shuffle(nir_shader *nir, struct ir3_shader *shader); bool ir3_nir_opt_subgroups(nir_shader *nir, struct ir3_shader_variant *v); @@ -347,10 +347,10 @@ index 19355dd..4cb1031 100644 nir_def *ir3_get_shared_driver_ubo(nir_builder *b, const struct ir3_driver_ubo *ubo); diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c -index 3745a4d..d729c19 100644 +index eff9791f..ef4e6069 100644 --- a/src/freedreno/ir3/ir3_shader.c +++ b/src/freedreno/ir3/ir3_shader.c -@@ -1329,6 +1329,12 @@ ir3_shader_get_subgroup_size(const struct ir3_compiler *compiler, +@@ -1391,6 +1391,12 @@ ir3_shader_get_subgroup_size(const struct ir3_compiler *compiler, case IR3_DOUBLE_ONLY: *subgroup_size = *max_subgroup_size = compiler->info->threadsize_base * 2; break; @@ -364,10 +364,10 @@ index 3745a4d..d729c19 100644 /* For vertex stages, we know the wavesize will never be doubled. * Lower subgroup_size here, to avoid having to deal with it when diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h -index d52a106..e7c6617 100644 +index 70bdda33..9656b529 100644 --- a/src/freedreno/ir3/ir3_shader.h +++ b/src/freedreno/ir3/ir3_shader.h -@@ -140,6 +140,8 @@ enum ir3_wavesize_option { +@@ -144,6 +144,8 @@ enum ir3_wavesize_option { IR3_SINGLE_ONLY, IR3_SINGLE_OR_DOUBLE, IR3_DOUBLE_ONLY, @@ -377,10 +377,10 @@ index d52a106..e7c6617 100644 /** diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc -index ff079f7..ee9d4ab 100644 +index 12c21f1e..767c7f28 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc -@@ -222,6 +222,16 @@ tu_subgroup_size(const struct tu_physical_device *device) +@@ -211,6 +211,16 @@ tu_subgroup_size(const struct tu_physical_device *device) (device->expose_double_threadsize ? 2 : 1); } @@ -397,7 +397,7 @@ index ff079f7..ee9d4ab 100644 static void get_device_extensions(const struct tu_physical_device *device, struct vk_device_extension_table *ext) -@@ -1141,16 +1151,16 @@ static void +@@ -1128,16 +1138,16 @@ static void tu_get_physical_device_properties_1_3(struct tu_physical_device *pdevice, struct vk_properties *p) { @@ -421,7 +421,7 @@ index ff079f7..ee9d4ab 100644 : (VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_TASK_BIT_EXT | VK_SHADER_STAGE_MESH_BIT_EXT); diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc -index 949a4e0..7343480 100644 +index 569bf613..d314496f 100644 --- a/src/freedreno/vulkan/tu_pipeline.cc +++ b/src/freedreno/vulkan/tu_pipeline.cc @@ -1525,6 +1525,10 @@ tu_append_executable(struct tu_pipeline *pipeline, @@ -435,7 +435,7 @@ index 949a4e0..7343480 100644 .is_binning = variant->binning_pass, .nir_from_spirv = nir_from_spirv, .nir_final = ralloc_strdup(pipeline->executables_mem_ctx, variant->disasm_info.nir), -@@ -5196,7 +5200,6 @@ tu_GetPipelineExecutablePropertiesKHR( +@@ -5202,7 +5206,6 @@ tu_GetPipelineExecutablePropertiesKHR( uint32_t* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties) { @@ -443,7 +443,7 @@ index 949a4e0..7343480 100644 VK_FROM_HANDLE(tu_pipeline, pipeline, pPipelineInfo->pipeline); VK_OUTARRAY_MAKE_TYPED(VkPipelineExecutablePropertiesKHR, out, pProperties, pExecutableCount); -@@ -5213,8 +5216,7 @@ tu_GetPipelineExecutablePropertiesKHR( +@@ -5219,8 +5222,7 @@ tu_GetPipelineExecutablePropertiesKHR( VK_COPY_STR(props->description, _mesa_shader_stage_to_string(stage)); @@ -454,7 +454,7 @@ index 949a4e0..7343480 100644 } diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h -index 31bf5c4..b3a9305 100644 +index 31bf5c4e..b3a9305c 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -163,6 +163,7 @@ struct tu_pipeline_executable { @@ -466,10 +466,10 @@ index 31bf5c4..b3a9305 100644 char *nir_from_spirv; diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc -index ad9d563..8e7194f 100644 +index 8ed25ac8..40575454 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc -@@ -4095,7 +4095,11 @@ tu_shader_key_subgroup_size(struct tu_shader_key *key, +@@ -4149,7 +4149,11 @@ tu_shader_key_subgroup_size(struct tu_shader_key *key, struct tu_device *dev) { enum ir3_wavesize_option api_wavesize, real_wavesize; diff --git a/linux/patches/0003-ir3-Sanitize-cube-map-directions-on-A8XX.patch b/linux/patches/0003-ir3-Sanitize-cube-map-directions-on-A8XX.patch index 8e9c957..8224bf9 100644 --- a/linux/patches/0003-ir3-Sanitize-cube-map-directions-on-A8XX.patch +++ b/linux/patches/0003-ir3-Sanitize-cube-map-directions-on-A8XX.patch @@ -16,10 +16,10 @@ with zero, clamp to finite values and turn the zero vector into +Z. 3 files changed, 64 insertions(+) diff --git a/src/freedreno/common/freedreno_dev_info.h b/src/freedreno/common/freedreno_dev_info.h -index 34fb9e6..c720898 100644 +index d0be37be..336142f6 100644 --- a/src/freedreno/common/freedreno_dev_info.h +++ b/src/freedreno/common/freedreno_dev_info.h -@@ -516,6 +516,11 @@ struct fd_dev_info { +@@ -483,6 +483,11 @@ struct fd_dev_info { /* On a750+ SUBPASS_FENCE also implicitly does CCU_RESOLVE_CLEAN */ bool subpass_fence_cleans_resolve; @@ -29,25 +29,25 @@ index 34fb9e6..c720898 100644 + */ + bool cube_coord_hang_quirk; } props; - }; + #define FD_QUIRK(info, name) (info)->quirks.name diff --git a/src/freedreno/common/freedreno_devices.py b/src/freedreno/common/freedreno_devices.py -index 3033957..9fcc077 100644 +index 8f4f4328..2fa865de 100644 --- a/src/freedreno/common/freedreno_devices.py +++ b/src/freedreno/common/freedreno_devices.py -@@ -1313,6 +1313,7 @@ a8xx_base = GPUProps( +@@ -1462,6 +1462,7 @@ a8xx_base = GPUProps( + round_robin_errata = False, max_texel_buffer_range_elements = (1 << 29) - 1, max_storage_buffer_range_bytes = (1 << 31) - 1, - alias_mova_quirk = False, + cube_coord_hang_quirk = True, - ) - # For a8xx, the chicken bit and most other non-ctx reg + QCTDD10204462 = False, + QCTDD11147232 = False, diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c -index 0edc5ea..1c50220 100644 +index df8e07b1..1937a9a1 100644 --- a/src/freedreno/ir3/ir3_nir.c +++ b/src/freedreno/ir3/ir3_nir.c -@@ -717,6 +717,61 @@ ir3_nir_min_lod_workaround(nir_shader *shader) +@@ -721,6 +721,61 @@ ir3_nir_min_lod_workaround(nir_shader *shader) nir_metadata_control_flow, NULL); } @@ -109,7 +109,7 @@ index 0edc5ea..1c50220 100644 void ir3_finalize_nir(struct ir3_compiler *compiler, const struct ir3_shader_nir_options *options, -@@ -787,6 +842,9 @@ ir3_finalize_nir(struct ir3_compiler *compiler, +@@ -791,6 +846,9 @@ ir3_finalize_nir(struct ir3_compiler *compiler, NIR_PASS(_, s, ir3_nir_lower_sparse_residency); NIR_PASS(_, s, ir3_nir_min_lod_workaround); diff --git a/linux/patches/0004-tu-Invalidate-bindless-descriptors-through-the-A8XX-.patch b/linux/patches/0004-tu-Invalidate-bindless-descriptors-through-the-A8XX-.patch index 70cd329..d398e61 100644 --- a/linux/patches/0004-tu-Invalidate-bindless-descriptors-through-the-A8XX-.patch +++ b/linux/patches/0004-tu-Invalidate-bindless-descriptors-through-the-A8XX-.patch @@ -15,10 +15,10 @@ invalidate when the hardware is initialized and before blits. 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc -index 7f58b35..2befb7c 100644 +index a820f29b..d97d6503 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc -@@ -1036,6 +1036,8 @@ r3d_common(struct tu_cmd_buffer *cmd, struct tu_cs *cs, enum r3d_type type, +@@ -1079,6 +1079,8 @@ r3d_common(struct tu_cmd_buffer *cmd, struct tu_cs *cs, enum r3d_type type, .gfx_shared_const = true, .cs_bindless = CHIP == A6XX ? 0x1f : 0xff, .gfx_bindless = CHIP == A6XX ? 0x1f : 0xff,)); @@ -28,7 +28,7 @@ index 7f58b35..2befb7c 100644 with_crb (cs, 2 * 5 + 2 * 12) { tu6_emit_xs_config(crb, { .vs = vs, .fs = fs }); diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc -index f87b236..00da4fe 100644 +index 35b054e8..c2f268d9 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -390,12 +390,8 @@ tu6_emit_flushes(struct tu_cmd_buffer *cmd_buffer, @@ -68,10 +68,10 @@ index f87b236..00da4fe 100644 template diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h -index 3372fb3..b8c72be 100644 +index 4b87b019..fb86521a 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h -@@ -901,6 +901,26 @@ void tu6_emit_blit_scissor(struct tu_cmd_buffer *cmd, struct tu_cs *cs, +@@ -926,6 +926,26 @@ void tu6_emit_blit_scissor(struct tu_cmd_buffer *cmd, struct tu_cs *cs, void tu_disable_draw_states(struct tu_cmd_buffer *cmd, struct tu_cs *cs); diff --git a/linux/patches/0005-tu-kgsl-Fetch-A8XX-command-streams-through-a-virtual.patch b/linux/patches/0005-tu-kgsl-Fetch-A8XX-command-streams-through-a-virtual.patch index 323eb49..84af0e1 100644 --- a/linux/patches/0005-tu-kgsl-Fetch-A8XX-command-streams-through-a-virtual.patch +++ b/linux/patches/0005-tu-kgsl-Fetch-A8XX-command-streams-through-a-virtual.patch @@ -17,7 +17,7 @@ alias. 2 files changed, 99 insertions(+) diff --git a/src/freedreno/vulkan/tu_knl.h b/src/freedreno/vulkan/tu_knl.h -index 27f035f..6e72ffa 100644 +index 27f035ff..6e72ffab 100644 --- a/src/freedreno/vulkan/tu_knl.h +++ b/src/freedreno/vulkan/tu_knl.h @@ -57,6 +57,9 @@ struct tu_bo { @@ -31,7 +31,7 @@ index 27f035f..6e72ffa 100644 bool implicit_sync : 1; diff --git a/src/freedreno/vulkan/tu_knl_kgsl.cc b/src/freedreno/vulkan/tu_knl_kgsl.cc -index a999807..d76a9f9 100644 +index a9998073..d76a9f9d 100644 --- a/src/freedreno/vulkan/tu_knl_kgsl.cc +++ b/src/freedreno/vulkan/tu_knl_kgsl.cc @@ -295,6 +295,95 @@ kgsl_align_flag(uint64_t align) From 5886f720d8128ed92d7155c5a170ef6177ca9303 Mon Sep 17 00:00:00 2001 From: MaxsTechReview Date: Mon, 28 Sep 2026 07:24:04 -0400 Subject: [PATCH 4/4] Linux Turnip: build and release from main The Linux workflow only ran for pushes to feature/linux-drivers, and main had two weekly schedulers after both branches merged. Build pushes to main, keep the workflow's own schedule, and drop the reusable-workflow scheduler. Push builds get their own concurrency group so they cannot cancel a pending release. --- .github/workflows/build-linux-turnip.yml | 13 ++----------- .github/workflows/schedule-linux-turnip.yml | 21 --------------------- README.md | 2 +- linux/README.md | 8 ++++---- linux/scheduler/schedule-linux-turnip.yml | 21 --------------------- 5 files changed, 7 insertions(+), 58 deletions(-) delete mode 100644 .github/workflows/schedule-linux-turnip.yml delete mode 100644 linux/scheduler/schedule-linux-turnip.yml diff --git a/.github/workflows/build-linux-turnip.yml b/.github/workflows/build-linux-turnip.yml index 3d65229..fd3ccb4 100644 --- a/.github/workflows/build-linux-turnip.yml +++ b/.github/workflows/build-linux-turnip.yml @@ -1,18 +1,10 @@ name: Build WN Linux Turnip Drivers on: - workflow_call: - inputs: - source_ref: - type: string - default: feature/linux-drivers - publish: - type: boolean - default: false schedule: - cron: '0 12 * * 3' push: - branches: [feature/linux-drivers] + branches: [main] paths: ['linux/**', 'patches/**', 'build_linux_turnip.sh', '.github/workflows/build-linux-turnip.yml'] pull_request: paths: ['linux/**', 'patches/**', 'build_linux_turnip.sh', '.github/workflows/build-linux-turnip.yml'] @@ -24,7 +16,7 @@ on: default: false concurrency: - group: linux-turnip-${{ github.event_name == 'pull_request' && github.event.pull_request.number || 'release' }} + group: linux-turnip-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.event_name == 'push' && format('push-{0}', github.run_id) || 'release' }} cancel-in-progress: false permissions: @@ -42,7 +34,6 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ inputs.source_ref || github.sha }} persist-credentials: false - name: Version id: version diff --git a/.github/workflows/schedule-linux-turnip.yml b/.github/workflows/schedule-linux-turnip.yml deleted file mode 100644 index 23da3ec..0000000 --- a/.github/workflows/schedule-linux-turnip.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Weekly Linux Turnip - -on: - schedule: - - cron: '0 12 * * 3' - workflow_dispatch: - inputs: - publish: - description: Publish the Linux driver release - type: boolean - default: false - -permissions: - contents: write - -jobs: - linux: - uses: WinNative-Emu/Drivers/.github/workflows/build-linux-turnip.yml@feature/linux-drivers - with: - source_ref: feature/linux-drivers - publish: ${{ github.event_name == 'schedule' || inputs.publish }} diff --git a/README.md b/README.md index 97a20ff..9a45464 100644 --- a/README.md +++ b/README.md @@ -201,4 +201,4 @@ MIT — see `LICENSE`. ## Linux GameScope/Wayland drivers -The `feature/linux-drivers` branch adds glibc ARM64 Turnip packages alongside the existing Android builds. See [linux/README.md](linux/README.md) for the build, package format, validation and scheduling requirements. Android build scripts and releases keep their existing behavior. +`build-linux-turnip.yml` builds glibc ARM64 Turnip packages alongside the existing Android builds. See [linux/README.md](linux/README.md) for the build, package format, validation and release workflow. Android build scripts and releases keep their existing behavior. diff --git a/linux/README.md b/linux/README.md index 8dfafa0..ea3a219 100644 --- a/linux/README.md +++ b/linux/README.md @@ -48,8 +48,8 @@ Initial local validation built Mesa `5ff61a7646d29b54c324af0a60aa3bfb5cdd24d1`, ## Release workflow -`build-linux-turnip.yml` builds both variants on Ubuntu 24.04 ARM64. Branch pushes build preview artifacts. Manual runs create a draft unless `publish` is true; scheduled runs publish. The cron is the same as the Android workflow: Wednesday 12:00 UTC (`0 12 * * 3`). +`build-linux-turnip.yml` builds both variants on Ubuntu 24.04 ARM64 from `main`. Pushes to `main` and pull requests that change the Linux build produce preview artifacts only. Scheduled runs publish; the cron is the same as the Android workflow, Wednesday 12:00 UTC (`0 12 * * 3`). Manual runs create a draft unless `publish` is true: -GitHub executes scheduled workflows only from the default branch. The feature branch's cron is not active by itself. To activate weekly builds, merge this workflow into the default branch or add a default-branch entrypoint that checks out the Linux branch. Preserve the Android workflow and its existing schedule. After the push registers the workflow, manual dispatch with `--ref feature/linux-drivers` works; this was verified through the GitHub API. Push builds work on this branch immediately. - -A ready default-branch entrypoint is provided at `linux/scheduler/schedule-linux-turnip.yml`. Install that file as `.github/workflows/schedule-linux-turnip.yml` on `main` to call the reusable build from `feature/linux-drivers`. Its manual trigger defaults to a draft, while weekly runs publish. The reusable workflow checks out the Linux branch and records its actual recipe commit for release tags, even when the caller runs from main. Do not install both this scheduler and a separately scheduled copy of the full workflow on main. +```sh +gh workflow run build-linux-turnip.yml --ref main -f publish=true +``` diff --git a/linux/scheduler/schedule-linux-turnip.yml b/linux/scheduler/schedule-linux-turnip.yml deleted file mode 100644 index 23da3ec..0000000 --- a/linux/scheduler/schedule-linux-turnip.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Weekly Linux Turnip - -on: - schedule: - - cron: '0 12 * * 3' - workflow_dispatch: - inputs: - publish: - description: Publish the Linux driver release - type: boolean - default: false - -permissions: - contents: write - -jobs: - linux: - uses: WinNative-Emu/Drivers/.github/workflows/build-linux-turnip.yml@feature/linux-drivers - with: - source_ref: feature/linux-drivers - publish: ${{ github.event_name == 'schedule' || inputs.publish }}