[PATCH 4/6] wined3d: Store feature level in d3d_info.

Józef Kucia jkucia at codeweavers.com
Wed Jun 13 05:24:01 CDT 2018


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/directx.c         | 107 ++++++++++++++++++-----------------------
 dlls/wined3d/wined3d_private.h |  14 ++++++
 2 files changed, 62 insertions(+), 59 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e64df4f75f75..7046060d5249 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -77,19 +77,6 @@ enum wined3d_gl_vendor
     GL_VENDOR_NVIDIA,
 };
 
-enum wined3d_d3d_level
-{
-    WINED3D_D3D_LEVEL_5,
-    WINED3D_D3D_LEVEL_6,
-    WINED3D_D3D_LEVEL_7,
-    WINED3D_D3D_LEVEL_8,
-    WINED3D_D3D_LEVEL_9_SM2,
-    WINED3D_D3D_LEVEL_9_SM3,
-    WINED3D_D3D_LEVEL_10,
-    WINED3D_D3D_LEVEL_11,
-    WINED3D_D3D_LEVEL_COUNT
-};
-
 /* The d3d device ID */
 static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
 
@@ -1857,26 +1844,26 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
     return HW_VENDOR_NVIDIA;
 }
 
-static enum wined3d_d3d_level d3d_level_from_caps(const struct shader_caps *shader_caps,
+static enum wined3d_feature_level feature_level_from_caps(const struct shader_caps *shader_caps,
         const struct fragment_caps *fragment_caps)
 {
     if (shader_caps->vs_version >= 5)
-        return WINED3D_D3D_LEVEL_11;
+        return WINED3D_FEATURE_LEVEL_11;
     if (shader_caps->vs_version == 4)
-        return WINED3D_D3D_LEVEL_10;
+        return WINED3D_FEATURE_LEVEL_10;
     if (shader_caps->vs_version == 3)
-        return WINED3D_D3D_LEVEL_9_SM3;
+        return WINED3D_FEATURE_LEVEL_9_SM3;
     if (shader_caps->vs_version == 2)
-        return WINED3D_D3D_LEVEL_9_SM2;
+        return WINED3D_FEATURE_LEVEL_9_SM2;
     if (shader_caps->vs_version == 1)
-        return WINED3D_D3D_LEVEL_8;
+        return WINED3D_FEATURE_LEVEL_8;
 
     if (fragment_caps->TextureOpCaps & WINED3DTEXOPCAPS_DOTPRODUCT3)
-        return WINED3D_D3D_LEVEL_7;
+        return WINED3D_FEATURE_LEVEL_7;
     if (fragment_caps->MaxSimultaneousTextures > 1)
-        return WINED3D_D3D_LEVEL_6;
+        return WINED3D_FEATURE_LEVEL_6;
 
-    return WINED3D_D3D_LEVEL_5;
+    return WINED3D_FEATURE_LEVEL_5;
 }
 
 static const struct wined3d_renderer_table
@@ -2448,9 +2435,9 @@ card_fallback_intel[] =
     CARD_INTEL_G45,                 /* D3D10 */
     CARD_INTEL_IVBD,                /* D3D11 */
 };
-C_ASSERT(ARRAY_SIZE(card_fallback_nvidia)  == WINED3D_D3D_LEVEL_COUNT);
-C_ASSERT(ARRAY_SIZE(card_fallback_amd)     == WINED3D_D3D_LEVEL_COUNT);
-C_ASSERT(ARRAY_SIZE(card_fallback_intel)   == WINED3D_D3D_LEVEL_COUNT);
+C_ASSERT(ARRAY_SIZE(card_fallback_nvidia)  == WINED3D_FEATURE_LEVEL_COUNT);
+C_ASSERT(ARRAY_SIZE(card_fallback_amd)     == WINED3D_FEATURE_LEVEL_COUNT);
+C_ASSERT(ARRAY_SIZE(card_fallback_intel)   == WINED3D_FEATURE_LEVEL_COUNT);
 
 static enum wined3d_pci_device select_card_handler(const struct gl_vendor_selection *table,
         unsigned int table_size, enum wined3d_gl_vendor gl_vendor, const char *gl_renderer)
@@ -2483,7 +2470,7 @@ static const struct
     const char *description;        /* Description of the card selector i.e. Apple OS/X Intel */
     const struct gl_vendor_selection *gl_vendor_selection;
     unsigned int gl_vendor_count;
-    const enum wined3d_pci_device *card_fallback; /* An array with D3D_LEVEL_COUNT elements */
+    const enum wined3d_pci_device *card_fallback; /* An array with FEATURE_LEVEL_COUNT elements */
 }
 card_vendor_table[] =
 {
@@ -2501,9 +2488,9 @@ card_vendor_table[] =
             card_fallback_intel},
 };
 
-
-static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps,
-        DWORD glsl_version, const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor)
+static enum wined3d_pci_device wined3d_guess_card(enum wined3d_feature_level feature_level,
+        DWORD glsl_version, const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor,
+        enum wined3d_pci_vendor *card_vendor)
 {
     /* A Direct3D device object contains the PCI id (vendor + device) of the
      * videocard which is used for rendering. Various applications use this
@@ -2555,7 +2542,6 @@ static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shad
      * memory behind our backs if really needed. Note that the amount of video
      * memory can be overruled using a registry setting. */
 
-    enum wined3d_d3d_level d3d_level = d3d_level_from_caps(shader_caps, fragment_caps);
     enum wined3d_pci_device device;
     unsigned int i;
 
@@ -2571,7 +2557,7 @@ static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shad
             return device;
 
         TRACE("Unrecognized renderer %s, falling back to default.\n", debugstr_a(gl_renderer));
-        return card_vendor_table[i].card_fallback[d3d_level];
+        return card_vendor_table[i].card_fallback[feature_level];
     }
 
     FIXME("No card selector available for card vendor %04x (using GL_RENDERER %s).\n",
@@ -2579,7 +2565,7 @@ static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shad
 
     /* Default to generic Nvidia hardware based on the supported OpenGL extensions. */
     *card_vendor = HW_VENDOR_NVIDIA;
-    return card_fallback_nvidia[d3d_level];
+    return card_fallback_nvidia[feature_level];
 }
 
 static const struct wined3d_vertex_pipe_ops *select_vertex_implementation(const struct wined3d_gl_info *gl_info,
@@ -3954,6 +3940,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
     };
     struct wined3d_driver_info *driver_info = &adapter->driver_info;
     const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
+    struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
     struct wined3d_gl_info *gl_info = &adapter->gl_info;
     const struct gpu_description *gpu_description;
     struct wined3d_vertex_caps vertex_caps;
@@ -3962,10 +3949,10 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
     const char *WGL_Extensions = NULL;
     enum wined3d_gl_vendor gl_vendor;
     DWORD gl_version, gl_ext_emul_mask;
+    GLint context_profile = 0;
     UINT64 vram_bytes = 0;
-    HDC hdc;
     unsigned int i, j;
-    GLint context_profile = 0;
+    HDC hdc;
 
     TRACE("adapter %p.\n", adapter);
 
@@ -4295,37 +4282,39 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
     adapter->fragment_pipe = select_fragment_implementation(gl_info, adapter->shader_backend);
 
     adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
-    adapter->d3d_info.vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
-    adapter->d3d_info.limits.vs_version = shader_caps.vs_version;
-    adapter->d3d_info.limits.hs_version = shader_caps.hs_version;
-    adapter->d3d_info.limits.ds_version = shader_caps.ds_version;
-    adapter->d3d_info.limits.gs_version = shader_caps.gs_version;
-    adapter->d3d_info.limits.ps_version = shader_caps.ps_version;
-    adapter->d3d_info.limits.cs_version = shader_caps.cs_version;
-    adapter->d3d_info.limits.vs_uniform_count = shader_caps.vs_uniform_count;
-    adapter->d3d_info.limits.ps_uniform_count = shader_caps.ps_uniform_count;
-    adapter->d3d_info.limits.varying_count = shader_caps.varying_count;
-    adapter->d3d_info.shader_double_precision = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION;
+    d3d_info->vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
+    d3d_info->limits.vs_version = shader_caps.vs_version;
+    d3d_info->limits.hs_version = shader_caps.hs_version;
+    d3d_info->limits.ds_version = shader_caps.ds_version;
+    d3d_info->limits.gs_version = shader_caps.gs_version;
+    d3d_info->limits.ps_version = shader_caps.ps_version;
+    d3d_info->limits.cs_version = shader_caps.cs_version;
+    d3d_info->limits.vs_uniform_count = shader_caps.vs_uniform_count;
+    d3d_info->limits.ps_uniform_count = shader_caps.ps_uniform_count;
+    d3d_info->limits.varying_count = shader_caps.varying_count;
+    d3d_info->shader_double_precision = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION;
 
     adapter->vertex_pipe->vp_get_caps(gl_info, &vertex_caps);
-    adapter->d3d_info.xyzrhw = vertex_caps.xyzrhw;
-    adapter->d3d_info.ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
-    adapter->d3d_info.limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
-    adapter->d3d_info.limits.active_light_count = vertex_caps.max_active_lights;
-    adapter->d3d_info.emulated_flatshading = vertex_caps.emulated_flatshading;
+    d3d_info->xyzrhw = vertex_caps.xyzrhw;
+    d3d_info->ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
+    d3d_info->limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
+    d3d_info->limits.active_light_count = vertex_caps.max_active_lights;
+    d3d_info->emulated_flatshading = vertex_caps.emulated_flatshading;
 
     adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
-    adapter->d3d_info.limits.ffp_blend_stages = fragment_caps.MaxTextureBlendStages;
-    adapter->d3d_info.limits.ffp_textures = fragment_caps.MaxSimultaneousTextures;
-    adapter->d3d_info.shader_color_key = fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_COLOR_KEY;
-    adapter->d3d_info.wined3d_creation_flags = wined3d_creation_flags;
-    TRACE("Max texture stages: %u.\n", adapter->d3d_info.limits.ffp_blend_stages);
+    d3d_info->limits.ffp_blend_stages = fragment_caps.MaxTextureBlendStages;
+    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(&shader_caps, &fragment_caps);
+
+    TRACE("Max texture stages: %u.\n", d3d_info->limits.ffp_blend_stages);
 
-    adapter->d3d_info.valid_rt_mask = 0;
+    d3d_info->valid_rt_mask = 0;
     for (i = 0; i < gl_info->limits.buffers; ++i)
-        adapter->d3d_info.valid_rt_mask |= (1u << i);
+        d3d_info->valid_rt_mask |= (1u << i);
 
-    if (!adapter->d3d_info.shader_color_key)
+    if (!d3d_info->shader_color_key)
     {
         /* We do not want to deal with re-creating immutable texture storage for color keying emulation. */
         WARN("Disabling ARB_texture_storage because fragment pipe doesn't support color keying.\n");
@@ -4431,7 +4420,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
         vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
         TRACE("Guessed vendor PCI ID 0x%04x.\n", vendor);
 
-        device = wined3d_guess_card(&shader_caps, &fragment_caps, gl_info->glsl_version,
+        device = wined3d_guess_card(d3d_info->feature_level, gl_info->glsl_version,
                 gl_renderer_str, &gl_vendor, &vendor);
         TRACE("Guessed device PCI ID 0x%04x.\n", device);
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d190f7ccfd68..01888469e7a8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -184,6 +184,19 @@ struct wined3d_ffp_attrib_ops
     wined3d_generic_attrib_func generic[WINED3D_FFP_EMIT_COUNT];
 };
 
+enum wined3d_feature_level
+{
+    WINED3D_FEATURE_LEVEL_5,
+    WINED3D_FEATURE_LEVEL_6,
+    WINED3D_FEATURE_LEVEL_7,
+    WINED3D_FEATURE_LEVEL_8,
+    WINED3D_FEATURE_LEVEL_9_SM2,
+    WINED3D_FEATURE_LEVEL_9_SM3,
+    WINED3D_FEATURE_LEVEL_10,
+    WINED3D_FEATURE_LEVEL_11,
+    WINED3D_FEATURE_LEVEL_COUNT
+};
+
 struct wined3d_d3d_info
 {
     struct wined3d_d3d_limits limits;
@@ -196,6 +209,7 @@ struct wined3d_d3d_info
     DWORD valid_rt_mask;
     DWORD wined3d_creation_flags;
     BOOL shader_double_precision;
+    enum wined3d_feature_level feature_level;
 };
 
 static const struct color_fixup_desc COLOR_FIXUP_IDENTITY =
-- 
2.16.4




More information about the wine-devel mailing list