From e7f79c4962b0db66819ebf241a89a86c84d9a47c Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Tue, 31 May 2022 13:18:38 +0200 Subject: [PATCH] vkd3d: Remove obsolete COLOR -> COMPUTE workaround for Deathloop. Signed-off-by: Hans-Kristian Arntzen --- include/vkd3d.h | 1 - libs/vkd3d/command.c | 34 ---------------------------------- libs/vkd3d/device.c | 4 +--- libs/vkd3d/vkd3d_private.h | 8 -------- 4 files changed, 1 insertion(+), 46 deletions(-) diff --git a/include/vkd3d.h b/include/vkd3d.h index cd388e4f..b6e71b67 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -77,7 +77,6 @@ enum vkd3d_config_flags VKD3D_CONFIG_FLAG_FORCE_HOST_CACHED = 0x00002000, VKD3D_CONFIG_FLAG_DXR11 = 0x00004000, VKD3D_CONFIG_FLAG_FORCE_NO_INVARIANT_POSITION = 0x00008000, - VKD3D_CONFIG_FLAG_WORKAROUND_MISSING_COLOR_COMPUTE_BARRIERS = 0x00010000, VKD3D_CONFIG_FLAG_GLOBAL_PIPELINE_CACHE = 0x00020000, VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_NO_SERIALIZE_SPIRV = 0x00040000, VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_SANITIZE_SPIRV = 0x00080000, diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index cc3c236d..cd63835c 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -3024,8 +3024,6 @@ static void d3d12_command_list_emit_render_pass_transition(struct d3d12_command_ stage_mask |= new_stages; j++; } - - list->workaround_state.has_pending_color_write = true; } dsv = &list->dsv; @@ -4348,8 +4346,6 @@ static void d3d12_command_list_reset_api_state(struct d3d12_command_list *list, list->cbv_srv_uav_descriptors_view = NULL; list->vrs_image = NULL; - list->workaround_state.has_pending_color_write = false; - ID3D12GraphicsCommandList_SetPipelineState(iface, initial_pipeline_state); } @@ -5527,31 +5523,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_DrawIndexedInstanced(d3d12_comm VKD3D_BREADCRUMB_COMMAND(DRAW_INDEXED); } -static void d3d12_command_list_workaround_handle_missing_color_compute_barriers(struct d3d12_command_list *list) -{ - const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; - VkMemoryBarrier barrier; - - if (list->workaround_state.has_pending_color_write && - (vkd3d_config_flags & VKD3D_CONFIG_FLAG_WORKAROUND_MISSING_COLOR_COMPUTE_BARRIERS)) - { - /* Very specifically, every render pass which writes color sets - * has_pending_color_write = true. - * If we observe a StateBefore == RENDER_TARGET, clear the flag. - * If we come to a plain dispatch with this flag set, - * insert a simple memory barrier. The image will still have wrong layout, - * but this is good enough to workaround the game bug. */ - barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; - barrier.pNext = NULL; - barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 1, &barrier, 0, NULL, 0, NULL)); - list->workaround_state.has_pending_color_write = false; - WARN("Injecting workaround barrier!\n"); - } -} - static void STDMETHODCALLTYPE d3d12_command_list_Dispatch(d3d12_command_list_iface *iface, UINT x, UINT y, UINT z) { @@ -5578,8 +5549,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_Dispatch(d3d12_command_list_ifa return; } - d3d12_command_list_workaround_handle_missing_color_compute_barriers(list); - if (!list->predicate_va) VK_CALL(vkCmdDispatch(list->vk_command_buffer, x, y, z)); else @@ -7151,9 +7120,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(d3d12_command_l VkImageLayout new_layout = VK_IMAGE_LAYOUT_UNDEFINED; uint32_t dsv_decay_mask = 0; - if (transition->StateBefore == D3D12_RESOURCE_STATE_RENDER_TARGET) - list->workaround_state.has_pending_color_write = false; - if (!is_valid_resource_state(transition->StateBefore)) { d3d12_command_list_mark_as_invalid(list, diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 4f64f600..a1e4ca4c 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -492,9 +492,7 @@ struct vkd3d_instance_application_meta static const struct vkd3d_instance_application_meta application_override[] = { /* MSVC fails to compile empty array. */ { VKD3D_STRING_COMPARE_EXACT, "GravityMark.exe", VKD3D_CONFIG_FLAG_FORCE_MINIMUM_SUBGROUP_SIZE, 0 }, - /* The game forgets to do a barrier when going from render pass to compute. */ - { VKD3D_STRING_COMPARE_EXACT, "Deathloop.exe", - VKD3D_CONFIG_FLAG_IGNORE_RTV_HOST_VISIBLE | VKD3D_CONFIG_FLAG_WORKAROUND_MISSING_COLOR_COMPUTE_BARRIERS, 0 }, + { VKD3D_STRING_COMPARE_EXACT, "Deathloop.exe", VKD3D_CONFIG_FLAG_IGNORE_RTV_HOST_VISIBLE, 0 }, /* Shadow of the Tomb Raider (750920). * Invariant workarounds actually cause more issues than they resolve on NV. * RADV already has workarounds by default. diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 23936620..a2311e3e 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -2138,14 +2138,6 @@ struct d3d12_command_list struct d3d12_buffer_copy_tracked_buffer tracked_copy_buffers[VKD3D_BUFFER_COPY_TRACKING_BUFFER_COUNT]; unsigned int tracked_copy_buffer_count; - /* Hackery needed for game workarounds. */ - struct - { - /* Used to keep track of COLOR write -> COMPUTE where game forget to insert barrier - * before the dispatch. */ - bool has_pending_color_write; - } workaround_state; - struct vkd3d_private_store private_store; #ifdef VKD3D_ENABLE_BREADCRUMBS