vkd3d: Remove obsolete COLOR -> COMPUTE workaround for Deathloop.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2022-05-31 13:18:38 +02:00
parent 2953ef8688
commit e7f79c4962
4 changed files with 1 additions and 46 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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.

View File

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