Henri Verbeet : d3d11: Use the supplied feature levels in d3d11_device_CreateDeviceContextState().

Alexandre Julliard julliard at winehq.org
Tue Mar 16 16:39:04 CDT 2021


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar 16 17:13:28 2021 +0100

d3d11: Use the supplied feature levels in d3d11_device_CreateDeviceContextState().

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

---

 dlls/d3d11/device.c | 76 +++++++++++++++++++++++++++++++++++------------------
 1 file changed, 50 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index d2a3931b724..63d1e9dfb8c 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -4073,39 +4073,62 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDeviceContextState(ID3D11Dev
 {
     struct d3d_device *device = impl_from_ID3D11Device2(iface);
     struct d3d_device_context_state *state_impl;
+    struct wined3d_state *wined3d_state;
     D3D_FEATURE_LEVEL feature_level;
     HRESULT hr = E_INVALIDARG;
 
-    FIXME("iface %p, flags %#x, feature_levels %p, feature_level_count %u, sdk_version %u, "
-            "emulated_interface %s, chosen_feature_level %p, state %p semi-stub!\n",
-            iface, flags, feature_levels, feature_level_count, sdk_version,
-            debugstr_guid(emulated_interface), chosen_feature_level, state);
+    TRACE("iface %p, flags %#x, feature_levels %p, feature_level_count %u, "
+            "sdk_version %u, emulated_interface %s, chosen_feature_level %p, state %p.\n",
+            iface, flags, feature_levels, feature_level_count,
+            sdk_version, debugstr_guid(emulated_interface), chosen_feature_level, state);
+
+    if (flags)
+        FIXME("Ignoring flags %#x.\n", flags);
+
+    wined3d_mutex_lock();
 
     if (!feature_level_count)
         goto fail;
 
+    if (FAILED(hr = wined3d_state_create(device->wined3d_device,
+            (const enum wined3d_feature_level *)feature_levels, feature_level_count, &wined3d_state)))
+        goto fail;
+    feature_level = d3d_feature_level_from_wined3d(wined3d_state_get_feature_level(wined3d_state));
+
     if (chosen_feature_level)
-       FIXME("Device context state feature level not implemented yet.\n");
+        *chosen_feature_level = feature_level;
 
-    if (state)
+    if (!state)
     {
-        if (!(state_impl = heap_alloc_zero(sizeof(*state_impl))))
-        {
-            hr = E_OUTOFMEMORY;
-            goto fail;
-        }
+        wined3d_state_destroy(wined3d_state);
+        wined3d_mutex_unlock();
+        return S_FALSE;
+    }
 
-        feature_level = d3d_feature_level_from_wined3d(wined3d_state_get_feature_level(
-                wined3d_device_get_state(device->wined3d_device)));
-        d3d_device_context_state_init(state_impl, device, feature_level, emulated_interface);
-        *state = &state_impl->ID3DDeviceContextState_iface;
+    if (!(state_impl = heap_alloc_zero(sizeof(*state_impl))))
+    {
+        wined3d_state_destroy(wined3d_state);
+        hr = E_OUTOFMEMORY;
+        goto fail;
+    }
+
+    d3d_device_context_state_init(state_impl, device, feature_level, emulated_interface);
+    if (!d3d_device_context_state_add_entry(state_impl, device, wined3d_state))
+    {
+        wined3d_state_destroy(wined3d_state);
+        ID3DDeviceContextState_Release(&state_impl->ID3DDeviceContextState_iface);
+        hr = E_FAIL;
+        goto fail;
     }
 
+    *state = &state_impl->ID3DDeviceContextState_iface;
     device->d3d11_only = FALSE;
-    if (chosen_feature_level) *chosen_feature_level = ID3D11Device2_GetFeatureLevel(iface);
-    return state ? S_OK : S_FALSE;
+    wined3d_mutex_unlock();
+
+    return S_OK;
 
 fail:
+    wined3d_mutex_unlock();
     if (chosen_feature_level)
         *chosen_feature_level = 0;
     if (state)
@@ -6470,10 +6493,9 @@ static void CDECL device_parent_wined3d_device_created(struct wined3d_device_par
         struct wined3d_device *wined3d_device)
 {
     struct d3d_device *device = device_from_wined3d_device_parent(device_parent);
+    struct d3d_device_context_state *state;
     struct wined3d_state *wined3d_state;
     D3D_FEATURE_LEVEL feature_level;
-    ID3DDeviceContextState *state;
-    HRESULT hr;
 
     TRACE("device_parent %p, wined3d_device %p.\n", device_parent, wined3d_device);
 
@@ -6484,19 +6506,21 @@ static void CDECL device_parent_wined3d_device_created(struct wined3d_device_par
     wined3d_state = wined3d_device_get_state(device->wined3d_device);
     feature_level = d3d_feature_level_from_wined3d(wined3d_state_get_feature_level(wined3d_state));
 
-    if (FAILED(hr = d3d11_device_CreateDeviceContextState(&device->ID3D11Device2_iface, 0, &feature_level, 1,
-            D3D11_SDK_VERSION, device->d3d11_only ? &IID_ID3D11Device2 : &IID_ID3D10Device1, NULL, &state)))
+    if (!(state = heap_alloc_zero(sizeof(*state))))
     {
-        ERR("Failed to create the initial device context state, hr %#x.\n", hr);
+        ERR("Failed to create the initial device context state.\n");
         return;
     }
 
-    device->state = impl_from_ID3DDeviceContextState(state);
-    if (!d3d_device_context_state_add_entry(device->state, device, wined3d_state))
+    d3d_device_context_state_init(state, device, feature_level,
+            device->d3d11_only ? &IID_ID3D11Device2 : &IID_ID3D10Device1);
+
+    device->state = state;
+    if (!d3d_device_context_state_add_entry(state, device, wined3d_state))
         ERR("Failed to add entry for wined3d state %p, device %p.\n", wined3d_state, device);
 
-    d3d_device_context_state_private_addref(device->state);
-    ID3DDeviceContextState_Release(state);
+    d3d_device_context_state_private_addref(state);
+    ID3DDeviceContextState_Release(&state->ID3DDeviceContextState_iface);
 }
 
 static void CDECL device_parent_mode_changed(struct wined3d_device_parent *device_parent)




More information about the wine-cvs mailing list