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))
 

Reply via email to