diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index 810cb0c0..84f4b806 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -180,6 +180,7 @@ enum vkd3d_shader_interface_flag VKD3D_SHADER_INTERFACE_BINDLESS_CBV_AS_STORAGE_BUFFER = 0x00000002u, VKD3D_SHADER_INTERFACE_SSBO_OFFSET_BUFFER = 0x00000004u, VKD3D_SHADER_INTERFACE_TYPED_OFFSET_BUFFER = 0x00000008u, + VKD3D_SHADER_INTERFACE_DESCRIPTOR_QA_BUFFER = 0x00000010u }; struct vkd3d_shader_interface_info @@ -199,6 +200,11 @@ struct vkd3d_shader_interface_info /* Ignored unless VKD3D_SHADER_INTERFACE_SSBO_OFFSET_BUFFER or TYPED_OFFSET_BUFFER is set */ const struct vkd3d_shader_descriptor_binding *offset_buffer_binding; + /* Ignored unless VKD3D_SHADER_INTERFACE_DESCRIPTOR_QA_BUFFER is set. */ + const struct vkd3d_shader_descriptor_binding *descriptor_qa_global_binding; + /* Ignored unless VKD3D_SHADER_INTERFACE_DESCRIPTOR_QA_BUFFER is set. */ + const struct vkd3d_shader_descriptor_binding *descriptor_qa_heap_binding; + VkShaderStageFlagBits stage; const struct vkd3d_shader_transform_feedback_info *xfb_info; diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index faa59995..66b617b6 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -635,6 +635,26 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc, } } + if (shader_interface_info->flags & VKD3D_SHADER_INTERFACE_DESCRIPTOR_QA_BUFFER) + { + struct dxil_spv_option_descriptor_qa helper; + helper.base.type = DXIL_SPV_OPTION_DESCRIPTOR_QA; + helper.enabled = DXIL_SPV_TRUE; + helper.version = DXIL_SPV_DESCRIPTOR_QA_INTERFACE_VERSION; + helper.shader_hash = hash; + helper.global_desc_set = shader_interface_info->descriptor_qa_global_binding->set; + helper.global_binding = shader_interface_info->descriptor_qa_global_binding->binding; + helper.heap_desc_set = shader_interface_info->descriptor_qa_heap_binding->set; + helper.heap_binding = shader_interface_info->descriptor_qa_heap_binding->binding; + + if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS) + { + ERR("dxil-spirv does not support DESCRIPTOR_QA_BUFFER.\n"); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + goto end; + } + } + { const struct dxil_spv_option_bindless_offset_buffer_layout helper = { { DXIL_SPV_OPTION_BINDLESS_OFFSET_BUFFER_LAYOUT }, @@ -1027,6 +1047,26 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil, } } + if (shader_interface_info->flags & VKD3D_SHADER_INTERFACE_DESCRIPTOR_QA_BUFFER) + { + struct dxil_spv_option_descriptor_qa helper; + helper.base.type = DXIL_SPV_OPTION_DESCRIPTOR_QA; + helper.enabled = DXIL_SPV_TRUE; + helper.version = DXIL_SPV_DESCRIPTOR_QA_INTERFACE_VERSION; + helper.shader_hash = hash; + helper.global_desc_set = shader_interface_info->descriptor_qa_global_binding->set; + helper.global_binding = shader_interface_info->descriptor_qa_global_binding->binding; + helper.heap_desc_set = shader_interface_info->descriptor_qa_heap_binding->set; + helper.heap_binding = shader_interface_info->descriptor_qa_heap_binding->binding; + + if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS) + { + ERR("dxil-spirv does not support DESCRIPTOR_QA_BUFFER.\n"); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + goto end; + } + } + { const struct dxil_spv_option_sbt_descriptor_size_log2 helper = { { DXIL_SPV_OPTION_SBT_DESCRIPTOR_SIZE_LOG2 },