[PATCH v2 2/5] d3d11: Reimplement ID3D11Device::CheckFormatSupport() using wined3d_device_check_format_support().
Chip Davis
wine at gitlab.winehq.org
Thu May 26 01:51:40 CDT 2022
From: Chip Davis <cdavis5x at gmail.com>
Signed-off-by: Chip Davis <cdavis5x at gmail.com>
---
dlls/d3d11/device.c | 93 +++-------------------------------------
dlls/d3d11/tests/d3d11.c | 7 +--
2 files changed, 11 insertions(+), 89 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 263613911f8..f1b9edc88d3 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -3843,38 +3843,13 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device2 *
UINT *format_support)
{
struct d3d_device *device = impl_from_ID3D11Device2(iface);
- struct wined3d_device_creation_parameters params;
- struct wined3d_adapter *wined3d_adapter;
enum wined3d_format_id wined3d_format;
- D3D_FEATURE_LEVEL feature_level;
- struct wined3d *wined3d;
- unsigned int i;
-
- static const struct
- {
- enum wined3d_resource_type rtype;
- unsigned int bind_flags;
- unsigned int usage;
- D3D11_FORMAT_SUPPORT flag;
- }
- flag_mapping[] =
- {
- {WINED3D_RTYPE_BUFFER, WINED3D_BIND_SHADER_RESOURCE, 0, D3D11_FORMAT_SUPPORT_BUFFER},
- {WINED3D_RTYPE_BUFFER, WINED3D_BIND_VERTEX_BUFFER, 0, D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER},
- {WINED3D_RTYPE_BUFFER, WINED3D_BIND_INDEX_BUFFER, 0, D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER},
- {WINED3D_RTYPE_TEXTURE_1D, WINED3D_BIND_SHADER_RESOURCE, 0, D3D11_FORMAT_SUPPORT_TEXTURE1D},
- {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_SHADER_RESOURCE, 0, D3D11_FORMAT_SUPPORT_TEXTURE2D},
- {WINED3D_RTYPE_TEXTURE_3D, WINED3D_BIND_SHADER_RESOURCE, 0, D3D11_FORMAT_SUPPORT_TEXTURE3D},
- {WINED3D_RTYPE_NONE, WINED3D_BIND_RENDER_TARGET, 0, D3D11_FORMAT_SUPPORT_RENDER_TARGET},
- {WINED3D_RTYPE_NONE, WINED3D_BIND_DEPTH_STENCIL, 0, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL},
- {WINED3D_RTYPE_NONE, WINED3D_BIND_UNORDERED_ACCESS, 0, D3D11_FORMAT_SUPPORT_TYPED_UNORDERED_ACCESS_VIEW},
- {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_SHADER_RESOURCE, WINED3DUSAGE_QUERY_WRAPANDMIP, D3D11_FORMAT_SUPPORT_MIP},
- {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_SHADER_RESOURCE, WINED3DUSAGE_QUERY_GENMIPMAP, D3D11_FORMAT_SUPPORT_MIP_AUTOGEN},
- {WINED3D_RTYPE_NONE, WINED3D_BIND_RENDER_TARGET, WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3D11_FORMAT_SUPPORT_BLENDABLE},
- };
HRESULT hr;
- FIXME("iface %p, format %u, format_support %p partial-stub!\n", iface, format, format_support);
+ TRACE("iface %p, format %u, format_support %p.\n", iface, format, format_support);
+
+ if (!format_support)
+ return E_INVALIDARG;
wined3d_format = wined3dformat_from_dxgi_format(format);
if (format && !wined3d_format)
@@ -3884,66 +3859,12 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device2 *
return E_FAIL;
}
- *format_support = 0;
-
wined3d_mutex_lock();
- 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);
- for (i = 0; i < ARRAY_SIZE(flag_mapping); ++i)
- {
- hr = wined3d_check_device_format(wined3d, wined3d_adapter, params.device_type,
- WINED3DFMT_UNKNOWN, flag_mapping[i].usage, flag_mapping[i].bind_flags, flag_mapping[i].rtype, wined3d_format);
- if (hr == WINED3DERR_NOTAVAILABLE || hr == WINED3DOK_NOMIPGEN)
- continue;
- if (hr != WINED3D_OK)
- {
- WARN("Failed to check device format support, hr %#lx.\n", hr);
- wined3d_mutex_unlock();
- return E_FAIL;
- }
-
- *format_support |= flag_mapping[i].flag;
- }
+ hr = wined3d_device_check_format_support(device->wined3d_device, wined3d_format,
+ format_support, NULL);
wined3d_mutex_unlock();
- if (feature_level < D3D_FEATURE_LEVEL_10_0)
- *format_support &= ~D3D11_FORMAT_SUPPORT_BUFFER;
-
- if (*format_support & (D3D11_FORMAT_SUPPORT_TEXTURE1D
- | D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D))
- {
- *format_support |= D3D11_FORMAT_SUPPORT_SHADER_LOAD;
- *format_support |= D3D11_FORMAT_SUPPORT_SHADER_SAMPLE;
- *format_support |= D3D11_FORMAT_SUPPORT_TEXTURECUBE;
-
- if (feature_level >= D3D_FEATURE_LEVEL_10_1)
- *format_support |= D3D11_FORMAT_SUPPORT_SHADER_GATHER;
-
- if (*format_support & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)
- {
- if (feature_level >= D3D_FEATURE_LEVEL_10_0)
- *format_support |= D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON;
-
- if (feature_level >= D3D_FEATURE_LEVEL_10_1)
- *format_support |= D3D11_FORMAT_SUPPORT_SHADER_GATHER_COMPARISON;
- }
- }
-
- /* d3d11 requires 4 and 8 sample counts support for formats reported to
- * support multisample. */
- if (wined3d_check_device_multisample_type(wined3d_adapter, params.device_type, wined3d_format,
- TRUE, WINED3D_MULTISAMPLE_4_SAMPLES, NULL) == WINED3D_OK &&
- wined3d_check_device_multisample_type(wined3d_adapter, params.device_type, wined3d_format,
- TRUE, WINED3D_MULTISAMPLE_8_SAMPLES, NULL) == WINED3D_OK)
- {
- *format_support |= D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE
- | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
- | D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD;
- }
-
- return S_OK;
+ return hr;
}
static HRESULT STDMETHODCALLTYPE d3d11_device_CheckMultisampleQualityLevels(ID3D11Device2 *iface,
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 8225237568f..29f51af680c 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -20648,7 +20648,8 @@ static void check_format_support(const unsigned int *format_support, D3D_FEATURE
if (formats[i].fl_required <= feature_level)
{
- todo_wine_if (feature_flag == D3D11_FORMAT_SUPPORT_DISPLAY)
+ todo_wine_if (feature_flag == D3D11_FORMAT_SUPPORT_DISPLAY
+ && format == DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM)
ok(supported, "Format %#x - %s not supported, feature_level %#x, format support %#x.\n",
format, feature_name, feature_level, format_support[format]);
continue;
@@ -20662,7 +20663,8 @@ static void check_format_support(const unsigned int *format_support, D3D_FEATURE
continue;
}
- todo_wine_if (feature_flag != D3D11_FORMAT_SUPPORT_DISPLAY)
+ todo_wine_if (feature_flag != D3D11_FORMAT_SUPPORT_DISPLAY
+ && feature_flag != D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER)
ok(!supported, "Format %#x - %s supported, feature level %#x, format support %#x.\n",
format, feature_name, feature_level, format_support[format]);
}
@@ -20743,7 +20745,6 @@ static void test_format_support(const D3D_FEATURE_LEVEL feature_level)
ok(format_support[DXGI_FORMAT_R8G8B8A8_UNORM] & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE,
"SHADER_SAMPLE is not supported for R8G8B8A8_UNORM.\n");
- todo_wine
ok(!(format_support[DXGI_FORMAT_R32G32B32A32_UINT] & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE),
"SHADER_SAMPLE is supported for R32G32B32A32_UINT.\n");
if (feature_level >= D3D_FEATURE_LEVEL_10_0)
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/131
More information about the wine-devel
mailing list