[PATCH 2/5] wined3d: Assign 9_x feature levels more accurately.

Matteo Bruni mbruni at codeweavers.com
Wed May 15 16:39:29 CDT 2019


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
 dlls/d3d9/device.c        |  4 ++--
 dlls/wined3d/adapter_gl.c | 20 +++++++++++++++-----
 dlls/wined3d/directx.c    | 10 +++++-----
 dlls/wined3d/shader.c     |  4 ++--
 dlls/wined3d/utils.c      |  4 ++--
 include/wine/wined3d.h    |  4 ++--
 6 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index bef01a477f9..9fbdcebf075 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -4443,8 +4443,8 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
 
     static const enum wined3d_feature_level feature_levels[] =
     {
-        WINED3D_FEATURE_LEVEL_9_SM3,
-        WINED3D_FEATURE_LEVEL_9_SM2,
+        WINED3D_FEATURE_LEVEL_9_3,
+        WINED3D_FEATURE_LEVEL_9_2,
         WINED3D_FEATURE_LEVEL_9_1,
         WINED3D_FEATURE_LEVEL_8,
         WINED3D_FEATURE_LEVEL_7,
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 2837f6ede2c..51f26fefe98 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -1241,7 +1241,8 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
 }
 
 static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_gl_info *gl_info,
-        const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps)
+        const struct wined3d_d3d_info *d3d_info, const struct shader_caps *shader_caps,
+        const struct fragment_caps *fragment_caps)
 {
     unsigned int shader_model;
 
@@ -1267,10 +1268,19 @@ static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_g
         }
     }
 
-    if (shader_model >= 3)
-        return WINED3D_FEATURE_LEVEL_9_SM3;
+    if (shader_model >= 3 && d3d_info->limits.texture_size >= 4096
+            && d3d_info->limits.max_rt_count >= 4)
+        return WINED3D_FEATURE_LEVEL_9_3;
     if (shader_model >= 2)
-        return WINED3D_FEATURE_LEVEL_9_SM2;
+    {
+        if (gl_info->supported[ARB_OCCLUSION_QUERY]
+                && gl_info->supported[ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE]
+                && gl_info->supported[EXT_BLEND_EQUATION_SEPARATE]
+                && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
+            return WINED3D_FEATURE_LEVEL_9_2;
+
+        return WINED3D_FEATURE_LEVEL_9_1;
+    }
     if (shader_model >= 1)
         return WINED3D_FEATURE_LEVEL_8;
 
@@ -3722,7 +3732,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
     d3d_info->limits.ffp_textures = fragment_caps.MaxSimultaneousTextures;
     d3d_info->shader_color_key = !!(fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_COLOR_KEY);
     d3d_info->wined3d_creation_flags = wined3d_creation_flags;
-    d3d_info->feature_level = feature_level_from_caps(gl_info, &shader_caps, &fragment_caps);
+    d3d_info->feature_level = feature_level_from_caps(gl_info, d3d_info, &shader_caps, &fragment_caps);
 
     d3d_info->texture_npot = !!gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO];
     d3d_info->texture_npot_conditional = gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 12c83bb2cd9..39dd13a9292 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -691,8 +691,8 @@ enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *
         {WINED3D_FEATURE_LEVEL_6,     CARD_NVIDIA_RIVA_TNT},
         {WINED3D_FEATURE_LEVEL_7,     CARD_NVIDIA_GEFORCE},
         {WINED3D_FEATURE_LEVEL_8,     CARD_NVIDIA_GEFORCE3},
-        {WINED3D_FEATURE_LEVEL_9_SM2, CARD_NVIDIA_GEFORCEFX_5800},
-        {WINED3D_FEATURE_LEVEL_9_SM3, CARD_NVIDIA_GEFORCE_6800},
+        {WINED3D_FEATURE_LEVEL_9_2,   CARD_NVIDIA_GEFORCEFX_5800},
+        {WINED3D_FEATURE_LEVEL_9_3,   CARD_NVIDIA_GEFORCE_6800},
         {WINED3D_FEATURE_LEVEL_10,    CARD_NVIDIA_GEFORCE_8800GTX},
         {WINED3D_FEATURE_LEVEL_11,    CARD_NVIDIA_GEFORCE_GTX470},
         {WINED3D_FEATURE_LEVEL_NONE},
@@ -702,8 +702,8 @@ enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *
         {WINED3D_FEATURE_LEVEL_5,     CARD_AMD_RAGE_128PRO},
         {WINED3D_FEATURE_LEVEL_7,     CARD_AMD_RADEON_7200},
         {WINED3D_FEATURE_LEVEL_8,     CARD_AMD_RADEON_8500},
-        {WINED3D_FEATURE_LEVEL_9_SM2, CARD_AMD_RADEON_9500},
-        {WINED3D_FEATURE_LEVEL_9_SM3, CARD_AMD_RADEON_X1600},
+        {WINED3D_FEATURE_LEVEL_9_1,   CARD_AMD_RADEON_9500},
+        {WINED3D_FEATURE_LEVEL_9_3,   CARD_AMD_RADEON_X1600},
         {WINED3D_FEATURE_LEVEL_10,    CARD_AMD_RADEON_HD2900},
         {WINED3D_FEATURE_LEVEL_11,    CARD_AMD_RADEON_HD5600},
         {WINED3D_FEATURE_LEVEL_NONE},
@@ -712,7 +712,7 @@ enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *
     {
         {WINED3D_FEATURE_LEVEL_5,     CARD_INTEL_845G},
         {WINED3D_FEATURE_LEVEL_8,     CARD_INTEL_915G},
-        {WINED3D_FEATURE_LEVEL_9_SM3, CARD_INTEL_945G},
+        {WINED3D_FEATURE_LEVEL_9_3,   CARD_INTEL_945G},
         {WINED3D_FEATURE_LEVEL_10,    CARD_INTEL_G45},
         {WINED3D_FEATURE_LEVEL_11,    CARD_INTEL_IVBD},
         {WINED3D_FEATURE_LEVEL_NONE},
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 609b574d461..a8fee07c6c3 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3311,9 +3311,9 @@ static unsigned int shader_max_version_from_feature_level(enum wined3d_feature_l
         case WINED3D_FEATURE_LEVEL_10_1:
         case WINED3D_FEATURE_LEVEL_10:
             return 4;
-        case WINED3D_FEATURE_LEVEL_9_SM3:
+        case WINED3D_FEATURE_LEVEL_9_3:
             return 3;
-        case WINED3D_FEATURE_LEVEL_9_SM2:
+        case WINED3D_FEATURE_LEVEL_9_2:
         case WINED3D_FEATURE_LEVEL_9_1:
             return 2;
         default:
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 669c8cbbbd2..dec8a045719 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -6583,8 +6583,8 @@ const char *wined3d_debug_feature_level(enum wined3d_feature_level level)
         LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_7);
         LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_8);
         LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_1);
-        LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_SM2);
-        LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_SM3);
+        LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_2);
+        LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_3);
         LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_10);
         LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_10_1);
         LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_11);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 958ade166c0..31afa46623f 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -96,8 +96,8 @@ enum wined3d_feature_level
     WINED3D_FEATURE_LEVEL_7      = 0x7000,
     WINED3D_FEATURE_LEVEL_8      = 0x8000,
     WINED3D_FEATURE_LEVEL_9_1    = 0x9100,
-    WINED3D_FEATURE_LEVEL_9_SM2  = 0x9200,
-    WINED3D_FEATURE_LEVEL_9_SM3  = 0x9300,
+    WINED3D_FEATURE_LEVEL_9_2    = 0x9200,
+    WINED3D_FEATURE_LEVEL_9_3    = 0x9300,
     WINED3D_FEATURE_LEVEL_10     = 0xa000,
     WINED3D_FEATURE_LEVEL_10_1   = 0xa100,
     WINED3D_FEATURE_LEVEL_11     = 0xb000,
-- 
2.21.0




More information about the wine-devel mailing list