protonscr

SOTTR: Bindless CBV fails on NV

vkd3dclosed
HansKristian-Work/vkd3d-proton#41 · opened 2020-03-23 by HansKristian-Work · updated 2020-03-31 · 2 comments · github
HHansKristian-Work 2020-03-23 github

GTX 1660 Ti, driver 440.58.02.

Bindless CBV fails, black screen is rendered, however, forcing SSBO path somehow works, i.e.:

diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index f4f5f05..f7c9cea 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -2894,11 +2894,13 @@ static uint32_t vkd3d_bindless_state_get_bindless_flags(struct d3d12_device *dev
             device_info->descriptor_indexing_features.shaderUniformTexelBufferArrayNonUniformIndexing)
         flags |= VKD3D_BINDLESS_SAMPLER | VKD3D_BINDLESS_SRV;
 
+#if 0
     if (device_info->descriptor_indexing_properties.maxPerStageDescriptorUpdateAfterBindUniformBuffers >= 1000000 &&
             device_info->descriptor_indexing_features.descriptorBindingUniformBufferUpdateAfterBind &&
             device_info->descriptor_indexing_features.shaderUniformBufferArrayNonUniformIndexing)
         flags |= VKD3D_BINDLESS_CBV;
-    else if (device_info->descriptor_indexing_properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 1000000 &&
+#endif
+    if (device_info->descriptor_indexing_properties.maxPerStageDescriptorUpdateAfterBindStorageBuffers >= 1000000 &&
             device_info->descriptor_indexing_features.descriptorBindingStorageBufferUpdateAfterBind &&
             device_info->descriptor_indexing_features.shaderStorageBufferArrayNonUniformIndexing)
         flags |= VKD3D_BINDLESS_CBV | VKD3D_BINDLESS_CBV_AS_SSBO;
HHansKristian-Work maintainer 2020-03-25 github

Found similar issues in Control. For now, we'll probably just force SSBO path for bindless CBV. We found other interesting issues with bindless UBO on NVIDIA, which might be related to this and explain why it works in some games and broken in others.

HHansKristian-Work maintainer 2020-03-31 github

We have SSBO path forced for NV for the time being. Likely linked to a known NV bug with CBV bindless which messes up indexing in some cases.