From d86a9ee0d44138ee80212c962cf95002c82da1b5 Mon Sep 17 00:00:00 2001 From: GloriousEggroll Date: Tue, 3 Mar 2020 00:04:53 -0700 Subject: [PATCH] update to near-stable build --- dxvk | 2 +- .../game-patches/detroit_BH.patch | 22 + .../game-patches/gtav_activation_fix.patch | 20 + .../proton-steam_helper_dont_use_msvcrt.patch | 28 +- .../proton-steam_helper_import_jsoncpp.patch | 20 +- ..._up_vr_paths_in_steam.exe_not_proton.patch | 6 +- game-patches-testing/protonprep.sh | 12 +- .../Support_RS_1.0_Volatile.patch | 565 +++--------------- wine-staging | 2 +- 9 files changed, 159 insertions(+), 518 deletions(-) create mode 100644 game-patches-testing/game-patches/detroit_BH.patch create mode 100644 game-patches-testing/game-patches/gtav_activation_fix.patch diff --git a/dxvk b/dxvk index 1e426cdb0..8c68cf155 160000 --- a/dxvk +++ b/dxvk @@ -1 +1 @@ -Subproject commit 1e426cdb085f5f077753d80d13d8a97c9fbe3894 +Subproject commit 8c68cf1551c963e302bbde5dea15f2febf1fe795 diff --git a/game-patches-testing/game-patches/detroit_BH.patch b/game-patches-testing/game-patches/detroit_BH.patch new file mode 100644 index 000000000..ddd61694d --- /dev/null +++ b/game-patches-testing/game-patches/detroit_BH.patch @@ -0,0 +1,22 @@ +diff --git a/dlls/ntdll/version.c b/dlls/ntdll/version.c +index 61e48f6fbd..cc2b690b61 100644 +--- a/dlls/ntdll/version.c ++++ b/dlls/ntdll/version.c +@@ -482,6 +482,7 @@ void version_init(void) + BOOL got_win_ver = FALSE; + const WCHAR *p, *appname = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer; + WCHAR appversion[MAX_PATH+20]; ++ SYSTEM_BASIC_INFORMATION sbi; + + current_version = &VersionData[WIN7]; + +@@ -547,6 +548,9 @@ done: + user_shared_data->NtMinorVersion = current_version->dwMinorVersion; + user_shared_data->SuiteMask = current_version->wSuiteMask; + ++ virtual_get_system_info(&sbi); ++ user_shared_data->NumberOfPhysicalPages = sbi.MmNumberOfPhysicalPages; ++ + TRACE( "got %d.%d platform %d build %x name %s service pack %d.%d product %d\n", + current_version->dwMajorVersion, current_version->dwMinorVersion, + current_version->dwPlatformId, current_version->dwBuildNumber, diff --git a/game-patches-testing/game-patches/gtav_activation_fix.patch b/game-patches-testing/game-patches/gtav_activation_fix.patch new file mode 100644 index 000000000..a92740bb5 --- /dev/null +++ b/game-patches-testing/game-patches/gtav_activation_fix.patch @@ -0,0 +1,20 @@ +From 66e9185710015fa4eff0677a3cb0bba47f992d78 Mon Sep 17 00:00:00 2001 +From: Tk-Glitch +Date: Tue, 3 Mar 2020 01:20:46 +0100 +Subject: Prevent create_bios_key to run + Workaround for Grand Theft Auto 5 activation timeout since 68a01c8c + + +diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c +--- a/programs/wineboot/wineboot.c ++++ b/programs/wineboot/wineboot.c +@@ -679,9 +679,6 @@ static void create_hardware_registry_keys(void) + RegCloseKey( hkey ); + } + } +- +- create_bios_key( system_key ); +- + RegCloseKey( fpu_key ); + RegCloseKey( cpu_key ); + RegCloseKey( system_key ); diff --git a/game-patches-testing/proton-hotfixes/proton-steam_helper_dont_use_msvcrt.patch b/game-patches-testing/proton-hotfixes/proton-steam_helper_dont_use_msvcrt.patch index 6cd73a5da..879da69bf 100644 --- a/game-patches-testing/proton-hotfixes/proton-steam_helper_dont_use_msvcrt.patch +++ b/game-patches-testing/proton-hotfixes/proton-steam_helper_dont_use_msvcrt.patch @@ -7,32 +7,10 @@ We need access to linux crt functions (like getenv()), so disallow use of msvcrt. Notably, linux crt wchar functions are _not_ compatible with Windows WCHAR strings. --- - build/makefile_base.mak | 3 +-- - steam_helper/steam.cpp | 21 ++++++++++++++++----- - 2 files changed, 17 insertions(+), 7 deletions(-) - -diff --git a/build/makefile_base.mak b/build/makefile_base.mak -index 5ac0fef..15409ec 100644 ---- a/build/makefile_base.mak -+++ b/build/makefile_base.mak -@@ -1127,12 +1127,11 @@ $(STEAMEXE_CONFIGURE_FILES): $(STEAMEXE_SYN) $(MAKEFILE_DEP) | $(STEAMEXE_OBJ) $ - -I"../$(TOOLS_DIR32)"/include/ \ - -I"../$(TOOLS_DIR32)"/include/wine/ \ - -I"../$(TOOLS_DIR32)"/include/wine/windows/ \ -- -I"../$(TOOLS_DIR32)"/include/wine/msvcrt/ \ - -I"../$(SRCDIR)"/lsteamclient/steamworks_sdk_142/ \ - -L"../$(TOOLS_DIR32)"/lib/ \ - -L"../$(TOOLS_DIR32)"/lib/wine/ \ - -L"../$(SRCDIR)"/steam_helper/ \ -- --guiexe ../$(STEAMEXE_SYN) && \ -+ --guiexe --nomsvcrt ../$(STEAMEXE_SYN) && \ - cp ../$(STEAMEXE_SYN)/Makefile . && \ - echo >> ./Makefile 'SRCDIR := ../$(STEAMEXE_SYN)' && \ - echo >> ./Makefile 'vpath % $$(SRCDIR)' && \ -diff --git a/steam_helper/steam.cpp b/steam_helper/steam.cpp +diff --git a/steam.cpp b/steam.cpp index 8e5b977..9dcc891 100644 ---- a/steam_helper/steam.cpp -+++ b/steam_helper/steam.cpp +--- a/steam.cpp ++++ b/steam.cpp @@ -117,9 +117,20 @@ static void setup_steam_registry(void) SteamAPI_Shutdown(); } diff --git a/game-patches-testing/proton-hotfixes/proton-steam_helper_import_jsoncpp.patch b/game-patches-testing/proton-hotfixes/proton-steam_helper_import_jsoncpp.patch index ce083e45f..f6409fb7a 100644 --- a/game-patches-testing/proton-hotfixes/proton-steam_helper_import_jsoncpp.patch +++ b/game-patches-testing/proton-hotfixes/proton-steam_helper_import_jsoncpp.patch @@ -4,19 +4,11 @@ Date: Wed, 26 Feb 2020 10:49:35 -0600 Subject: [PATCH] steam_helper: Import jsoncpp --- - steam_helper/json/json-forwards.h | 284 ++ - steam_helper/json/json.h | 2077 ++++++++++++ - steam_helper/jsoncpp.cpp | 5266 +++++++++++++++++++++++++++++ - 3 files changed, 7627 insertions(+) - create mode 100644 steam_helper/json/json-forwards.h - create mode 100644 steam_helper/json/json.h - create mode 100644 steam_helper/jsoncpp.cpp - -diff --git a/steam_helper/json/json-forwards.h b/steam_helper/json/json-forwards.h +diff --git a/json/json-forwards.h b/json/json-forwards.h new file mode 100644 index 0000000..910c7de --- /dev/null -+++ b/steam_helper/json/json-forwards.h ++++ b/json/json-forwards.h @@ -0,0 +1,284 @@ +/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json-forwards.h" @@ -302,11 +294,11 @@ index 0000000..910c7de + + +#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED -diff --git a/steam_helper/json/json.h b/steam_helper/json/json.h +diff --git a/json/json.h b/json/json.h new file mode 100644 index 0000000..d27f65d --- /dev/null -+++ b/steam_helper/json/json.h ++++ b/json/json.h @@ -0,0 +1,2077 @@ +/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" @@ -2385,11 +2377,11 @@ index 0000000..d27f65d + + +#endif //ifndef JSON_AMALGATED_H_INCLUDED -diff --git a/steam_helper/jsoncpp.cpp b/steam_helper/jsoncpp.cpp +diff --git a/jsoncpp.cpp b/jsoncpp.cpp new file mode 100644 index 0000000..e67d353 --- /dev/null -+++ b/steam_helper/jsoncpp.cpp ++++ b/jsoncpp.cpp @@ -0,0 +1,5266 @@ +/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" diff --git a/game-patches-testing/proton-hotfixes/proton-steam_helper_set_up_vr_paths_in_steam.exe_not_proton.patch b/game-patches-testing/proton-hotfixes/proton-steam_helper_set_up_vr_paths_in_steam.exe_not_proton.patch index b9c0f86f0..d8270153b 100644 --- a/game-patches-testing/proton-hotfixes/proton-steam_helper_set_up_vr_paths_in_steam.exe_not_proton.patch +++ b/game-patches-testing/proton-hotfixes/proton-steam_helper_set_up_vr_paths_in_steam.exe_not_proton.patch @@ -5,10 +5,10 @@ Subject: [PATCH] steam_helper: Set up VR paths in steam.exe, not proton This speeds up game launch times. --- -diff --git a/steam_helper/steam.cpp b/steam_helper/steam.cpp +diff --git a/steam.cpp b/steam.cpp index 9dcc891..f4eb2cb 100644 ---- a/steam_helper/steam.cpp -+++ b/steam_helper/steam.cpp +--- a/steam.cpp ++++ b/steam.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, Valve Corporation diff --git a/game-patches-testing/protonprep.sh b/game-patches-testing/protonprep.sh index 87a38d606..21dd9fa56 100755 --- a/game-patches-testing/protonprep.sh +++ b/game-patches-testing/protonprep.sh @@ -22,8 +22,8 @@ cd vkd3d git reset --hard HEAD git clean -xdf - #WoW anti-flicker patch - disabled - causes metro exodus menu crash - #patch -Np1 < ../game-patches-testing/vkd3d-patches/wow-flicker.patch + #WoW anti-flicker patch + patch -Np1 < ../game-patches-testing/vkd3d-patches/Support_RS_1.0_Volatile.patch cd .. # Valve DXVK patches @@ -84,7 +84,13 @@ patch -Np1 < ../game-patches-testing/game-patches/sword-art-online-gnutls.patch echo "Jedi Fallen Order steam + origin patch" - patch -Np1 < ../game-patches-testing/game-patches/steam-origin-JFO.patch.patch + patch -Np1 < ../game-patches-testing/game-patches/steam-origin-JFO.patch + + echo "gta v activation fix" + patch -Np1 < ../game-patches-testing/game-patches/gtav_activation_fix.patch + + echo "detroit become human patch" + patch -Np1 < ../game-patches-testing/game-patches/detroit_BH.patch echo "origin downloads fix" patch -Np1 < ../game-patches-testing/game-patches/origin-downloads_fix.patch diff --git a/game-patches-testing/vkd3d-patches/Support_RS_1.0_Volatile.patch b/game-patches-testing/vkd3d-patches/Support_RS_1.0_Volatile.patch index 35395f47c..667c2cb2a 100644 --- a/game-patches-testing/vkd3d-patches/Support_RS_1.0_Volatile.patch +++ b/game-patches-testing/vkd3d-patches/Support_RS_1.0_Volatile.patch @@ -1,54 +1,37 @@ +From 5ddbe117eb28ff907c859041cc8dac3fe9f5ea1b Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen -Subject: [PATCH] vkd3d: Support RS 1.0 VOLATILE descriptors. -Message-Id: <20191101133638.6565-1-post@arntzen-software.no> -Date: Fri, 1 Nov 2019 14:36:36 +0100 +Date: Mon, 2 Mar 2020 15:15:04 +0100 +Subject: [PATCH] vkd3d: Implement RS 1.0 volatile descriptors. -Use EXT_descriptor_indexing's UPDATE_AFTER_BIND feature to support -semantics required by RS 1.0 VOLATILE descriptors. We implement this by -deferring all updates of desciptor sets until Submit time. +We need to defer descriptor updates until submission time. -This is fine, as command buffers cannot be executed simultaneously on -D3D12, so at Submit time, we know that the command buffer is not being -executed on the GPU, and updating descriptors for multiple submissions -is correct. - -If EXT_descriptor_indexing is not available, the fallback is the older -method, which matches RS 1.1 STATIC descriptor model. +(Reduced, temporary rebased patch which does not include fallback paths). Signed-off-by: Hans-Kristian Arntzen --- - libs/vkd3d/command.c | 359 +++++++++++++++++++++++++++++-------- - libs/vkd3d/device.c | 20 ++- - libs/vkd3d/state.c | 22 +++ - libs/vkd3d/vkd3d_private.h | 19 +- - tests/d3d12.c | 2 +- - 5 files changed, 339 insertions(+), 83 deletions(-) + libs/vkd3d/command.c | 82 ++++++++++++++++++++++++++++---------- + libs/vkd3d/state.c | 25 ++++++++++++ + libs/vkd3d/vkd3d_private.h | 12 ++++++ + tests/d3d12.c | 2 +- + 4 files changed, 98 insertions(+), 23 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c -index 8a7ff66..4c8efeb 100644 +index f6f0b4c..082e7da 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c -@@ -1341,7 +1341,7 @@ static VkDescriptorPool d3d12_command_allocator_allocate_descriptor_pool( +@@ -1341,7 +1341,10 @@ static VkDescriptorPool d3d12_command_allocator_allocate_descriptor_pool( { pool_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; pool_desc.pNext = NULL; - pool_desc.flags = 0; -+ pool_desc.flags = device->vk_info.EXT_descriptor_indexing ? VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT : 0; ++ /* Relies on VK_EXT_descriptor_indexing. ++ * For a correct implementation of RS 1.0 there isn't much we can do here if implementation does not support it. ++ * We would have to update before bind and pray. */ ++ pool_desc.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT; pool_desc.maxSets = 512; pool_desc.poolSizeCount = ARRAY_SIZE(pool_sizes); pool_desc.pPoolSizes = pool_sizes; -@@ -1865,6 +1865,10 @@ static void d3d12_command_list_invalidate_bindings(struct d3d12_command_list *li - if (!state) - return; - -+ /* Each pipeline state has its own set layout for UAV counters -+ * based on their implicit usage in the shader. -+ * Binding a different pipeline state means having to re-remit -+ * UAV counters in a new descriptor set (and layout). */ - if (state->uav_counter_mask) - { - struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[state->vk_bind_point]; -@@ -2210,6 +2214,7 @@ static ULONG STDMETHODCALLTYPE d3d12_command_list_Release(ID3D12GraphicsCommandL +@@ -2204,6 +2207,7 @@ static ULONG STDMETHODCALLTYPE d3d12_command_list_Release(ID3D12GraphicsCommandL if (list->allocator) d3d12_command_allocator_free_command_buffer(list->allocator, list); @@ -56,88 +39,30 @@ index 8a7ff66..4c8efeb 100644 vkd3d_free(list); d3d12_device_release(device); -@@ -2348,6 +2353,9 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list, +@@ -2342,6 +2346,8 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list, list->state = NULL; -+ /* Recycle deferred descriptor update memory if possible. */ + list->descriptor_updates_count = 0; + memset(list->so_counter_buffers, 0, sizeof(list->so_counter_buffers)); memset(list->so_counter_buffer_offsets, 0, sizeof(list->so_counter_buffer_offsets)); -@@ -2567,15 +2575,54 @@ static void d3d12_command_list_prepare_descriptors(struct d3d12_command_list *li - * time in between. Thus, the contents must not be altered (overwritten - * by an update command, or freed) between when the command is recorded - * and when the command completes executing on the queue." -+ * -+ * Even if we have descriptor indexing and UPDATE_AFTER_BIND, -+ * we need at the very least a new descriptor set. - */ - bindings->descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator, - root_signature->vk_set_layout); -+ - bindings->in_use = false; - - bindings->descriptor_table_dirty_mask |= bindings->descriptor_table_active_mask & root_signature->descriptor_table_mask; - bindings->push_descriptor_dirty_mask |= bindings->push_descriptor_active_mask & root_signature->push_descriptor_mask; - } - -+static void d3d12_command_list_prepare_uav_counter_descriptors(struct d3d12_command_list *list, -+ VkPipelineBindPoint bind_point) -+{ -+ struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; -+ -+ if (bindings->uav_counter_descriptor_set && !bindings->uav_counter_in_use) -+ return; -+ -+ /* We cannot modify bound descriptor sets. We need a new descriptor set if -+ * we are about to update resource bindings. -+ * -+ * The Vulkan spec says: -+ * -+ * "The descriptor set contents bound by a call to -+ * vkCmdBindDescriptorSets may be consumed during host execution of the -+ * command, or during shader execution of the resulting draws, or any -+ * time in between. Thus, the contents must not be altered (overwritten -+ * by an update command, or freed) between when the command is recorded -+ * and when the command completes executing on the queue." -+ * -+ * Even if we have descriptor indexing and UPDATE_AFTER_BIND, -+ * we need at the very least a new descriptor set. -+ */ -+ -+ if (list->state->uav_counter_mask) -+ { -+ bindings->uav_counter_descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator, -+ list->state->vk_set_layout); -+ } -+ else -+ bindings->uav_counter_descriptor_set = VK_NULL_HANDLE; -+ -+ bindings->uav_counter_in_use = false; -+} -+ - static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_descriptor_write, - VkDescriptorImageInfo *vk_image_info, const struct d3d12_desc *descriptor, - uint32_t descriptor_range_magic, VkDescriptorSet vk_descriptor_set, -@@ -2644,26 +2691,61 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des +@@ -2650,23 +2656,52 @@ static bool vk_write_descriptor_set_from_d3d12_desc(VkWriteDescriptorSet *vk_des return true; } -static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list *list, - VkPipelineBindPoint bind_point, unsigned int index, struct d3d12_desc *base_descriptor) -+static void d3d12_command_list_defer_update_descriptor_table(struct d3d12_command_list *list, -+ VkPipelineBindPoint bind_point, uint64_t table_mask, bool uav) ++static void d3d12_command_list_defer_update_descriptor_tables(struct d3d12_command_list *list, ++ VkPipelineBindPoint bind_point, uint64_t table_mask) { -+ const struct d3d12_desc *base_descriptor; -+ unsigned i; -+ struct d3d12_deferred_descriptor_set_update *update; struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; -- struct VkWriteDescriptorSet descriptor_writes[24], *current_descriptor_write; -- const struct d3d12_root_signature *root_signature = bindings->root_signature; ++ struct d3d12_deferred_descriptor_set_update *update; ++ const struct d3d12_desc *base_descriptor; ++ unsigned int i; + -+ for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); ++i) ++ for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); i++) + { + if (table_mask & ((uint64_t)1 << i)) + { @@ -145,13 +70,12 @@ index 8a7ff66..4c8efeb 100644 + { + vkd3d_array_reserve((void **)&list->descriptor_updates, &list->descriptor_updates_size, + list->descriptor_updates_count + 1, sizeof(*list->descriptor_updates)); -+ update = &list->descriptor_updates[list->descriptor_updates_count]; + ++ update = &list->descriptor_updates[list->descriptor_updates_count]; + update->base_descriptor = base_descriptor; + update->index = i; + update->root_signature = bindings->root_signature; -+ update->descriptor_set = uav ? bindings->uav_counter_descriptor_set : bindings->descriptor_set; -+ update->uav = uav; ++ update->descriptor_set = bindings->descriptor_set; + list->descriptor_updates_count++; + } + else @@ -160,341 +84,100 @@ index 8a7ff66..4c8efeb 100644 + } +} + -+static void d3d12_command_list_resolve_descriptor_table_uav(struct d3d12_command_list *list, -+ const struct d3d12_deferred_descriptor_set_update *update) ++static void d3d12_command_list_resolve_descriptor_table(struct d3d12_command_list *list, ++ const struct d3d12_deferred_descriptor_set_update *update) +{ + struct VkWriteDescriptorSet descriptor_writes[24], *current_descriptor_write; +- const struct d3d12_root_signature *root_signature = bindings->root_signature; + const struct d3d12_root_signature *root_signature = update->root_signature; const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; -- struct VkDescriptorImageInfo image_infos[24], *current_image_info; + struct VkDescriptorImageInfo image_infos[24], *current_image_info; const struct d3d12_root_descriptor_table *descriptor_table; const struct d3d12_root_descriptor_table_range *range; VkDevice vk_device = list->device->vk_device; -- unsigned int i, j, descriptor_count; + unsigned int i, j, descriptor_count; - struct d3d12_desc *descriptor; -- -- descriptor_table = root_signature_get_descriptor_table(root_signature, index); -+ unsigned int i, j; -+ unsigned int uav_counter_count; + const struct d3d12_desc *descriptor; -+ VkWriteDescriptorSet vk_descriptor_writes[VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS]; -+ VkBufferView vk_uav_counter_views[VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS]; -+ VkDescriptorSet vk_descriptor_set; -+ const struct d3d12_desc *base_descriptor = update->base_descriptor; +- descriptor_table = root_signature_get_descriptor_table(root_signature, index); + descriptor_table = root_signature_get_descriptor_table(root_signature, update->index); - descriptor = base_descriptor; -- descriptor_count = 0; -- current_descriptor_write = descriptor_writes; -- current_image_info = image_infos; -+ -+ vk_descriptor_set = update->descriptor_set; -+ if (!vk_descriptor_set) -+ return; -+ -+ /* FIXME: There should be a smarter way than scanning through all the descriptor table ranges for this. */ - for (i = 0; i < descriptor_table->range_count; ++i) - { - range = &descriptor_table->ranges[i]; -@@ -2677,20 +2759,74 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list - { - unsigned int register_idx = range->base_register_idx + j; - -- /* Track UAV counters. */ -+ /* Fish out UAV counters. */ - if (range->descriptor_magic == VKD3D_DESCRIPTOR_MAGIC_UAV -- && register_idx < ARRAY_SIZE(bindings->vk_uav_counter_views)) -+ && register_idx < ARRAY_SIZE(vk_uav_counter_views)) - { - VkBufferView vk_counter_view = descriptor->magic == VKD3D_DESCRIPTOR_MAGIC_UAV -- ? descriptor->u.view->vk_counter_view : VK_NULL_HANDLE; -- if (bindings->vk_uav_counter_views[register_idx] != vk_counter_view) -- bindings->uav_counter_dirty_mask |= 1u << register_idx; -- bindings->vk_uav_counter_views[register_idx] = vk_counter_view; -+ ? descriptor->u.view->vk_counter_view : VK_NULL_HANDLE; -+ vk_uav_counter_views[register_idx] = vk_counter_view; - } -+ } -+ } -+ -+ uav_counter_count = vkd3d_popcount(list->state->uav_counter_mask); -+ assert(uav_counter_count <= ARRAY_SIZE(vk_descriptor_writes)); -+ for (i = 0; i < uav_counter_count; ++i) -+ { -+ const struct vkd3d_shader_uav_counter_binding *uav_counter = &list->state->uav_counters[i]; -+ assert(vk_uav_counter_views[uav_counter->register_index]); -+ -+ vk_descriptor_writes[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; -+ vk_descriptor_writes[i].pNext = NULL; -+ vk_descriptor_writes[i].dstSet = vk_descriptor_set; -+ vk_descriptor_writes[i].dstBinding = uav_counter->binding.binding; -+ vk_descriptor_writes[i].dstArrayElement = 0; -+ vk_descriptor_writes[i].descriptorCount = 1; -+ vk_descriptor_writes[i].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; -+ vk_descriptor_writes[i].pImageInfo = NULL; -+ vk_descriptor_writes[i].pBufferInfo = NULL; -+ vk_descriptor_writes[i].pTexelBufferView = &vk_uav_counter_views[uav_counter->register_index]; -+ } -+ -+ VK_CALL(vkUpdateDescriptorSets(vk_device, uav_counter_count, vk_descriptor_writes, 0, NULL)); -+} -+ -+static void d3d12_command_list_resolve_descriptor_table_normal(struct d3d12_command_list *list, -+ const struct d3d12_deferred_descriptor_set_update *update) -+{ -+ const struct d3d12_root_descriptor_table *descriptor_table; -+ struct VkWriteDescriptorSet descriptor_writes[24], *current_descriptor_write; -+ struct VkDescriptorImageInfo image_infos[24], *current_image_info; -+ const struct d3d12_root_signature *root_signature = update->root_signature; -+ const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; -+ const struct d3d12_root_descriptor_table_range *range; -+ VkDevice vk_device = list->device->vk_device; -+ unsigned int i, j, descriptor_count; -+ const struct d3d12_desc *descriptor; -+ const struct d3d12_desc *base_descriptor = update->base_descriptor; -+ -+ descriptor_table = root_signature_get_descriptor_table(root_signature, update->index); -+ +- descriptor = base_descriptor; + descriptor = update->base_descriptor; -+ descriptor_count = 0; -+ current_descriptor_write = descriptor_writes; -+ current_image_info = image_infos; -+ for (i = 0; i < descriptor_table->range_count; ++i) -+ { -+ range = &descriptor_table->ranges[i]; -+ -+ if (range->offset != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) -+ { -+ descriptor = base_descriptor + range->offset; -+ } -+ -+ for (j = 0; j < range->descriptor_count; ++j, ++descriptor) -+ { + descriptor_count = 0; + current_descriptor_write = descriptor_writes; + current_image_info = image_infos; +@@ -2676,14 +2711,14 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list + + if (range->offset != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) + { +- descriptor = base_descriptor + range->offset; ++ descriptor = update->base_descriptor + range->offset; + } + + for (j = 0; j < range->descriptor_count; ++j, ++descriptor) + { if (!vk_write_descriptor_set_from_d3d12_desc(current_descriptor_write, -- current_image_info, descriptor, range->descriptor_magic, -- bindings->descriptor_set, range->binding, j)) -+ current_image_info, descriptor, range->descriptor_magic, -+ update->descriptor_set, range->binding, j)) + current_image_info, descriptor, range->descriptor_magic, +- bindings->descriptor_set, range->binding, j, false)) ++ update->descriptor_set, range->binding, j, false)) continue; ++descriptor_count; -@@ -2710,6 +2846,52 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list +@@ -2692,7 +2727,7 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list + + if (vk_write_descriptor_set_from_d3d12_desc(current_descriptor_write, + current_image_info, descriptor, range->descriptor_magic, +- bindings->descriptor_set, range->binding, j, true)) ++ update->descriptor_set, range->binding, j, true)) + { + ++descriptor_count; + ++current_descriptor_write; +@@ -2714,6 +2749,13 @@ static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list VK_CALL(vkUpdateDescriptorSets(vk_device, descriptor_count, descriptor_writes, 0, NULL)); } -+static void d3d12_command_list_resolve_descriptor_table(struct d3d12_command_list *list, -+ const struct d3d12_deferred_descriptor_set_update *update) -+{ -+ if (update->uav) -+ d3d12_command_list_resolve_descriptor_table_uav(list, update); -+ else -+ d3d12_command_list_resolve_descriptor_table_normal(list, update); -+} -+ +static void d3d12_command_list_resolve_descriptor_tables(struct d3d12_command_list *list) +{ -+ unsigned i; ++ unsigned int i; + for (i = 0; i < list->descriptor_updates_count; i++) + d3d12_command_list_resolve_descriptor_table(list, &list->descriptor_updates[i]); +} -+ -+static void d3d12_command_list_update_descriptor_table(struct d3d12_command_list *list, -+ VkPipelineBindPoint bind_point, unsigned int index, struct d3d12_desc *base_descriptor) -+{ -+ struct d3d12_deferred_descriptor_set_update update; -+ struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; -+ const struct d3d12_root_signature *root_signature = bindings->root_signature; -+ -+ update.descriptor_set = bindings->descriptor_set; -+ update.index = index; -+ update.root_signature = root_signature; -+ update.base_descriptor = base_descriptor; -+ update.uav = false; -+ d3d12_command_list_resolve_descriptor_table_normal(list, &update); -+} -+ -+static void d3d12_command_list_update_uav_counter_descriptor_table(struct d3d12_command_list *list, -+ VkPipelineBindPoint bind_point, unsigned int index, struct d3d12_desc *base_descriptor) -+{ -+ struct d3d12_deferred_descriptor_set_update update; -+ struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; -+ const struct d3d12_root_signature *root_signature = bindings->root_signature; -+ -+ update.descriptor_set = bindings->uav_counter_descriptor_set; -+ update.index = index; -+ update.root_signature = root_signature; -+ update.base_descriptor = base_descriptor; -+ update.uav = true; -+ d3d12_command_list_resolve_descriptor_table_uav(list, &update); -+} + static bool vk_write_descriptor_set_from_root_descriptor(VkWriteDescriptorSet *vk_descriptor_write, const struct d3d12_root_parameter *root_parameter, VkDescriptorSet vk_descriptor_set, VkBufferView *vk_buffer_view, const VkDescriptorBufferInfo *vk_buffer_info) -@@ -2814,55 +2996,6 @@ done: - vkd3d_free(buffer_infos); - } - --static void d3d12_command_list_update_uav_counter_descriptors(struct d3d12_command_list *list, -- VkPipelineBindPoint bind_point) --{ -- VkWriteDescriptorSet vk_descriptor_writes[VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS]; -- struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; -- const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; -- const struct d3d12_pipeline_state *state = list->state; -- VkDevice vk_device = list->device->vk_device; -- VkDescriptorSet vk_descriptor_set; -- unsigned int uav_counter_count; +@@ -2824,8 +2866,6 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis + struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point]; + const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs; + const struct d3d12_root_signature *rs = bindings->root_signature; +- struct d3d12_desc *base_descriptor; - unsigned int i; -- -- if (!state || !(state->uav_counter_mask & bindings->uav_counter_dirty_mask)) -- return; -- -- uav_counter_count = vkd3d_popcount(state->uav_counter_mask); -- assert(uav_counter_count <= ARRAY_SIZE(vk_descriptor_writes)); -- -- vk_descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator, state->vk_set_layout); -- if (!vk_descriptor_set) -- return; -- -- for (i = 0; i < uav_counter_count; ++i) -- { -- const struct vkd3d_shader_uav_counter_binding *uav_counter = &state->uav_counters[i]; -- const VkBufferView *vk_uav_counter_views = bindings->vk_uav_counter_views; -- -- assert(vk_uav_counter_views[uav_counter->register_index]); -- -- vk_descriptor_writes[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; -- vk_descriptor_writes[i].pNext = NULL; -- vk_descriptor_writes[i].dstSet = vk_descriptor_set; -- vk_descriptor_writes[i].dstBinding = uav_counter->binding.binding; -- vk_descriptor_writes[i].dstArrayElement = 0; -- vk_descriptor_writes[i].descriptorCount = 1; -- vk_descriptor_writes[i].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; -- vk_descriptor_writes[i].pImageInfo = NULL; -- vk_descriptor_writes[i].pBufferInfo = NULL; -- vk_descriptor_writes[i].pTexelBufferView = &vk_uav_counter_views[uav_counter->register_index]; -- } -- -- VK_CALL(vkUpdateDescriptorSets(vk_device, uav_counter_count, vk_descriptor_writes, 0, NULL)); -- -- VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point, -- state->vk_pipeline_layout, state->set_index, 1, &vk_descriptor_set, 0, NULL)); -- -- bindings->uav_counter_dirty_mask = 0; --} -- - static void d3d12_command_list_update_descriptors(struct d3d12_command_list *list, - VkPipelineBindPoint bind_point) - { -@@ -2875,31 +3008,86 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis + if (!rs || !rs->vk_set_layout) return; - -+ if ((bindings->descriptor_table_active_mask | bindings->push_descriptor_dirty_mask | -+ (list->state->uav_counter_mask & bindings->uav_counter_dirty_mask)) == 0) -+ { -+ /* Nothing is dirty, so just return early. */ -+ return; -+ } -+ +@@ -2833,16 +2873,10 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis if (bindings->descriptor_table_dirty_mask || bindings->push_descriptor_dirty_mask) d3d12_command_list_prepare_descriptors(list, bind_point); -+ if (list->state->uav_counter_mask & bindings->uav_counter_dirty_mask) -+ d3d12_command_list_prepare_uav_counter_descriptors(list, bind_point); - for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); ++i) -+ if (list->device->vk_info.EXT_descriptor_indexing) -+ { -+ d3d12_command_list_defer_update_descriptor_table(list, bind_point, bindings->descriptor_table_dirty_mask, -+ false); -+ } -+ else - { +- { - if (bindings->descriptor_table_dirty_mask & ((uint64_t)1 << i)) -+ /* FIXME: FOR_EACH_BIT */ -+ for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); ++i) - { +- { - if ((base_descriptor = d3d12_desc_from_gpu_handle(bindings->descriptor_tables[i]))) - d3d12_command_list_update_descriptor_table(list, bind_point, i, base_descriptor); - else - WARN("Descriptor table %u is not set.\n", i); -+ if (bindings->descriptor_table_dirty_mask & ((uint64_t) 1 << i)) -+ { -+ if ((base_descriptor = d3d12_desc_from_gpu_handle(bindings->descriptor_tables[i]))) -+ d3d12_command_list_update_descriptor_table(list, bind_point, i, base_descriptor); -+ else -+ WARN("Descriptor table %u is not set.\n", i); -+ } - } - } +- } +- } ++ /* Relies on VK_EXT_descriptor_indexing. This is required from a RS 1.0 POV since games ++ * might not update their descriptors before they draw, or they might only update descriptors just-in-time for ++ * when the descriptor is actually used by a draw call within the root signature. WoW DX12 is an example here. */ ++ d3d12_command_list_defer_update_descriptor_tables(list, bind_point, bindings->descriptor_table_dirty_mask); bindings->descriptor_table_dirty_mask = 0; -+ /* Need to go through all descriptor tables here in the root signature, -+ * not just descriptor_table_dirty_mask. Binding a different shader may not invalidate descriptor tables, -+ * but it may invalidate the UAV counter set. */ -+ if (bindings->uav_counter_dirty_mask) -+ { -+ if (list->device->vk_info.EXT_descriptor_indexing) -+ { -+ d3d12_command_list_defer_update_descriptor_table(list, bind_point, bindings->descriptor_table_active_mask, -+ true); -+ } -+ else -+ { -+ /* FIXME: FOR_EACH_BIT */ -+ for (i = 0; i < ARRAY_SIZE(bindings->descriptor_tables); i++) -+ { -+ if (bindings->descriptor_table_active_mask & ((uint64_t) 1 << i)) -+ { -+ if ((base_descriptor = d3d12_desc_from_gpu_handle(bindings->descriptor_tables[i]))) -+ d3d12_command_list_update_uav_counter_descriptor_table(list, bind_point, i, base_descriptor); -+ else -+ WARN("Descriptor table %u is not set.\n", i); -+ } -+ } -+ } -+ } -+ bindings->uav_counter_dirty_mask = 0; -+ d3d12_command_list_update_push_descriptors(list, bind_point); - -- if (bindings->descriptor_set) -+ /* Don't rebind the same descriptor set as long as we're in same pipeline layout. */ -+ if (bindings->descriptor_set && bindings->descriptor_set != bindings->descriptor_set_bound) - { - VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point, - rs->vk_pipeline_layout, rs->main_set, 1, &bindings->descriptor_set, 0, NULL)); - bindings->in_use = true; -+ bindings->descriptor_set_bound = bindings->descriptor_set; - } - -- d3d12_command_list_update_uav_counter_descriptors(list, bind_point); -+ /* Don't rebind the same descriptor set as long as we're in same pipeline layout. */ -+ if (bindings->uav_counter_descriptor_set && -+ bindings->uav_counter_descriptor_set != bindings->uav_counter_descriptor_set_bound) -+ { -+ VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bind_point, -+ list->state->vk_pipeline_layout, list->state->set_index, 1, &bindings->uav_counter_descriptor_set, 0, NULL)); -+ bindings->uav_counter_in_use = true; -+ bindings->uav_counter_descriptor_set_bound = bindings->uav_counter_descriptor_set; -+ } - } - - static bool d3d12_command_list_update_compute_state(struct d3d12_command_list *list) -@@ -4055,6 +4243,11 @@ static void d3d12_command_list_set_root_signature(struct d3d12_command_list *lis - bindings->root_signature = root_signature; - - d3d12_command_list_invalidate_root_parameters(list, bind_point); -+ -+ bindings->uav_counter_descriptor_set = VK_NULL_HANDLE; -+ bindings->descriptor_set_bound = VK_NULL_HANDLE; -+ bindings->uav_counter_descriptor_set_bound = VK_NULL_HANDLE; -+ - } - - static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootSignature(ID3D12GraphicsCommandList2 *iface, -@@ -5609,6 +5802,9 @@ static HRESULT d3d12_command_list_init(struct d3d12_command_list *list, struct d +@@ -5564,6 +5598,9 @@ static HRESULT d3d12_command_list_init(struct d3d12_command_list *list, struct d d3d12_device_add_ref(list->device = device); list->allocator = allocator; @@ -504,75 +187,37 @@ index 8a7ff66..4c8efeb 100644 if (SUCCEEDED(hr = d3d12_command_allocator_allocate_command_buffer(allocator, list))) { -@@ -5846,6 +6042,13 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm +@@ -5801,6 +5838,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm return; } -+ /* Descriptors in root signature in 1.0 are VOLATILE by default, so -+ * the descriptor heap only need to be valid right before we submit them to the GPU. -+ * If we have EXT_descriptor_indexing enabled with UpdateAfterBind, we update -+ * descriptor sets here rather than while we're recording the command buffer. -+ * For each submission of the command buffer, we can modify the descriptor heap as we please. */ + d3d12_command_list_resolve_descriptor_tables(cmd_list); -+ buffers[i] = cmd_list->vk_command_buffer; } -diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c -index 757d4ac..eb79c4d 100644 ---- a/libs/vkd3d/device.c -+++ b/libs/vkd3d/device.c -@@ -1436,11 +1436,25 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device, - } - - if (vulkan_info->EXT_descriptor_indexing && descriptor_indexing -- && (descriptor_indexing->descriptorBindingUniformBufferUpdateAfterBind -- || descriptor_indexing->descriptorBindingStorageBufferUpdateAfterBind -+ && descriptor_indexing->descriptorBindingUniformBufferUpdateAfterBind -+ && descriptor_indexing->descriptorBindingSampledImageUpdateAfterBind -+ && descriptor_indexing->descriptorBindingStorageImageUpdateAfterBind -+ && descriptor_indexing->descriptorBindingUniformTexelBufferUpdateAfterBind) -+ { -+ TRACE("Enabling VK_EXT_descriptor_indexing for volatile descriptor updates.\n"); -+ } -+ else -+ { -+ WARN("VK_EXT_descriptor indexing not supported in sufficient capacity. Volatile descriptor updates will not work.\n"); -+ vulkan_info->EXT_descriptor_indexing = false; -+ } -+ -+ if (vulkan_info->EXT_descriptor_indexing && descriptor_indexing -+ && (descriptor_indexing->descriptorBindingUniformBufferUpdateAfterBind - || descriptor_indexing->descriptorBindingUniformTexelBufferUpdateAfterBind -+ || descriptor_indexing->descriptorBindingStorageBufferUpdateAfterBind - || descriptor_indexing->descriptorBindingStorageTexelBufferUpdateAfterBind) -- && !physical_device_info->descriptor_indexing_properties.robustBufferAccessUpdateAfterBind) -+ && !physical_device_info->descriptor_indexing_properties.robustBufferAccessUpdateAfterBind) - { - WARN("Disabling robust buffer access for the update after bind feature.\n"); - features->robustBufferAccess = VK_FALSE; diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c -index e1f7da9..ac4a593 100644 +index 6599831..c555f20 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c -@@ -746,21 +746,43 @@ static HRESULT vkd3d_create_descriptor_set_layout(struct d3d12_device *device, - VkDescriptorSetLayoutCreateFlags flags, unsigned int binding_count, +@@ -747,7 +747,10 @@ static HRESULT vkd3d_create_descriptor_set_layout(struct d3d12_device *device, const VkDescriptorSetLayoutBinding *bindings, VkDescriptorSetLayout *set_layout) { -+ unsigned int i; const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; - VkDescriptorSetLayoutCreateInfo set_desc; - VkResult vr; + VkDescriptorSetLayoutBindingFlagsCreateInfoEXT flags_info; + VkDescriptorBindingFlagsEXT *binding_flags = NULL; + VkDescriptorSetLayoutCreateInfo set_desc; ++ unsigned int i; + VkResult vr; set_desc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - set_desc.pNext = NULL; +@@ -755,12 +758,34 @@ static HRESULT vkd3d_create_descriptor_set_layout(struct d3d12_device *device, set_desc.flags = flags; set_desc.bindingCount = binding_count; set_desc.pBindings = bindings; + -+ if (!(flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) && device->vk_info.EXT_descriptor_indexing) ++ /* Relies on VK_EXT_descriptor_indexing. Descriptor table entries must be updated in submit, ++ * not draw time. */ ++ if ((flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) == 0) + { + set_desc.flags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT; + flags_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT; @@ -584,6 +229,7 @@ index e1f7da9..ac4a593 100644 + binding_flags[i] = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT | + VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT; + } ++ + flags_info.pBindingFlags = binding_flags; + set_desc.pNext = &flags_info; + } @@ -600,28 +246,10 @@ index e1f7da9..ac4a593 100644 } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h -index 0c031d2..8b34ca8 100644 +index 096fdd3..b3b10aa 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h -@@ -913,13 +913,16 @@ struct vkd3d_pipeline_bindings - const struct d3d12_root_signature *root_signature; - - VkDescriptorSet descriptor_set; -+ VkDescriptorSet uav_counter_descriptor_set; -+ VkDescriptorSet descriptor_set_bound; -+ VkDescriptorSet uav_counter_descriptor_set_bound; - bool in_use; -+ bool uav_counter_in_use; - - D3D12_GPU_DESCRIPTOR_HANDLE descriptor_tables[D3D12_MAX_ROOT_COST]; - uint64_t descriptor_table_dirty_mask; - uint64_t descriptor_table_active_mask; - -- VkBufferView vk_uav_counter_views[VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS]; - uint8_t uav_counter_dirty_mask; - - /* Needed when VK_KHR_push_descriptor is not available. */ -@@ -928,6 +931,16 @@ struct vkd3d_pipeline_bindings +@@ -921,6 +921,14 @@ struct vkd3d_pipeline_bindings uint32_t push_descriptor_active_mask; }; @@ -629,16 +257,14 @@ index 0c031d2..8b34ca8 100644 +{ + const struct d3d12_desc *base_descriptor; + unsigned int index; -+ + const struct d3d12_root_signature *root_signature; + VkDescriptorSet descriptor_set; -+ bool uav; +}; + /* ID3D12CommandList */ struct d3d12_command_list { -@@ -971,6 +984,10 @@ struct d3d12_command_list +@@ -964,6 +972,10 @@ struct d3d12_command_list VkBuffer so_counter_buffers[D3D12_SO_BUFFER_SLOT_COUNT]; VkDeviceSize so_counter_buffer_offsets[D3D12_SO_BUFFER_SLOT_COUNT]; @@ -650,10 +276,10 @@ index 0c031d2..8b34ca8 100644 }; diff --git a/tests/d3d12.c b/tests/d3d12.c -index 323ef23..4f355b1 100644 +index f1e0122..813f338 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c -@@ -16220,7 +16220,7 @@ static void test_update_descriptor_heap_after_closing_command_list(void) +@@ -16243,7 +16243,7 @@ static void test_update_descriptor_heap_after_closing_command_list(void) D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE); get_texture_readback_with_command_list(context.render_target, 0, &rb, queue, command_list); value = get_readback_uint(&rb, 0, 0, 0); @@ -662,6 +288,3 @@ index 323ef23..4f355b1 100644 release_resource_readback(&rb); ID3D12DescriptorHeap_Release(cpu_heap); --- -2.17.1 - diff --git a/wine-staging b/wine-staging index 2fc5c8806..b4e027748 160000 --- a/wine-staging +++ b/wine-staging @@ -1 +1 @@ -Subproject commit 2fc5c88068e3dea2612c182ff300511aa2954242 +Subproject commit b4e027748836d7debe90c779acf43f492f349b74