vkd3d: Enable VK_KHR_shader_integer_dot_product.

Accelerates SM 6.4 packed ops if present.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-10-05 14:32:45 +02:00
parent 50d41d8f02
commit cd3d759b95
4 changed files with 47 additions and 2 deletions

View File

@ -287,7 +287,8 @@ enum vkd3d_shader_target_extension
VKD3D_SHADER_TARGET_EXTENSION_NONE,
VKD3D_SHADER_TARGET_EXTENSION_SPV_EXT_DEMOTE_TO_HELPER_INVOCATION,
VKD3D_SHADER_TARGET_EXTENSION_READ_STORAGE_IMAGE_WITHOUT_FORMAT
VKD3D_SHADER_TARGET_EXTENSION_READ_STORAGE_IMAGE_WITHOUT_FORMAT,
VKD3D_SHADER_TARGET_EXTENSION_SPV_KHR_INTEGER_DOT_PRODUCT,
};
enum vkd3d_shader_quirk

View File

@ -703,6 +703,17 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
goto end;
}
}
else if (compiler_args->target_extensions[i] == VKD3D_SHADER_TARGET_EXTENSION_SPV_KHR_INTEGER_DOT_PRODUCT)
{
static const dxil_spv_option_shader_i8_dot helper =
{ { DXIL_SPV_OPTION_SHADER_I8_DOT }, DXIL_SPV_TRUE };
if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS)
{
ERR("dxil-spirv does not support SHADER_I8_DOT.\n");
ret = VKD3D_ERROR_NOT_IMPLEMENTED;
goto end;
}
}
}
if (compiler_args->dual_source_blending)
@ -1129,6 +1140,17 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil,
goto end;
}
}
else if (compiler_args->target_extensions[i] == VKD3D_SHADER_TARGET_EXTENSION_SPV_KHR_INTEGER_DOT_PRODUCT)
{
static const dxil_spv_option_shader_i8_dot helper =
{ { DXIL_SPV_OPTION_SHADER_I8_DOT }, DXIL_SPV_TRUE };
if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS)
{
ERR("dxil-spirv does not support SHADER_I8_DOT.\n");
ret = VKD3D_ERROR_NOT_IMPLEMENTED;
goto end;
}
}
}
}

View File

@ -74,6 +74,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] =
VK_EXTENSION(KHR_CREATE_RENDERPASS_2, KHR_create_renderpass2),
VK_EXTENSION(KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE, KHR_sampler_mirror_clamp_to_edge),
VK_EXTENSION(KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS, KHR_separate_depth_stencil_layouts),
VK_EXTENSION(KHR_SHADER_INTEGER_DOT_PRODUCT, KHR_shader_integer_dot_product),
/* EXT extensions */
VK_EXTENSION(EXT_CALIBRATED_TIMESTAMPS, EXT_calibrated_timestamps),
VK_EXTENSION(EXT_CONDITIONAL_RENDERING, EXT_conditional_rendering),
@ -1181,6 +1182,16 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i
vk_prepend_struct(&info->features2, &info->separate_depth_stencil_layout_features);
}
if (vulkan_info->KHR_shader_integer_dot_product)
{
info->shader_integer_dot_product_features.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR;
info->shader_integer_dot_product_properties.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR;
vk_prepend_struct(&info->features2, &info->shader_integer_dot_product_features);
vk_prepend_struct(&info->properties2, &info->shader_integer_dot_product_properties);
}
/* Core in Vulkan 1.1. */
info->shader_draw_parameters_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES;
vk_prepend_struct(&info->features2, &info->shader_draw_parameters_features);
@ -1687,6 +1698,14 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
VKD3D_SHADER_TARGET_EXTENSION_SPV_EXT_DEMOTE_TO_HELPER_INVOCATION;
}
if (device->device_info.shader_integer_dot_product_features.shaderIntegerDotProduct &&
physical_device_info->shader_integer_dot_product_properties.integerDotProduct4x8BitPackedSignedAccelerated &&
physical_device_info->shader_integer_dot_product_properties.integerDotProduct4x8BitPackedUnsignedAccelerated)
{
vulkan_info->shader_extensions[vulkan_info->shader_extension_count++] =
VKD3D_SHADER_TARGET_EXTENSION_SPV_KHR_INTEGER_DOT_PRODUCT;
}
if (physical_device_info->features2.features.shaderStorageImageReadWithoutFormat)
{
vulkan_info->shader_extensions[vulkan_info->shader_extension_count++] =

View File

@ -49,7 +49,7 @@
#define MAKE_MAGIC(a,b,c,d) (((uint32_t)a) | (((uint32_t)b) << 8) | (((uint32_t)c) << 16) | (((uint32_t)d) << 24))
#define VKD3D_MAX_COMPATIBLE_FORMAT_COUNT 6u
#define VKD3D_MAX_SHADER_EXTENSIONS 2u
#define VKD3D_MAX_SHADER_EXTENSIONS 3u
#define VKD3D_MAX_SHADER_STAGES 5u
#define VKD3D_MAX_VK_SYNC_OBJECTS 4u
@ -122,6 +122,7 @@ struct vkd3d_vulkan_info
bool KHR_create_renderpass2;
bool KHR_sampler_mirror_clamp_to_edge;
bool KHR_separate_depth_stencil_layouts;
bool KHR_shader_integer_dot_product;
/* EXT device extensions */
bool EXT_calibrated_timestamps;
bool EXT_conditional_rendering;
@ -2662,6 +2663,7 @@ struct vkd3d_physical_device_info
VkPhysicalDeviceFloatControlsPropertiesKHR float_control_properties;
VkPhysicalDeviceFragmentShadingRatePropertiesKHR fragment_shading_rate_properties;
VkPhysicalDeviceConservativeRasterizationPropertiesEXT conservative_rasterization_properties;
VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR shader_integer_dot_product_properties;
VkPhysicalDeviceProperties2KHR properties2;
@ -2690,6 +2692,7 @@ struct vkd3d_physical_device_info
VkPhysicalDeviceShaderDrawParametersFeatures shader_draw_parameters_features;
VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_size_control_features;
VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR separate_depth_stencil_layout_features;
VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR shader_integer_dot_product_features;
VkPhysicalDeviceFeatures2 features2;