vkd3d: Remove obsolete COLOR -> COMPUTE workaround for Deathloop.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
parent
2953ef8688
commit
e7f79c4962
|
@ -77,7 +77,6 @@ enum vkd3d_config_flags
|
||||||
VKD3D_CONFIG_FLAG_FORCE_HOST_CACHED = 0x00002000,
|
VKD3D_CONFIG_FLAG_FORCE_HOST_CACHED = 0x00002000,
|
||||||
VKD3D_CONFIG_FLAG_DXR11 = 0x00004000,
|
VKD3D_CONFIG_FLAG_DXR11 = 0x00004000,
|
||||||
VKD3D_CONFIG_FLAG_FORCE_NO_INVARIANT_POSITION = 0x00008000,
|
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_GLOBAL_PIPELINE_CACHE = 0x00020000,
|
||||||
VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_NO_SERIALIZE_SPIRV = 0x00040000,
|
VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_NO_SERIALIZE_SPIRV = 0x00040000,
|
||||||
VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_SANITIZE_SPIRV = 0x00080000,
|
VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_SANITIZE_SPIRV = 0x00080000,
|
||||||
|
|
|
@ -3024,8 +3024,6 @@ static void d3d12_command_list_emit_render_pass_transition(struct d3d12_command_
|
||||||
stage_mask |= new_stages;
|
stage_mask |= new_stages;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
list->workaround_state.has_pending_color_write = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dsv = &list->dsv;
|
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->cbv_srv_uav_descriptors_view = NULL;
|
||||||
list->vrs_image = NULL;
|
list->vrs_image = NULL;
|
||||||
|
|
||||||
list->workaround_state.has_pending_color_write = false;
|
|
||||||
|
|
||||||
ID3D12GraphicsCommandList_SetPipelineState(iface, initial_pipeline_state);
|
ID3D12GraphicsCommandList_SetPipelineState(iface, initial_pipeline_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5527,31 +5523,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_DrawIndexedInstanced(d3d12_comm
|
||||||
VKD3D_BREADCRUMB_COMMAND(DRAW_INDEXED);
|
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,
|
static void STDMETHODCALLTYPE d3d12_command_list_Dispatch(d3d12_command_list_iface *iface,
|
||||||
UINT x, UINT y, UINT z)
|
UINT x, UINT y, UINT z)
|
||||||
{
|
{
|
||||||
|
@ -5578,8 +5549,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_Dispatch(d3d12_command_list_ifa
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
d3d12_command_list_workaround_handle_missing_color_compute_barriers(list);
|
|
||||||
|
|
||||||
if (!list->predicate_va)
|
if (!list->predicate_va)
|
||||||
VK_CALL(vkCmdDispatch(list->vk_command_buffer, x, y, z));
|
VK_CALL(vkCmdDispatch(list->vk_command_buffer, x, y, z));
|
||||||
else
|
else
|
||||||
|
@ -7151,9 +7120,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(d3d12_command_l
|
||||||
VkImageLayout new_layout = VK_IMAGE_LAYOUT_UNDEFINED;
|
VkImageLayout new_layout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
uint32_t dsv_decay_mask = 0;
|
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))
|
if (!is_valid_resource_state(transition->StateBefore))
|
||||||
{
|
{
|
||||||
d3d12_command_list_mark_as_invalid(list,
|
d3d12_command_list_mark_as_invalid(list,
|
||||||
|
|
|
@ -492,9 +492,7 @@ struct vkd3d_instance_application_meta
|
||||||
static const struct vkd3d_instance_application_meta application_override[] = {
|
static const struct vkd3d_instance_application_meta application_override[] = {
|
||||||
/* MSVC fails to compile empty array. */
|
/* MSVC fails to compile empty array. */
|
||||||
{ VKD3D_STRING_COMPARE_EXACT, "GravityMark.exe", VKD3D_CONFIG_FLAG_FORCE_MINIMUM_SUBGROUP_SIZE, 0 },
|
{ 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, 0 },
|
||||||
{ VKD3D_STRING_COMPARE_EXACT, "Deathloop.exe",
|
|
||||||
VKD3D_CONFIG_FLAG_IGNORE_RTV_HOST_VISIBLE | VKD3D_CONFIG_FLAG_WORKAROUND_MISSING_COLOR_COMPUTE_BARRIERS, 0 },
|
|
||||||
/* Shadow of the Tomb Raider (750920).
|
/* Shadow of the Tomb Raider (750920).
|
||||||
* Invariant workarounds actually cause more issues than they resolve on NV.
|
* Invariant workarounds actually cause more issues than they resolve on NV.
|
||||||
* RADV already has workarounds by default.
|
* RADV already has workarounds by default.
|
||||||
|
|
|
@ -2138,14 +2138,6 @@ struct d3d12_command_list
|
||||||
struct d3d12_buffer_copy_tracked_buffer tracked_copy_buffers[VKD3D_BUFFER_COPY_TRACKING_BUFFER_COUNT];
|
struct d3d12_buffer_copy_tracked_buffer tracked_copy_buffers[VKD3D_BUFFER_COPY_TRACKING_BUFFER_COUNT];
|
||||||
unsigned int tracked_copy_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;
|
struct vkd3d_private_store private_store;
|
||||||
|
|
||||||
#ifdef VKD3D_ENABLE_BREADCRUMBS
|
#ifdef VKD3D_ENABLE_BREADCRUMBS
|
||||||
|
|
Loading…
Reference in New Issue