main/mesa: use fix that is submitted upstream

Reduce stack usage instead of increase thread stack size.

From upstream: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10988
This commit is contained in:
Natanael Copa 2024-05-24 12:41:32 +02:00
parent 6157b11983
commit 62bf779680
3 changed files with 150 additions and 37 deletions

View File

@ -1,7 +1,7 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
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
"

View File

@ -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 <ncopa@alpinelinux.org>
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

View File

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