From f8cfcb10524a97d777cefca2b0d91a56a866aff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Date: Fri, 28 Jun 2024 10:49:49 +0200 Subject: [PATCH] Fix GNOME and KDE crash with some AMD GPUs Resolves: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11352 Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2293846 --- ...si-remove-has_syncobj-has_fence_to_h.patch | 153 ++++++++++++++++++ mesa.spec | 1 + 2 files changed, 154 insertions(+) create mode 100644 0001-Revert-ac-radeonsi-remove-has_syncobj-has_fence_to_h.patch diff --git a/0001-Revert-ac-radeonsi-remove-has_syncobj-has_fence_to_h.patch b/0001-Revert-ac-radeonsi-remove-has_syncobj-has_fence_to_h.patch new file mode 100644 index 0000000..2460001 --- /dev/null +++ b/0001-Revert-ac-radeonsi-remove-has_syncobj-has_fence_to_h.patch @@ -0,0 +1,153 @@ +From fddf49504e1bebb7efc52c1a0516300c0f217f18 Mon Sep 17 00:00:00 2001 +From: Pierre-Eric Pelloux-Prayer +Date: Wed, 26 Jun 2024 12:11:48 +0200 +Subject: [PATCH] Revert "ac, radeonsi: remove has_syncobj, + has_fence_to_handle" + +This reverts commit 02fe3c32cdfc3cf48cd691d6321978b8d4c3e61b. + +Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11352 +--- + src/amd/common/ac_gpu_info.c | 12 ++++++++++++ + src/amd/common/ac_gpu_info.h | 2 ++ + src/gallium/drivers/r600/r600_pipe_common.c | 1 + + src/gallium/drivers/radeonsi/si_fence.c | 10 ++++++++++ + src/gallium/drivers/radeonsi/si_get.c | 8 ++++++-- + 5 files changed, 31 insertions(+), 2 deletions(-) + +diff --git a/src/amd/common/ac_gpu_info.c b/src/amd/common/ac_gpu_info.c +index 78febf796b4..3f711bd45ec 100644 +--- a/src/amd/common/ac_gpu_info.c ++++ b/src/amd/common/ac_gpu_info.c +@@ -355,6 +355,14 @@ static intptr_t readlink(const char *path, char *buf, size_t bufsiz) + + #define CIK_TILE_MODE_COLOR_2D 14 + ++static bool has_syncobj(int fd) ++{ ++ uint64_t value; ++ if (drmGetCap(fd, DRM_CAP_SYNCOBJ, &value)) ++ return false; ++ return value ? true : false; ++} ++ + static bool has_timeline_syncobj(int fd) + { + uint64_t value; +@@ -1068,7 +1076,9 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info, + info->memory_freq_mhz_effective *= ac_memory_ops_per_clock(info->vram_type); + + info->has_userptr = true; ++ info->has_syncobj = has_syncobj(fd); + info->has_timeline_syncobj = has_timeline_syncobj(fd); ++ info->has_fence_to_handle = info->has_syncobj; + info->has_local_buffers = true; + info->has_bo_metadata = true; + info->has_eqaa_surface_allocator = info->gfx_level < GFX11; +@@ -1974,7 +1984,9 @@ void ac_print_gpu_info(const struct radeon_info *info, FILE *f) + fprintf(f, "Kernel & winsys capabilities:\n"); + fprintf(f, " drm = %i.%i.%i\n", info->drm_major, info->drm_minor, info->drm_patchlevel); + fprintf(f, " has_userptr = %i\n", info->has_userptr); ++ fprintf(f, " has_syncobj = %u\n", info->has_syncobj); + fprintf(f, " has_timeline_syncobj = %u\n", info->has_timeline_syncobj); ++ fprintf(f, " has_fence_to_handle = %u\n", info->has_fence_to_handle); + fprintf(f, " has_local_buffers = %u\n", info->has_local_buffers); + fprintf(f, " has_bo_metadata = %u\n", info->has_bo_metadata); + fprintf(f, " has_eqaa_surface_allocator = %u\n", info->has_eqaa_surface_allocator); +diff --git a/src/amd/common/ac_gpu_info.h b/src/amd/common/ac_gpu_info.h +index 68fbe909a97..40670d87770 100644 +--- a/src/amd/common/ac_gpu_info.h ++++ b/src/amd/common/ac_gpu_info.h +@@ -218,7 +218,9 @@ struct radeon_info { + uint32_t max_submitted_ibs[AMD_NUM_IP_TYPES]; + bool is_amdgpu; + bool has_userptr; ++ bool has_syncobj; + bool has_timeline_syncobj; ++ bool has_fence_to_handle; + bool has_local_buffers; + bool has_bo_metadata; + bool has_eqaa_surface_allocator; +diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c +index aaa171a07ed..5a10aad5907 100644 +--- a/src/gallium/drivers/r600/r600_pipe_common.c ++++ b/src/gallium/drivers/r600/r600_pipe_common.c +@@ -1338,6 +1338,7 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen, + printf("drm = %i.%i.%i\n", rscreen->info.drm_major, + rscreen->info.drm_minor, rscreen->info.drm_patchlevel); + printf("has_userptr = %i\n", rscreen->info.has_userptr); ++ printf("has_syncobj = %u\n", rscreen->info.has_syncobj); + + printf("r600_max_quad_pipes = %i\n", rscreen->info.r600_max_quad_pipes); + printf("max_gpu_freq_mhz = %i\n", rscreen->info.max_gpu_freq_mhz); +diff --git a/src/gallium/drivers/radeonsi/si_fence.c b/src/gallium/drivers/radeonsi/si_fence.c +index a1ae9125e00..1d2406df9fd 100644 +--- a/src/gallium/drivers/radeonsi/si_fence.c ++++ b/src/gallium/drivers/radeonsi/si_fence.c +@@ -374,10 +374,16 @@ static void si_create_fence_fd(struct pipe_context *ctx, struct pipe_fence_handl + + switch (type) { + case PIPE_FD_TYPE_NATIVE_SYNC: ++ if (!sscreen->info.has_fence_to_handle) ++ goto finish; ++ + sfence->gfx = ws->fence_import_sync_file(ws, fd); + break; + + case PIPE_FD_TYPE_SYNCOBJ: ++ if (!sscreen->info.has_syncobj) ++ goto finish; ++ + sfence->gfx = ws->fence_import_syncobj(ws, fd); + break; + +@@ -385,6 +391,7 @@ static void si_create_fence_fd(struct pipe_context *ctx, struct pipe_fence_handl + unreachable("bad fence fd type when importing"); + } + ++finish: + if (!sfence->gfx) { + FREE(sfence); + return; +@@ -400,6 +407,9 @@ static int si_fence_get_fd(struct pipe_screen *screen, struct pipe_fence_handle + struct si_fence *sfence = (struct si_fence *)fence; + int gfx_fd = -1; + ++ if (!sscreen->info.has_fence_to_handle) ++ return -1; ++ + util_queue_fence_wait(&sfence->ready); + + /* Deferred fences aren't supported. */ +diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c +index a9ac90dca52..3c8a75e9583 100644 +--- a/src/gallium/drivers/radeonsi/si_get.c ++++ b/src/gallium/drivers/radeonsi/si_get.c +@@ -168,8 +168,6 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) + case PIPE_CAP_ALLOW_GLTHREAD_BUFFER_SUBDATA_OPT: /* TODO: remove if it's slow */ + case PIPE_CAP_NULL_TEXTURES: + case PIPE_CAP_HAS_CONST_BW: +- case PIPE_CAP_FENCE_SIGNAL: +- case PIPE_CAP_NATIVE_FENCE_FD: + case PIPE_CAP_CL_GL_SHARING: + return 1; + +@@ -287,9 +285,15 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) + PIPE_CONTEXT_PRIORITY_MEDIUM | + PIPE_CONTEXT_PRIORITY_HIGH; + ++ case PIPE_CAP_FENCE_SIGNAL: ++ return sscreen->info.has_syncobj; ++ + case PIPE_CAP_CONSTBUF0_FLAGS: + return SI_RESOURCE_FLAG_32BIT; + ++ case PIPE_CAP_NATIVE_FENCE_FD: ++ return sscreen->info.has_fence_to_handle; ++ + case PIPE_CAP_DRAW_PARAMETERS: + case PIPE_CAP_MULTI_DRAW_INDIRECT: + case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: +-- +2.45.2 + diff --git a/mesa.spec b/mesa.spec index de625f2..4284eb6 100644 --- a/mesa.spec +++ b/mesa.spec @@ -81,6 +81,7 @@ Patch: gnome-shell-glthread-disable.patch Patch: fix-egl-on-s390x.patch %endif Patch: 0001-llvmpipe-Init-eglQueryDmaBufModifiersEXT-num_modifie.patch +Patch: 0001-Revert-ac-radeonsi-remove-has_syncobj-has_fence_to_h.patch BuildRequires: meson >= 1.3.0 BuildRequires: gcc