From aac6b04f39717f7363071f5500a89bb33e01cb33 Mon Sep 17 00:00:00 2001 From: Antheas Kapenekakis Date: Sat, 15 Mar 2025 16:39:08 +0100 Subject: [PATCH 01/12] [BEGIN] SteamOS Changes -- 2.49.0 From 9fc35e8c53fe7e6c84b7da9ddff3d528f22ea4a9 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Fri, 14 Jan 2022 15:58:45 +0100 Subject: [PATCH 02/12] STEAMOS: radv: min image count override for FH5 Otherwise in combination with the vblank time reservation in gamescope the game could get stuck in low power states. --- src/util/00-radv-defaults.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index aef8b9006cd..2a6b0ec84a4 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -223,5 +223,9 @@ Application bugs worked around in this file: + + + -- 2.49.0 From 09299a2cf516078ce9ed9786a49ea6f957ac6527 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 22 Feb 2024 22:32:45 +0100 Subject: [PATCH 03/12] STEAMOS: Dynamic swapchain override for gamescope limiter for DRI3 only The original patch (from Bas) contained WSI VK support too but it's been removed because the Gamescope WSI layer already handles that. Signed-off-by: Samuel Pitoiset --- .../frontends/dri/loader_dri3_helper.c | 42 ++++++++++++++++++- .../frontends/dri/loader_dri3_helper.h | 1 + 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/gallium/frontends/dri/loader_dri3_helper.c b/src/gallium/frontends/dri/loader_dri3_helper.c index 37970f4fa33..f200f2063a2 100644 --- a/src/gallium/frontends/dri/loader_dri3_helper.c +++ b/src/gallium/frontends/dri/loader_dri3_helper.c @@ -297,6 +297,30 @@ dri3_update_max_num_back(struct loader_dri3_drawable *draw) } } +static unsigned +gamescope_swapchain_override() +{ + const char *path = getenv("GAMESCOPE_LIMITER_FILE"); + if (!path) + return 0; + + static simple_mtx_t mtx = SIMPLE_MTX_INITIALIZER; + static int fd = -1; + + simple_mtx_lock(&mtx); + if (fd < 0) { + fd = open(path, O_RDONLY); + } + simple_mtx_unlock(&mtx); + + if (fd < 0) + return 0; + + uint32_t override_value = 0; + pread(fd, &override_value, sizeof(override_value), 0); + return override_value; +} + void loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval) { @@ -311,10 +335,12 @@ loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int interval) * PS. changing from value A to B and A < B won't cause swap out of order but * may still gets wrong target_msc value at the beginning. */ - if (draw->swap_interval != interval) + if (draw->orig_swap_interval != interval) loader_dri3_swapbuffer_barrier(draw); - draw->swap_interval = interval; + draw->orig_swap_interval = interval; + if (gamescope_swapchain_override() != 1) + draw->swap_interval = interval; } static void @@ -443,6 +469,12 @@ loader_dri3_drawable_init(xcb_connection_t *conn, draw->swap_interval = dri_get_initial_swap_interval(draw->dri_screen_render_gpu); + draw->orig_swap_interval = draw->swap_interval; + + unsigned gamescope_override = gamescope_swapchain_override(); + if (gamescope_override == 1) + draw->swap_interval = 1; + dri3_update_max_num_back(draw); /* Create a new drawable */ @@ -1085,6 +1117,12 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw, if (draw->type == LOADER_DRI3_DRAWABLE_WINDOW) { dri3_fence_reset(draw->conn, back); + unsigned gamescope_override = gamescope_swapchain_override(); + if (gamescope_override == 1) + draw->swap_interval = 1; + else + draw->swap_interval = draw->orig_swap_interval; + /* Compute when we want the frame shown by taking the last known * successful MSC and adding in a swap interval for each outstanding swap * request. target_msc=divisor=remainder=0 means "Use glXSwapBuffers() diff --git a/src/gallium/frontends/dri/loader_dri3_helper.h b/src/gallium/frontends/dri/loader_dri3_helper.h index 4da19d73090..819a0e548fc 100644 --- a/src/gallium/frontends/dri/loader_dri3_helper.h +++ b/src/gallium/frontends/dri/loader_dri3_helper.h @@ -170,6 +170,7 @@ struct loader_dri3_drawable { bool block_on_depleted_buffers; bool queries_buffer_age; int swap_interval; + int orig_swap_interval; const struct loader_dri3_vtable *vtable; -- 2.49.0 From 379efbce79f2ca73d34ec48b10e28942be3ed1be Mon Sep 17 00:00:00 2001 From: Antheas Kapenekakis Date: Sat, 15 Mar 2025 16:39:25 +0100 Subject: [PATCH 04/12] [BEGIN] SteamOS Backports -- 2.49.0 From a4ac8f2bcd23eb4194adfe41117d4e168ffc6ddd Mon Sep 17 00:00:00 2001 From: Antheas Kapenekakis Date: Sat, 15 Mar 2025 16:39:33 +0100 Subject: [PATCH 05/12] [BEGIN] Our Mesa backports -- 2.49.0 From 7286b058c851688929bd145116c61872d06d81c8 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Mon, 17 Feb 2025 14:55:29 -0800 Subject: [PATCH 06/12] anv: Mark images with format modifiers set as scanout. We currently use the presence of struct WSI_IMAGE_CREATE_INFO_MESA.scanout to mark the BO as scanout, but this only handles the linear case, and fails when drm format modifiers are used. Also handle the case of exportable BO with tiling set to VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT. This fixes the gamescope handling of using vulkan allocated images for scanout. Link: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12633 Signed-off-by: Maarten Lankhorst Signed-off-by: Matthew Schwartz Normalspeak: fixes battlemage iGPUs in gamescope --- src/intel/vulkan/anv_device.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 0fb86e9d846..de37994d324 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1566,6 +1566,9 @@ VkResult anv_AllocateMemory( dedicated_info->image != VK_NULL_HANDLE) { ANV_FROM_HANDLE(anv_image, image, dedicated_info->image); + if (image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) + alloc_flags |= ANV_BO_ALLOC_SCANOUT; + /* Apply implicit sync to be compatible with clients relying on * implicit fencing. This matches the behavior in iris i915_batch * submit. An example client is VA-API (iHD), so only dedicated -- 2.49.0 From 643137e1f57b1c89451a77edec40565e6084e2e1 Mon Sep 17 00:00:00 2001 From: Antheas Kapenekakis Date: Mon, 24 Mar 2025 19:50:51 +0100 Subject: [PATCH 07/12] Revert "winsys/amdgpu: use VM_ALWAYS_VALID for all VRAM and GTT allocations" This reverts commit 8c91624614c1f939974fe0d2d1a3baf83335cecb. Messes with AutoVRAM, who would have thought? --- src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c index dfefc468bca..cc0719a1898 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c @@ -618,11 +618,6 @@ static struct amdgpu_winsys_bo *amdgpu_create_bo(struct amdgpu_winsys *aws, if (flags & RADEON_FLAG_GTT_WC) request.flags |= AMDGPU_GEM_CREATE_CPU_GTT_USWC; - if (aws->info.has_local_buffers && - initial_domain & (RADEON_DOMAIN_VRAM_GTT | RADEON_DOMAIN_DOORBELL) && - flags & RADEON_FLAG_NO_INTERPROCESS_SHARING) - request.flags |= AMDGPU_GEM_CREATE_VM_ALWAYS_VALID; - if (flags & RADEON_FLAG_DISCARDABLE && aws->info.drm_minor >= 47) request.flags |= AMDGPU_GEM_CREATE_DISCARDABLE; -- 2.49.0 From e38d54fb349d78b10ca5000add7cd97bf921323a Mon Sep 17 00:00:00 2001 From: Antheas Kapenekakis Date: Wed, 7 May 2025 18:50:48 +0200 Subject: [PATCH 08/12] [BEGIN] Intel DX12 fix -- 2.49.0 From cb2c3290e03518f90e13e83f68edea63c9c6c0cf Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Sun, 18 May 2025 09:40:01 -0700 Subject: [PATCH 09/12] [BEGIN] Proton-GE Patches -- 2.49.0 From 24d4a18ec695dbdc4fba33eee941dcca49a9a106 Mon Sep 17 00:00:00 2001 From: Kyle Gospodnetich Date: Sun, 18 May 2025 09:41:21 -0700 Subject: [PATCH 10/12] radv,driconf: Add radv_force_64k_sparse_alignment config --- src/amd/vulkan/radv_buffer.c | 6 +++++- src/amd/vulkan/radv_instance.c | 3 +++ src/amd/vulkan/radv_instance.h | 1 + src/util/00-radv-defaults.conf | 7 +++++++ src/util/driconf.h | 3 +++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_buffer.c b/src/amd/vulkan/radv_buffer.c index 88111750517..8ef575f8246 100644 --- a/src/amd/vulkan/radv_buffer.c +++ b/src/amd/vulkan/radv_buffer.c @@ -167,6 +167,7 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz VkBufferUsageFlags2 usage, VkMemoryRequirements2 *pMemoryRequirements) { const struct radv_physical_device *pdev = radv_device_physical(device); + const struct radv_instance *instance = radv_physical_device_instance(pdev); pMemoryRequirements->memoryRequirements.memoryTypeBits = ((1u << pdev->memory_properties.memoryTypeCount) - 1u) & ~pdev->memory_types_32bit; @@ -179,7 +180,10 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz pMemoryRequirements->memoryRequirements.memoryTypeBits = pdev->memory_types_32bit; if (flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) { - pMemoryRequirements->memoryRequirements.alignment = 4096; + if (instance->drirc.force_64k_sparse_alignment) + pMemoryRequirements->memoryRequirements.alignment = 65536; + else + pMemoryRequirements->memoryRequirements.alignment = 4096; } else { if (usage & VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT) pMemoryRequirements->memoryRequirements.alignment = radv_dgc_get_buffer_alignment(device); diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 7aebf073dfd..15a3f710502 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -194,6 +194,7 @@ static const driOptionDescription radv_dri_options[] = { DRI_CONF_RADV_APP_LAYER() DRI_CONF_RADV_EMULATE_RT(false) DRI_CONF_RADV_ENABLE_FLOAT16_GFX8(false) + DRI_CONF_RADV_FORCE_64K_SPARSE_ALIGNMENT(false) DRI_CONF_SECTION_END }; // clang-format on @@ -298,6 +299,8 @@ radv_init_dri_options(struct radv_instance *instance) instance->drirc.emulate_rt = driQueryOptionb(&instance->drirc.options, "radv_emulate_rt"); instance->drirc.expose_float16_gfx8 = driQueryOptionb(&instance->drirc.options, "radv_enable_float16_gfx8"); + + instance->drirc.force_64k_sparse_alignment = driQueryOptionb(&instance->drirc.options, "radv_force_64k_sparse_alignment"); } static const struct vk_instance_extension_table radv_instance_extensions_supported = { diff --git a/src/amd/vulkan/radv_instance.h b/src/amd/vulkan/radv_instance.h index d0f23404285..81c4921222e 100644 --- a/src/amd/vulkan/radv_instance.h +++ b/src/amd/vulkan/radv_instance.h @@ -74,6 +74,7 @@ struct radv_instance { bool lower_terminate_to_discard; bool emulate_rt; bool expose_float16_gfx8; + bool force_64k_sparse_alignment; char *app_layer; uint8_t override_graphics_shader_version; uint8_t override_compute_shader_version; diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index 2a6b0ec84a4..595a435802f 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -123,6 +123,13 @@ Application bugs worked around in this file: