Henri Verbeet : wined3d: Move feature level selection to wined3d_state_create().

Alexandre Julliard julliard at winehq.org
Mon Mar 15 16:59:13 CDT 2021


Module: wine
Branch: master
Commit: 4cfac484db49b6d219cb3b5b14ca19011ed81397
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4cfac484db49b6d219cb3b5b14ca19011ed81397

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Mar 15 16:11:37 2021 +0100

wined3d: Move feature level selection to wined3d_state_create().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d11/device.c            |  3 ++-
 dlls/wined3d/cs.c              |  6 +++---
 dlls/wined3d/device.c          | 29 +----------------------------
 dlls/wined3d/stateblock.c      | 35 ++++++++++++++++++++++++++++++++---
 dlls/wined3d/wined3d.spec      |  2 +-
 dlls/wined3d/wined3d_private.h |  2 +-
 include/wine/wined3d.h         |  3 ++-
 7 files changed, 42 insertions(+), 38 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 414560be72a..16a1027beb9 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -295,7 +295,8 @@ static struct wined3d_state *d3d_device_context_state_get_wined3d_state(struct d
     if ((entry = d3d_device_context_state_get_entry(state, device)))
         return entry->wined3d_state;
 
-    if (FAILED(wined3d_state_create(device->wined3d_device, &wined3d_state)))
+    if (FAILED(wined3d_state_create(device->wined3d_device,
+            (enum wined3d_feature_level *)&device->feature_level, 1, &wined3d_state)))
         return NULL;
 
     if (!d3d_device_context_state_add_entry(state, device, wined3d_state))
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 69f6a437e97..886a76284ff 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -3008,7 +3008,8 @@ static DWORD WINAPI wined3d_cs_run(void *ctx)
     FreeLibraryAndExitThread(wined3d_module, 0);
 }
 
-struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device, enum wined3d_feature_level feature_level)
+struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device,
+        const enum wined3d_feature_level *levels, unsigned int level_count)
 {
     const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
     struct wined3d_cs *cs;
@@ -3016,12 +3017,11 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device, enum wined3d
     if (!(cs = heap_alloc_zero(sizeof(*cs))))
         return NULL;
 
-    if (!(cs->c.state = heap_alloc_zero(sizeof(*cs->c.state))))
+    if (FAILED(wined3d_state_create(device, levels, level_count, &cs->c.state)))
     {
         heap_free(cs);
         return NULL;
     }
-    state_init(cs->c.state, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT, feature_level);
 
     cs->c.ops = &wined3d_cs_st_ops;
     cs->c.device = device;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 42d97b2eb85..ca179c753ab 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5976,27 +5976,6 @@ static int wined3d_depth_stencil_state_compare(const void *key, const struct win
     return memcmp(&state->desc, key, sizeof(state->desc));
 }
 
-static BOOL wined3d_select_feature_level(const struct wined3d_adapter *adapter,
-        const enum wined3d_feature_level *levels, unsigned int level_count,
-        enum wined3d_feature_level *selected_level)
-{
-    const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
-    unsigned int i;
-
-    for (i = 0; i < level_count; ++i)
-    {
-        if (levels[i] && d3d_info->feature_level >= levels[i])
-        {
-            *selected_level = levels[i];
-            return TRUE;
-        }
-    }
-
-    FIXME_(winediag)("None of the requested D3D feature levels is supported on this GPU "
-            "with the current shader backend.\n");
-    return FALSE;
-}
-
 HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined3d,
         unsigned int adapter_idx, enum wined3d_device_type device_type, HWND focus_window, unsigned int flags,
         BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,
@@ -6005,15 +5984,9 @@ HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined
     struct wined3d_adapter *adapter = wined3d->adapters[adapter_idx];
     const struct wined3d_fragment_pipe_ops *fragment_pipeline;
     const struct wined3d_vertex_pipe_ops *vertex_pipeline;
-    enum wined3d_feature_level feature_level;
     unsigned int i;
     HRESULT hr;
 
-    if (!wined3d_select_feature_level(adapter, levels, level_count, &feature_level))
-        return E_FAIL;
-
-    TRACE("Device feature level %s.\n", wined3d_debug_feature_level(feature_level));
-
     device->ref = 1;
     device->wined3d = wined3d;
     wined3d_incref(device->wined3d);
@@ -6058,7 +6031,7 @@ HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined
 
     device->max_frame_latency = 3;
 
-    if (!(device->cs = wined3d_cs_create(device, feature_level)))
+    if (!(device->cs = wined3d_cs_create(device, levels, level_count)))
     {
         WARN("Failed to create command stream.\n");
         hr = E_FAIL;
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 2cef5a6498a..1f1ba262336 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -27,6 +27,7 @@
 #include "wined3d_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+WINE_DECLARE_DEBUG_CHANNEL(winediag);
 
 static const DWORD pixel_states_render[] =
 {
@@ -1887,15 +1888,43 @@ void state_init(struct wined3d_state *state, const struct wined3d_d3d_info *d3d_
         state_init_default(state, d3d_info);
 }
 
-HRESULT CDECL wined3d_state_create(struct wined3d_device *device, struct wined3d_state **state)
+static bool wined3d_select_feature_level(const struct wined3d_adapter *adapter,
+        const enum wined3d_feature_level *levels, unsigned int level_count,
+        enum wined3d_feature_level *selected_level)
 {
+    const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
+    unsigned int i;
+
+    for (i = 0; i < level_count; ++i)
+    {
+        if (levels[i] && d3d_info->feature_level >= levels[i])
+        {
+            *selected_level = levels[i];
+            return true;
+        }
+    }
+
+    FIXME_(winediag)("None of the requested D3D feature levels is supported on this GPU "
+            "with the current shader backend.\n");
+    return false;
+}
+
+HRESULT CDECL wined3d_state_create(struct wined3d_device *device,
+        const enum wined3d_feature_level *levels, unsigned int level_count, struct wined3d_state **state)
+{
+    enum wined3d_feature_level feature_level;
     struct wined3d_state *object;
 
-    TRACE("device %p, state %p.\n", device, state);
+    TRACE("device %p, levels %p, level_count %u, state %p.\n", device, levels, level_count, state);
+
+    if (!wined3d_select_feature_level(device->adapter, levels, level_count, &feature_level))
+        return E_FAIL;
+
+    TRACE("Selected feature level %s.\n", wined3d_debug_feature_level(feature_level));
 
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
-    state_init(object, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT, device->cs->c.state->feature_level);
+    state_init(object, &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT, feature_level);
 
     *state = object;
     return S_OK;
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index c91f488a7b4..3fe3e0cfd89 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -245,7 +245,7 @@
 @ cdecl wined3d_shader_resource_view_get_parent(ptr)
 @ cdecl wined3d_shader_resource_view_incref(ptr)
 
-@ cdecl wined3d_state_create(ptr ptr)
+@ cdecl wined3d_state_create(ptr ptr long ptr)
 @ cdecl wined3d_state_destroy(ptr)
 @ cdecl wined3d_state_get_feature_level(ptr)
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e934d0f4b87..a8947f444cd 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4717,7 +4717,7 @@ struct wined3d_cs
 };
 
 struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device,
-        enum wined3d_feature_level feature_level) DECLSPEC_HIDDEN;
+        const enum wined3d_feature_level *levels, unsigned int level_count) DECLSPEC_HIDDEN;
 void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
 void wined3d_cs_destroy_object(struct wined3d_cs *cs,
         void (*callback)(void *object), void *object) DECLSPEC_HIDDEN;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 77c6c223b7b..3c091263742 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2745,7 +2745,8 @@ void __cdecl wined3d_shader_resource_view_generate_mipmaps(struct wined3d_shader
 void * __cdecl wined3d_shader_resource_view_get_parent(const struct wined3d_shader_resource_view *view);
 ULONG __cdecl wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view *view);
 
-HRESULT __cdecl wined3d_state_create(struct wined3d_device *device, struct wined3d_state **state);
+HRESULT __cdecl wined3d_state_create(struct wined3d_device *device,
+        const enum wined3d_feature_level *levels, unsigned int level_count, struct wined3d_state **state);
 void __cdecl wined3d_state_destroy(struct wined3d_state *state);
 enum wined3d_feature_level __cdecl wined3d_state_get_feature_level(const struct wined3d_state *state);
 




More information about the wine-cvs mailing list