diff --git a/.pick_status.json b/.pick_status.json index 82f1fff92c0..29bb848bcea 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1064,7 +1064,7 @@ "description": "radv: add a workaround for a synchronization bug in Strange Brigade Vulkan", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/vulkan/layers/radv_strange_brigade.c b/src/amd/vulkan/layers/radv_strange_brigade.c new file mode 100644 index 00000000000..8810b9d9a66 --- /dev/null +++ b/src/amd/vulkan/layers/radv_strange_brigade.c @@ -0,0 +1,31 @@ +/* + * Copyright © 2026 Valve Corporation + * + * SPDX-License-Identifier: MIT + */ + +#include "radv_cmd_buffer.h" +#include "radv_device.h" +#include "radv_entrypoints.h" + +VKAPI_ATTR void VKAPI_CALL +strange_brigade_CmdPipelineBarrier2(VkCommandBuffer commandBuffer, const VkDependencyInfo *pDependencyInfo) +{ + VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + + for (uint32_t i = 0; i < pDependencyInfo->imageMemoryBarrierCount; i++) { + VkImageMemoryBarrier2 *barrier = (VkImageMemoryBarrier2 *)&pDependencyInfo->pImageMemoryBarriers[i]; + + if (barrier->newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR && + barrier->srcAccessMask == VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) { + /* This game has a broken barrier right before present that causes rendering issues. Fix it + * by modifying the src access mask. + */ + barrier->srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + break; + } + } + + device->layer_dispatch.app.CmdPipelineBarrier2(commandBuffer, pDependencyInfo); +} diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build index 3a20baca003..3696bad244c 100644 --- a/src/amd/vulkan/meson.build +++ b/src/amd/vulkan/meson.build @@ -22,6 +22,7 @@ radv_entrypoints_gen_command += [ '--device-prefix', 'rage2', '--device-prefix', 'quantic_dream', '--device-prefix', 'no_mans_sky', + '--device-prefix', 'strange_brigade', # Command buffer annotation layer entrypoints '--device-prefix', 'annotate', @@ -42,6 +43,7 @@ libradv_files = files( 'layers/radv_rage2.c', 'layers/radv_quantic_dream.c', 'layers/radv_no_mans_sky.c', + 'layers/radv_strange_brigade.c', 'layers/radv_rmv_layer.c', 'layers/radv_rra_layer.c', 'layers/radv_sqtt_layer.c', diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 42af8959c7c..9ff6aff165d 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -786,6 +786,8 @@ init_dispatch_tables(struct radv_device *device, struct radv_physical_device *pd add_entrypoints(&b, &quantic_dream_device_entrypoints, RADV_APP_DISPATCH_TABLE); } else if (!strcmp(instance->drirc.debug.app_layer, "no_mans_sky")) { add_entrypoints(&b, &no_mans_sky_device_entrypoints, RADV_APP_DISPATCH_TABLE); + } else if (!strcmp(instance->drirc.debug.app_layer, "strange_brigade")) { + add_entrypoints(&b, &strange_brigade_device_entrypoints, RADV_APP_DISPATCH_TABLE); } if (instance->vk.trace_mode & RADV_TRACE_MODE_RGP) diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf index a7832aef9a2..b7dc8812ee1 100644 --- a/src/util/00-radv-defaults.conf +++ b/src/util/00-radv-defaults.conf @@ -227,6 +227,9 @@ Application bugs worked around in this file: