[PATCH 5/5] d3d9: Report d3d9 adapter group information in device caps.

Zhiyi Zhang zzhang at codeweavers.com
Fri Mar 13 04:36:18 CDT 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/d3d9/d3d9_private.h | 19 +++++++++--------
 dlls/d3d9/device.c       | 46 +++++++++++++++++++++++++++++++++-------
 dlls/d3d9/directx.c      |  2 +-
 dlls/wined3d/directx.c   |  4 ----
 include/wine/wined3d.h   |  4 ----
 5 files changed, 49 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index a0daaf42880..7f0901805b0 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -52,15 +52,6 @@
 
 extern const struct wined3d_parent_ops d3d9_null_wined3d_parent_ops DECLSPEC_HIDDEN;
 
-HRESULT vdecl_convert_fvf(DWORD FVF, D3DVERTEXELEMENT9 **ppVertexElements) DECLSPEC_HIDDEN;
-D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN;
-BOOL is_gdi_compat_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN;
-enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN;
-unsigned int wined3dmapflags_from_d3dmapflags(unsigned int flags, unsigned int usage) DECLSPEC_HIDDEN;
-void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS *present_parameters,
-        const struct wined3d_swapchain_desc *swapchain_desc, DWORD presentation_interval) DECLSPEC_HIDDEN;
-void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d_caps) DECLSPEC_HIDDEN;
-
 struct d3d9
 {
     IDirect3D9Ex IDirect3D9Ex_iface;
@@ -71,6 +62,16 @@ struct d3d9
     BOOL extended;
 };
 
+HRESULT vdecl_convert_fvf(DWORD FVF, D3DVERTEXELEMENT9 **ppVertexElements) DECLSPEC_HIDDEN;
+D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN;
+BOOL is_gdi_compat_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN;
+enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN;
+unsigned int wined3dmapflags_from_d3dmapflags(unsigned int flags, unsigned int usage) DECLSPEC_HIDDEN;
+void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS *present_parameters,
+        const struct wined3d_swapchain_desc *swapchain_desc, DWORD presentation_interval) DECLSPEC_HIDDEN;
+void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d_caps,
+        const struct d3d9 *d3d9, unsigned int adapter_ordinal) DECLSPEC_HIDDEN;
+
 BOOL d3d9_init(struct d3d9 *d3d9, BOOL extended) DECLSPEC_HIDDEN;
 
 struct fvf_declaration
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index b4887dff450..393069d6b9e 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -360,7 +360,8 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch
     return TRUE;
 }
 
-void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d_caps)
+void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d_caps,
+        const struct d3d9 *d3d9, unsigned int adapter_ordinal)
 {
     static const DWORD ps_minor_version[] = {0, 4, 0, 0};
     static const DWORD vs_minor_version[] = {0, 1, 0, 0};
@@ -370,9 +371,12 @@ void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d
         D3DPTFILTERCAPS_MIPFPOINT      | D3DPTFILTERCAPS_MIPFLINEAR    | D3DPTFILTERCAPS_MAGFPOINT       |
         D3DPTFILTERCAPS_MAGFLINEAR     |D3DPTFILTERCAPS_MAGFANISOTROPIC|D3DPTFILTERCAPS_MAGFPYRAMIDALQUAD|
         D3DPTFILTERCAPS_MAGFGAUSSIANQUAD;
+    struct wined3d_output *wined3d_output, *master_output;
+    struct wined3d_adapter *wined3d_adapter;
+    unsigned int output_idx, output_count;
 
     caps->DeviceType                        = (D3DDEVTYPE)wined3d_caps->DeviceType;
-    caps->AdapterOrdinal                    = wined3d_caps->AdapterOrdinal;
+    caps->AdapterOrdinal                    = adapter_ordinal;
     caps->Caps                              = wined3d_caps->Caps;
     caps->Caps2                             = wined3d_caps->Caps2;
     caps->Caps3                             = wined3d_caps->Caps3;
@@ -426,9 +430,6 @@ void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d
     caps->PixelShader1xMaxValue             = wined3d_caps->PixelShader1xMaxValue;
     caps->DevCaps2                          = wined3d_caps->DevCaps2;
     caps->MaxNpatchTessellationLevel        = wined3d_caps->MaxNpatchTessellationLevel;
-    caps->MasterAdapterOrdinal              = wined3d_caps->MasterAdapterOrdinal;
-    caps->AdapterOrdinalInGroup             = wined3d_caps->AdapterOrdinalInGroup;
-    caps->NumberOfAdaptersInGroup           = wined3d_caps->NumberOfAdaptersInGroup;
     caps->DeclTypes                         = wined3d_caps->DeclTypes;
     caps->NumSimultaneousRTs                = wined3d_caps->NumSimultaneousRTs;
     caps->StretchRectFilterCaps             = wined3d_caps->StretchRectFilterCaps;
@@ -520,6 +521,33 @@ void d3dcaps_from_wined3dcaps(D3DCAPS9 *caps, const struct wined3d_caps *wined3d
         DWORD major = caps->VertexShaderVersion;
         caps->VertexShaderVersion = D3DVS_VERSION(major, vs_minor_version[major]);
     }
+
+    /* Get adapter group information */
+    output_idx = adapter_ordinal;
+    wined3d_output = d3d9->wined3d_outputs[output_idx];
+    wined3d_adapter = wined3d_output_get_adapter(wined3d_output);
+
+    master_output = wined3d_adapter_get_output(wined3d_adapter, 0);
+    for (output_idx = 0; output_idx < d3d9->wined3d_output_count; ++output_idx)
+    {
+        if (master_output == d3d9->wined3d_outputs[output_idx])
+        {
+            caps->MasterAdapterOrdinal = output_idx;
+            break;
+        }
+    }
+
+    output_count = wined3d_adapter_get_output_count(wined3d_adapter);
+    for (output_idx = 0; output_idx < output_count; ++output_idx)
+    {
+        if (wined3d_output == wined3d_adapter_get_output(wined3d_adapter, output_idx))
+        {
+            caps->AdapterOrdinalInGroup = output_idx;
+            break;
+        }
+    }
+
+    caps->NumberOfAdaptersInGroup = caps->AdapterOrdinalInGroup ? 0 : output_count;
 }
 
 static void device_reset_viewport_state(struct d3d9_device *device)
@@ -709,7 +737,7 @@ static HRESULT WINAPI d3d9_device_GetDeviceCaps(IDirect3DDevice9Ex *iface, D3DCA
     hr = wined3d_device_get_device_caps(device->wined3d_device, &wined3d_caps);
     wined3d_mutex_unlock();
 
-    d3dcaps_from_wined3dcaps(caps, &wined3d_caps);
+    d3dcaps_from_wined3dcaps(caps, &wined3d_caps, device->d3d_parent, device->adapter_ordinal);
 
     return hr;
 }
@@ -4592,9 +4620,10 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
     struct wined3d_swapchain_desc *swapchain_desc;
     struct wined3d_adapter *wined3d_adapter;
     struct d3d9_swapchain *d3d_swapchain;
-    struct wined3d_caps caps;
+    struct wined3d_caps wined3d_caps;
     unsigned int output_idx;
     unsigned i, count = 1;
+    D3DCAPS9 caps;
     HRESULT hr;
 
     static const enum wined3d_feature_level feature_levels[] =
@@ -4633,7 +4662,8 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
         return hr;
     }
 
-    wined3d_get_device_caps(wined3d_adapter, device_type, &caps);
+    wined3d_get_device_caps(wined3d_adapter, device_type, &wined3d_caps);
+    d3dcaps_from_wined3dcaps(&caps, &wined3d_caps, parent, adapter);
     device->max_user_clip_planes = caps.MaxUserClipPlanes;
     device->vs_uniform_count = caps.MaxVertexShaderConst;
     if (flags & D3DCREATE_ADAPTERGROUP_DEVICE)
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index d79b32515fa..3d4e2392719 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -439,7 +439,7 @@ static HRESULT WINAPI d3d9_GetDeviceCaps(IDirect3D9Ex *iface, UINT adapter, D3DD
     hr = wined3d_get_device_caps(wined3d_adapter, device_type, &wined3d_caps);
     wined3d_mutex_unlock();
 
-    d3dcaps_from_wined3dcaps(caps, &wined3d_caps);
+    d3dcaps_from_wined3dcaps(caps, &wined3d_caps, d3d9, adapter);
 
     return hr;
 }
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8cf0d77e821..2fefb20a3e3 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1889,7 +1889,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d_adapter *adapter,
     d3d_info = &adapter->d3d_info;
 
     caps->DeviceType = (device_type == WINED3D_DEVICE_TYPE_HAL) ? WINED3D_DEVICE_TYPE_HAL : WINED3D_DEVICE_TYPE_REF;
-    caps->AdapterOrdinal           = adapter->ordinal;
 
     caps->Caps                     = 0;
     caps->Caps2                    = WINED3DCAPS2_CANRENDERWINDOWED |
@@ -2079,9 +2078,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d_adapter *adapter,
     caps->DevCaps2                          = WINED3DDEVCAPS2_STREAMOFFSET |
                                               WINED3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET;
     caps->MaxNpatchTessellationLevel        = 0;
-    caps->MasterAdapterOrdinal              = 0;
-    caps->AdapterOrdinalInGroup             = 0;
-    caps->NumberOfAdaptersInGroup           = 1;
 
     caps->NumSimultaneousRTs = d3d_info->limits.max_rt_count;
 
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index affeb891e75..c0a03e41f8f 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1911,7 +1911,6 @@ struct wined3d_ddraw_caps
 struct wined3d_caps
 {
     enum wined3d_device_type DeviceType;
-    UINT AdapterOrdinal;
 
     DWORD Caps;
     DWORD Caps2;
@@ -1979,9 +1978,6 @@ struct wined3d_caps
 
     float MaxNpatchTessellationLevel;
 
-    UINT MasterAdapterOrdinal;
-    UINT AdapterOrdinalInGroup;
-    UINT NumberOfAdaptersInGroup;
     DWORD DeclTypes;
     DWORD NumSimultaneousRTs;
     DWORD StretchRectFilterCaps;
-- 
2.20.1



More information about the wine-devel mailing list