[PATCH 3/5] d3d11: Store the feature level in the d3d_device_context_state structure.
Henri Verbeet
hverbeet at codeweavers.com
Tue Mar 16 11:13:27 CDT 2021
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d11/buffer.c | 2 +-
dlls/d3d11/d3d11_private.h | 2 +-
dlls/d3d11/device.c | 36 ++++++++++++++++++++----------------
dlls/d3d11/shader.c | 8 ++++----
dlls/d3d11/texture.c | 2 +-
5 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c
index b33be57d439..09d495c3f61 100644
--- a/dlls/d3d11/buffer.c
+++ b/dlls/d3d11/buffer.c
@@ -443,7 +443,7 @@ static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *dev
buffer->refcount = 1;
buffer->desc = *desc;
- if (!validate_buffer_desc(&buffer->desc, device->feature_level))
+ if (!validate_buffer_desc(&buffer->desc, device->state->feature_level))
return E_INVALIDARG;
wined3d_desc.byte_width = buffer->desc.ByteWidth;
diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h
index 5a812e1b254..7f050f5af6f 100644
--- a/dlls/d3d11/d3d11_private.h
+++ b/dlls/d3d11/d3d11_private.h
@@ -529,6 +529,7 @@ struct d3d_device_context_state
LONG refcount, private_refcount;
struct wined3d_private_store private_store;
+ D3D_FEATURE_LEVEL feature_level;
GUID emulated_interface;
struct d3d_device_context_state_entry *entries;
@@ -562,7 +563,6 @@ struct d3d_device
IUnknown *outer_unk;
LONG refcount;
- D3D_FEATURE_LEVEL feature_level;
BOOL d3d11_only;
struct d3d_device_context_state *state;
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 16a1027beb9..8453419cf52 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -62,6 +62,11 @@ static inline BOOL d3d_device_is_d3d10_active(struct d3d_device *device)
|| IsEqualGUID(&device->state->emulated_interface, &IID_ID3D10Device1);
}
+static D3D_FEATURE_LEVEL d3d_feature_level_from_wined3d(enum wined3d_feature_level level)
+{
+ return (D3D_FEATURE_LEVEL)level;
+}
+
/* ID3DDeviceContextState methods */
static inline struct d3d_device_context_state *impl_from_ID3DDeviceContextState(ID3DDeviceContextState *iface)
@@ -296,7 +301,7 @@ static struct wined3d_state *d3d_device_context_state_get_wined3d_state(struct d
return entry->wined3d_state;
if (FAILED(wined3d_state_create(device->wined3d_device,
- (enum wined3d_feature_level *)&device->feature_level, 1, &wined3d_state)))
+ (enum wined3d_feature_level *)&state->feature_level, 1, &wined3d_state)))
return NULL;
if (!d3d_device_context_state_add_entry(state, device, wined3d_state))
@@ -308,14 +313,15 @@ static struct wined3d_state *d3d_device_context_state_get_wined3d_state(struct d
return wined3d_state;
}
-static void d3d_device_context_state_init(struct d3d_device_context_state *state, struct d3d_device *device,
- REFIID emulated_interface)
+static void d3d_device_context_state_init(struct d3d_device_context_state *state,
+ struct d3d_device *device, D3D_FEATURE_LEVEL feature_level, REFIID emulated_interface)
{
state->ID3DDeviceContextState_iface.lpVtbl = &d3d_device_context_state_vtbl;
state->refcount = state->private_refcount = 0;
wined3d_private_store_init(&state->private_store);
+ state->feature_level = feature_level;
state->emulated_interface = *emulated_interface;
wined3d_device_incref(state->wined3d_device = device->wined3d_device);
state->device = &device->ID3D11Device2_iface;
@@ -3651,7 +3657,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device2 *
*format_support = 0;
wined3d_mutex_lock();
- feature_level = device->feature_level;
+ feature_level = device->state->feature_level;
wined3d = wined3d_device_get_wined3d(device->wined3d_device);
wined3d_device_get_creation_parameters(device->wined3d_device, ¶ms);
wined3d_adapter = wined3d_get_adapter(wined3d, params.adapter_idx);
@@ -3984,7 +3990,7 @@ static D3D_FEATURE_LEVEL STDMETHODCALLTYPE d3d11_device_GetFeatureLevel(ID3D11De
TRACE("iface %p.\n", iface);
- return device->feature_level;
+ return device->state->feature_level;
}
static UINT STDMETHODCALLTYPE d3d11_device_GetCreationFlags(ID3D11Device2 *iface)
@@ -4067,6 +4073,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDeviceContextState(ID3D11Dev
{
struct d3d_device *device = impl_from_ID3D11Device2(iface);
struct d3d_device_context_state *state_impl;
+ D3D_FEATURE_LEVEL feature_level;
HRESULT hr = E_INVALIDARG;
FIXME("iface %p, flags %#x, feature_levels %p, feature_level_count %u, sdk_version %u, "
@@ -4088,7 +4095,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateDeviceContextState(ID3D11Dev
goto fail;
}
- d3d_device_context_state_init(state_impl, device, emulated_interface);
+ 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;
}
@@ -6218,7 +6227,7 @@ static D3D10_FEATURE_LEVEL1 STDMETHODCALLTYPE d3d10_device_GetFeatureLevel(ID3D1
TRACE("iface %p.\n", iface);
- return d3d10_feature_level1_from_d3d_feature_level(device->feature_level);
+ return d3d10_feature_level1_from_d3d_feature_level(device->state->feature_level);
}
static const struct ID3D10Device1Vtbl d3d10_device1_vtbl =
@@ -6457,16 +6466,12 @@ static inline struct d3d_device *device_from_wined3d_device_parent(struct wined3
return CONTAINING_RECORD(device_parent, struct d3d_device, device_parent);
}
-static D3D_FEATURE_LEVEL d3d_feature_level_from_wined3d(enum wined3d_feature_level level)
-{
- return (D3D_FEATURE_LEVEL)level;
-}
-
static void CDECL device_parent_wined3d_device_created(struct wined3d_device_parent *device_parent,
struct wined3d_device *wined3d_device)
{
struct d3d_device *device = device_from_wined3d_device_parent(device_parent);
struct wined3d_state *wined3d_state;
+ D3D_FEATURE_LEVEL feature_level;
ID3DDeviceContextState *state;
HRESULT hr;
@@ -6477,11 +6482,10 @@ static void CDECL device_parent_wined3d_device_created(struct wined3d_device_par
device->immediate_context.wined3d_context = wined3d_device_get_immediate_context(wined3d_device);
wined3d_state = wined3d_device_get_state(device->wined3d_device);
- device->feature_level = d3d_feature_level_from_wined3d(wined3d_state_get_feature_level(wined3d_state));
+ feature_level = d3d_feature_level_from_wined3d(wined3d_state_get_feature_level(wined3d_state));
- if (FAILED(hr = d3d11_device_CreateDeviceContextState(&device->ID3D11Device2_iface, 0, &device->feature_level,
- 1, D3D11_SDK_VERSION, device->d3d11_only ? &IID_ID3D11Device2 : &IID_ID3D10Device1, NULL,
- &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)))
{
ERR("Failed to create the initial device context state, hr %#x.\n", hr);
return;
diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c
index d51d8e4e60b..0d19b74ff0b 100644
--- a/dlls/d3d11/shader.c
+++ b/dlls/d3d11/shader.c
@@ -1120,24 +1120,24 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader,
WARN("Invalid rasterizer stream %u.\n", rasterizer_stream);
return E_INVALIDARG;
}
- if (device->feature_level < D3D_FEATURE_LEVEL_11_0)
+ if (device->state->feature_level < D3D_FEATURE_LEVEL_11_0)
{
if (rasterizer_stream)
{
WARN("Invalid rasterizer stream %u for feature level %#x.\n",
- rasterizer_stream, device->feature_level);
+ rasterizer_stream, device->state->feature_level);
return E_INVALIDARG;
}
if (buffer_stride_count && buffer_stride_count != 1)
{
WARN("Invalid buffer stride count %u for feature level %#x.\n",
- buffer_stride_count, device->feature_level);
+ buffer_stride_count, device->state->feature_level);
return E_INVALIDARG;
}
}
if (FAILED(hr = validate_stream_output_entries(so_entries, so_entry_count,
- buffer_strides, buffer_stride_count, device->feature_level)))
+ buffer_strides, buffer_stride_count, device->state->feature_level)))
return hr;
desc.byte_code = byte_code;
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index 1682aa05d99..061bbb09795 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -987,7 +987,7 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE
DWORD flags = 0;
HRESULT hr;
- if (!validate_texture2d_desc(desc, device->feature_level))
+ if (!validate_texture2d_desc(desc, device->state->feature_level))
{
WARN("Failed to validate texture desc.\n");
return E_INVALIDARG;
--
2.20.1
More information about the wine-devel
mailing list