diff --git a/main/mesa/APKBUILD b/main/mesa/APKBUILD index c512fc5b248..579599012f4 100644 --- a/main/mesa/APKBUILD +++ b/main/mesa/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa pkgname=mesa pkgver=24.1.0 -pkgrel=1 +pkgrel=2 pkgdesc="Mesa DRI OpenGL library" url="https://www.mesa3d.org" arch="all" @@ -67,7 +67,7 @@ makedepends=" source=" https://mesa.freedesktop.org/archive/mesa-${pkgver/_/-}.tar.xz no-unlink-megadrivers.patch - musl-stacksize.patch + musl-fix-stack-overflow.patch " replaces="mesa-dricore" options="!check" # we skip tests intentionally @@ -374,5 +374,5 @@ _vulkan_layers() { sha512sums=" 4b7ed1940fc812ef4efb55978d3ffe3d0e2ae53d5b57a3baca10a52db2ba5852c5ee7e75c3739bd8d384c80bf1cba970a384250050f01f03bba98f255e12cec5 mesa-24.1.0.tar.xz e3d39d61b14188cd5a22e19e8c065650995f85943e6c42ec5775db5b76a9ebe8913253a8b9ac32056ac13a2c357cd951f867ecb39976c52f7d014dcc1a2d87dc no-unlink-megadrivers.patch -f713a65063d32d4bc81d88f95ee1aa0acf9f3d2d6a1cc0a90888c74d566688247d123f5195a5ad1d26317ef042e4b4471b5ad92fcf284ba4653794b6ff2cf7e8 musl-stacksize.patch +2a8b0d3288359d698707b2e504305c39de2ce510ec79a32b6493d6f446085dc0079ae9f6fea1aa1809481d45cb96a21414c23d638c89d1ad40f1c9b11a623dea musl-fix-stack-overflow.patch " diff --git a/main/mesa/musl-fix-stack-overflow.patch b/main/mesa/musl-fix-stack-overflow.patch new file mode 100644 index 00000000000..2c079b86e62 --- /dev/null +++ b/main/mesa/musl-fix-stack-overflow.patch @@ -0,0 +1,147 @@ +Upstream: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10988 + +From 4692869492255f199163bda26876174ea54a2861 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Fri, 24 May 2024 11:56:46 +0200 +Subject: [PATCH] nir/opt_varyings: reduce stack usage + +Avoid put a huge struct on stack to fix a stack overflow on musl libc. + +Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10988 +Fixes: commit c66967b5cb7a (nir: add nir_opt_varyings, new pass optimizing and compacting varyings) +--- + src/compiler/nir/nir_opt_varyings.c | 52 ++++++++++++++++------------- + 1 file changed, 29 insertions(+), 23 deletions(-) + +diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c +index c32cda66c93c4..0aded7fbc7201 100644 +--- a/src/compiler/nir/nir_opt_varyings.c ++++ b/src/compiler/nir/nir_opt_varyings.c +@@ -485,6 +485,7 @@ + #include "nir.h" + #include "nir_builder.h" + #include "util/u_math.h" ++#include "util/u_memory.h" + + /* nir_opt_varyings works at scalar 16-bit granularity across all varyings. + * +@@ -4205,11 +4206,12 @@ free_linkage(struct linkage_info *linkage) + static void + print_shader_linkage(nir_shader *producer, nir_shader *consumer) + { +- struct linkage_info linkage; ++ struct linkage_info *linkage = MALLOC_STRUCT(linkage_info); + +- init_linkage(producer, consumer, false, 0, 0, &linkage); +- print_linkage(&linkage); +- free_linkage(&linkage); ++ init_linkage(producer, consumer, false, 0, 0, linkage); ++ print_linkage(linkage); ++ free_linkage(linkage); ++ FREE(linkage); + } + + /** +@@ -4226,6 +4228,11 @@ nir_opt_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, + if (producer->info.stage == MESA_SHADER_TASK) + return 0; + ++ nir_opt_varyings_progress progress = 0; ++ struct linkage_info *linkage = MALLOC_STRUCT(linkage_info); ++ if (linkage == NULL) ++ return 0; ++ + /* Producers before a fragment shader must have up-to-date vertex + * divergence information. + */ +@@ -4235,19 +4242,17 @@ nir_opt_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, + nir_vertex_divergence_analysis(producer); + } + +- nir_opt_varyings_progress progress = 0; +- struct linkage_info linkage; + init_linkage(producer, consumer, spirv, max_uniform_components, +- max_ubos_per_stage, &linkage); ++ max_ubos_per_stage, linkage); + + /* Part 1: Run optimizations that only remove varyings. (they can move + * instructions between shaders) + */ +- remove_dead_varyings(&linkage, &progress); +- propagate_uniform_expressions(&linkage, &progress); ++ remove_dead_varyings(linkage, &progress); ++ propagate_uniform_expressions(linkage, &progress); + + /* Part 2: Deduplicate outputs. */ +- deduplicate_outputs(&linkage, &progress); ++ deduplicate_outputs(linkage, &progress); + + /* Run CSE on the consumer after output deduplication because duplicated + * loads can prevent finding the post-dominator for inter-shader code +@@ -4256,17 +4261,17 @@ nir_opt_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, + NIR_PASS(_, consumer, nir_opt_cse); + + /* Re-gather linkage info after CSE. */ +- free_linkage(&linkage); ++ free_linkage(linkage); + init_linkage(producer, consumer, spirv, max_uniform_components, +- max_ubos_per_stage, &linkage); ++ max_ubos_per_stage, linkage); + /* This must be done again to clean up bitmasks in linkage. */ +- remove_dead_varyings(&linkage, &progress); ++ remove_dead_varyings(linkage, &progress); + + /* This must be done after deduplication and before inter-shader code + * motion. + */ +- tidy_up_convergent_varyings(&linkage); +- find_open_coded_tes_input_interpolation(&linkage); ++ tidy_up_convergent_varyings(linkage); ++ find_open_coded_tes_input_interpolation(linkage); + + /* Part 3: Run optimizations that completely change varyings. */ + #if PRINT +@@ -4278,31 +4283,32 @@ nir_opt_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, + puts(""); + #endif + +- while (backward_inter_shader_code_motion(&linkage, &progress)) { ++ while (backward_inter_shader_code_motion(linkage, &progress)) { + #if PRINT + i++; + printf("Finished: %i\n", i); +- nir_print_shader(linkage.producer_builder.shader, stdout); +- nir_print_shader(linkage.consumer_builder.shader, stdout); +- print_linkage(&linkage); ++ nir_print_shader(linkage->producer_builder.shader, stdout); ++ nir_print_shader(linkage->consumer_builder.shader, stdout); ++ print_linkage(linkage); + puts(""); + #endif + } + + /* Part 4: Do compaction. */ +- compact_varyings(&linkage, &progress); ++ compact_varyings(linkage, &progress); + +- nir_metadata_preserve(linkage.producer_builder.impl, ++ nir_metadata_preserve(linkage->producer_builder.impl, + progress & nir_progress_producer ? + (nir_metadata_block_index | + nir_metadata_dominance) : + nir_metadata_all); +- nir_metadata_preserve(linkage.consumer_builder.impl, ++ nir_metadata_preserve(linkage->consumer_builder.impl, + progress & nir_progress_consumer ? + (nir_metadata_block_index | + nir_metadata_dominance) : + nir_metadata_all); +- free_linkage(&linkage); ++ free_linkage(linkage); ++ FREE(linkage); + + if (progress & nir_progress_producer) + nir_validate_shader(producer, "nir_opt_varyings"); +-- +GitLab + diff --git a/main/mesa/musl-stacksize.patch b/main/mesa/musl-stacksize.patch deleted file mode 100644 index c5e6a776321..00000000000 --- a/main/mesa/musl-stacksize.patch +++ /dev/null @@ -1,34 +0,0 @@ -Patch-Source: https://github.com/chimera-linux/cports/blob/b588dab4f47fe729000626d5878ce59c208e7ed8/main/mesa/patches/musl-stacksize.patch ---- a/src/c11/impl/threads_posix.c -+++ b/src/c11/impl/threads_posix.c -@@ -255,15 +255,29 @@ static inline int - thrd_create(thrd_t *thr, thrd_start_t func, void *arg) - { - struct impl_thrd_param *pack; -+#ifdef __GLIBC__ -+ pthread_attr_t *attrp = NULL; -+#else -+ pthread_attr_t attr = { 0 }; -+ pthread_attr_init(&attr); -+ pthread_attr_setstacksize(&attr, 8388608); -+ pthread_attr_t *attrp = &attr; -+#endif - assert(thr != NULL); - pack = (struct impl_thrd_param *)malloc(sizeof(struct impl_thrd_param)); - if (!pack) return thrd_nomem; - pack->func = func; - pack->arg = arg; -- if (pthread_create(thr, NULL, impl_thrd_routine, pack) != 0) { -+ if (pthread_create(thr, attrp, impl_thrd_routine, pack) != 0) { -+#ifndef __GLIBC__ -+ pthread_attr_destroy(&attr); -+#endif - free(pack); - return thrd_error; - } -+#ifndef __GLIBC__ -+ pthread_attr_destroy(&attr); -+#endif - return thrd_success; - } -