Module: Mesa Branch: main Commit: d66e840ab4d8cb6f7e8abbed833b8e5810f0bb94 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d66e840ab4d8cb6f7e8abbed833b8e5810f0bb94
Author: Jesse Natalie <[email protected]> Date: Thu Aug 11 14:02:18 2022 -0700 dzn: Get max supported shader model Reviewed-by: Giancarlo Devich <[email protected]> Reviewed-by: Boris Brezillon <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18022> --- src/microsoft/vulkan/dzn_device.c | 12 ++++++++++++ src/microsoft/vulkan/dzn_meta.c | 4 +++- src/microsoft/vulkan/dzn_pipeline.c | 12 +++++++++++- src/microsoft/vulkan/dzn_private.h | 4 ++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index d46d06522d4..f8c88ff2f66 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -384,6 +384,18 @@ dzn_physical_device_cache_caps(struct dzn_physical_device *pdev) ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_FEATURE_LEVELS, &levels, sizeof(levels)); pdev->feature_level = levels.MaxSupportedFeatureLevel; + static const D3D_SHADER_MODEL valid_shader_models[] = { + D3D_SHADER_MODEL_6_7, D3D_SHADER_MODEL_6_6, D3D_SHADER_MODEL_6_5, D3D_SHADER_MODEL_6_4, + D3D_SHADER_MODEL_6_3, D3D_SHADER_MODEL_6_2, D3D_SHADER_MODEL_6_1, + }; + for (UINT i = 0; i < ARRAY_SIZE(valid_shader_models); ++i) { + D3D12_FEATURE_DATA_SHADER_MODEL shader_model = { valid_shader_models[i] }; + if (SUCCEEDED(ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_SHADER_MODEL, &shader_model, sizeof(shader_model)))) { + pdev->shader_model = shader_model.HighestShaderModel; + break; + } + } + ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_ARCHITECTURE1, &pdev->architecture, sizeof(pdev->architecture)); ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS, &pdev->options, sizeof(pdev->options)); ID3D12Device1_CheckFeatureSupport(pdev->dev, D3D12_FEATURE_D3D12_OPTIONS2, &pdev->options2, sizeof(pdev->options2)); diff --git a/src/microsoft/vulkan/dzn_meta.c b/src/microsoft/vulkan/dzn_meta.c index 661fc3d2317..a281664a5ff 100644 --- a/src/microsoft/vulkan/dzn_meta.c +++ b/src/microsoft/vulkan/dzn_meta.c @@ -36,6 +36,8 @@ dzn_meta_compile_shader(struct dzn_device *device, nir_shader *nir, { struct dzn_instance *instance = container_of(device->vk.physical->instance, struct dzn_instance, vk); + struct dzn_physical_device *pdev = + container_of(device->vk.physical, struct dzn_physical_device, vk); nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir)); @@ -45,7 +47,7 @@ dzn_meta_compile_shader(struct dzn_device *device, nir_shader *nir, struct nir_to_dxil_options opts = { .environment = DXIL_ENVIRONMENT_VULKAN, - .shader_model_max = SHADER_MODEL_6_2, + .shader_model_max = dzn_get_shader_model(pdev), #ifdef _WIN32 .validator_version_max = dxil_get_validator_version(instance->dxil_validator), #endif diff --git a/src/microsoft/vulkan/dzn_pipeline.c b/src/microsoft/vulkan/dzn_pipeline.c index 70226eef91e..dc9c205c44d 100644 --- a/src/microsoft/vulkan/dzn_pipeline.c +++ b/src/microsoft/vulkan/dzn_pipeline.c @@ -338,6 +338,14 @@ adjust_var_bindings(nir_shader *shader, nir_metadata_all, (void *)layout); } +enum dxil_shader_model + dzn_get_shader_model(const struct dzn_physical_device *pdev) +{ + static_assert(D3D_SHADER_MODEL_6_0 == 0x60 && SHADER_MODEL_6_0 == 0x60000, "Validating math below"); + static_assert(D3D_SHADER_MODEL_6_7 == 0x67 && SHADER_MODEL_6_7 == 0x60007, "Validating math below"); + return ((pdev->shader_model & 0xf0) << 12) | (pdev->shader_model & 0xf); +} + static VkResult dzn_pipeline_compile_shader(struct dzn_device *device, nir_shader *nir, @@ -345,9 +353,11 @@ dzn_pipeline_compile_shader(struct dzn_device *device, { struct dzn_instance *instance = container_of(device->vk.physical->instance, struct dzn_instance, vk); + struct dzn_physical_device *pdev = + container_of(device->vk.physical, struct dzn_physical_device, vk); struct nir_to_dxil_options opts = { .environment = DXIL_ENVIRONMENT_VULKAN, - .shader_model_max = SHADER_MODEL_6_2, + .shader_model_max = dzn_get_shader_model(pdev), #ifdef _WIN32 .validator_version_max = dxil_get_validator_version(instance->dxil_validator), #endif diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index f7779954cde..88008c63826 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -201,6 +201,7 @@ struct dzn_physical_device { mtx_t dev_lock; ID3D12Device2 *dev; D3D_FEATURE_LEVEL feature_level; + D3D_SHADER_MODEL shader_model; D3D12_FEATURE_DATA_ARCHITECTURE1 architecture; D3D12_FEATURE_DATA_D3D12_OPTIONS options; D3D12_FEATURE_DATA_D3D12_OPTIONS2 options2; @@ -219,6 +220,9 @@ uint32_t dzn_physical_device_get_mem_type_mask_for_resource(const struct dzn_physical_device *pdev, const D3D12_RESOURCE_DESC *desc); +enum dxil_shader_model +dzn_get_shader_model(const struct dzn_physical_device *pdev); + #define dzn_debug_ignored_stype(sType) \ mesa_logd("%s: ignored VkStructureType %u\n", __func__, (sType))
