[PATCH 2/3] wined3d: Make adapter partially responsible for filling wined3d caps.
Józef Kucia
jkucia at codeweavers.com
Sun Mar 17 12:51:05 CDT 2019
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/adapter_gl.c | 146 ++++++++++++++++++++++++++++++
dlls/wined3d/directx.c | 159 +++------------------------------
dlls/wined3d/wined3d_private.h | 2 +
include/wine/wined3d.h | 2 +-
4 files changed, 162 insertions(+), 147 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index e7dd0dac961d..4b5445504295 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4246,9 +4246,155 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc
}
}
+static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
+{
+ const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
+ const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+
+ if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] || gl_info->supported[EXT_FRAMEBUFFER_OBJECT])
+ caps->Caps2 |= WINED3DCAPS2_CANGENMIPMAP;
+
+ if (gl_info->supported[WINED3D_GL_BLEND_EQUATION])
+ caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_BLENDOP;
+ if (gl_info->supported[EXT_BLEND_EQUATION_SEPARATE] && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
+ caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
+ if (gl_info->supported[EXT_DRAW_BUFFERS2])
+ caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
+ if (gl_info->supported[ARB_FRAMEBUFFER_SRGB])
+ caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT;
+
+ if (gl_info->supported[ARB_TEXTURE_FILTER_ANISOTROPIC])
+ {
+ caps->RasterCaps |= WINED3DPRASTERCAPS_ANISOTROPY
+ | WINED3DPRASTERCAPS_ZBIAS
+ | WINED3DPRASTERCAPS_MIPMAPLODBIAS;
+ }
+
+ if (gl_info->supported[ARB_BLEND_FUNC_EXTENDED])
+ caps->DestBlendCaps |= WINED3DPBLENDCAPS_SRCALPHASAT;
+
+ if (gl_info->supported[EXT_BLEND_COLOR])
+ {
+ caps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
+ caps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
+ }
+
+ if (gl_info->supported[EXT_TEXTURE3D])
+ {
+ caps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP
+ | WINED3DPTEXTURECAPS_MIPVOLUMEMAP;
+ if (!d3d_info->texture_npot)
+ caps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP_POW2;
+ }
+
+ if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
+ {
+ caps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP
+ | WINED3DPTEXTURECAPS_MIPCUBEMAP;
+ if (!d3d_info->texture_npot)
+ caps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP_POW2;
+ }
+
+ if (gl_info->supported[ARB_TEXTURE_FILTER_ANISOTROPIC])
+ {
+ caps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC
+ | WINED3DPTFILTERCAPS_MINFANISOTROPIC;
+ }
+
+ if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
+ {
+ caps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFLINEAR
+ | WINED3DPTFILTERCAPS_MAGFPOINT
+ | WINED3DPTFILTERCAPS_MINFLINEAR
+ | WINED3DPTFILTERCAPS_MINFPOINT
+ | WINED3DPTFILTERCAPS_MIPFLINEAR
+ | WINED3DPTFILTERCAPS_MIPFPOINT
+ | WINED3DPTFILTERCAPS_LINEAR
+ | WINED3DPTFILTERCAPS_LINEARMIPLINEAR
+ | WINED3DPTFILTERCAPS_LINEARMIPNEAREST
+ | WINED3DPTFILTERCAPS_MIPLINEAR
+ | WINED3DPTFILTERCAPS_MIPNEAREST
+ | WINED3DPTFILTERCAPS_NEAREST;
+
+ if (gl_info->supported[ARB_TEXTURE_FILTER_ANISOTROPIC])
+ {
+ caps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC
+ | WINED3DPTFILTERCAPS_MINFANISOTROPIC;
+ }
+ }
+
+ if (gl_info->supported[EXT_TEXTURE3D])
+ {
+ caps->VolumeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFLINEAR
+ | WINED3DPTFILTERCAPS_MAGFPOINT
+ | WINED3DPTFILTERCAPS_MINFLINEAR
+ | WINED3DPTFILTERCAPS_MINFPOINT
+ | WINED3DPTFILTERCAPS_MIPFLINEAR
+ | WINED3DPTFILTERCAPS_MIPFPOINT
+ | WINED3DPTFILTERCAPS_LINEAR
+ | WINED3DPTFILTERCAPS_LINEARMIPLINEAR
+ | WINED3DPTFILTERCAPS_LINEARMIPNEAREST
+ | WINED3DPTFILTERCAPS_MIPLINEAR
+ | WINED3DPTFILTERCAPS_MIPNEAREST
+ | WINED3DPTFILTERCAPS_NEAREST;
+ }
+
+ if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
+ {
+ caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
+ }
+ if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
+ {
+ caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
+ }
+ if (gl_info->supported[ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE])
+ {
+ caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
+ }
+
+ if (gl_info->supported[EXT_TEXTURE3D])
+ {
+ caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_INDEPENDENTUV
+ | WINED3DPTADDRESSCAPS_CLAMP
+ | WINED3DPTADDRESSCAPS_WRAP;
+
+ if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
+ {
+ caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
+ }
+ if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
+ {
+ caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
+ }
+ if (gl_info->supported[ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE])
+ {
+ caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
+ }
+ }
+
+ if (gl_info->supported[EXT_TEXTURE3D])
+ caps->MaxVolumeExtent = gl_info->limits.texture3d_size;
+
+ if (gl_info->supported[EXT_STENCIL_WRAP])
+ {
+ caps->StencilCaps |= WINED3DSTENCILCAPS_DECR
+ | WINED3DSTENCILCAPS_INCR;
+ }
+
+ if (gl_info->supported[WINED3D_GL_VERSION_2_0]
+ || gl_info->supported[EXT_STENCIL_TWO_SIDE]
+ || gl_info->supported[ATI_SEPARATE_STENCIL])
+ {
+ caps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED;
+ }
+
+ caps->MaxAnisotropy = gl_info->limits.anisotropy;
+}
+
static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
{
wined3d_adapter_gl_create_context,
+ adapter_gl_get_wined3d_caps,
};
BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, DWORD wined3d_creation_flags)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index d51e672a137e..d2e44f4955d5 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1871,7 +1871,7 @@ HRESULT CDECL wined3d_check_device_type(const struct wined3d *wined3d, UINT adap
return WINED3D_OK;
}
-HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapter_idx,
+HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, unsigned int adapter_idx,
enum wined3d_device_type device_type, struct wined3d_caps *caps)
{
const struct wined3d_adapter *adapter = &wined3d->adapters[adapter_idx];
@@ -1895,8 +1895,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->Caps2 = WINED3DCAPS2_CANRENDERWINDOWED |
WINED3DCAPS2_FULLSCREENGAMMA |
WINED3DCAPS2_DYNAMICTEXTURES;
- if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] || gl_info->supported[EXT_FRAMEBUFFER_OBJECT])
- caps->Caps2 |= WINED3DCAPS2_CANGENMIPMAP;
caps->Caps3 = WINED3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD |
WINED3DCAPS3_COPY_TO_VIDMEM |
@@ -1934,15 +1932,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
WINED3DPMISCCAPS_FOGVERTEXCLAMPED */
- if (gl_info->supported[WINED3D_GL_BLEND_EQUATION])
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_BLENDOP;
- if (gl_info->supported[EXT_BLEND_EQUATION_SEPARATE] && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
- if (gl_info->supported[EXT_DRAW_BUFFERS2])
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
- if (gl_info->supported[ARB_FRAMEBUFFER_SRGB])
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT;
-
caps->RasterCaps = WINED3DPRASTERCAPS_DITHER |
WINED3DPRASTERCAPS_PAT |
WINED3DPRASTERCAPS_WFOG |
@@ -1956,13 +1945,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
WINED3DPRASTERCAPS_SLOPESCALEDEPTHBIAS |
WINED3DPRASTERCAPS_DEPTHBIAS;
- if (gl_info->supported[ARB_TEXTURE_FILTER_ANISOTROPIC])
- {
- caps->RasterCaps |= WINED3DPRASTERCAPS_ANISOTROPY |
- WINED3DPRASTERCAPS_ZBIAS |
- WINED3DPRASTERCAPS_MIPMAPLODBIAS;
- }
-
caps->ZCmpCaps = WINED3DPCMPCAPS_ALWAYS |
WINED3DPCMPCAPS_EQUAL |
WINED3DPCMPCAPS_GREATER |
@@ -1999,16 +1981,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
WINED3DPBLENDCAPS_SRCCOLOR |
WINED3DPBLENDCAPS_ZERO;
- if (gl_info->supported[ARB_BLEND_FUNC_EXTENDED])
- caps->DestBlendCaps |= WINED3DPBLENDCAPS_SRCALPHASAT;
-
- if (gl_info->supported[EXT_BLEND_COLOR])
- {
- caps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
- caps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR;
- }
-
-
caps->AlphaCmpCaps = WINED3DPCMPCAPS_ALWAYS |
WINED3DPCMPCAPS_EQUAL |
WINED3DPCMPCAPS_GREATER |
@@ -2042,22 +2014,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->TextureCaps |= WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL;
}
- if (gl_info->supported[EXT_TEXTURE3D])
- {
- caps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP
- | WINED3DPTEXTURECAPS_MIPVOLUMEMAP;
- if (!d3d_info->texture_npot)
- caps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP_POW2;
- }
-
- if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
- {
- caps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP
- | WINED3DPTEXTURECAPS_MIPCUBEMAP;
- if (!d3d_info->texture_npot)
- caps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP_POW2;
- }
-
caps->TextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR |
WINED3DPTFILTERCAPS_MAGFPOINT |
WINED3DPTFILTERCAPS_MINFLINEAR |
@@ -2071,97 +2027,14 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
WINED3DPTFILTERCAPS_MIPNEAREST |
WINED3DPTFILTERCAPS_NEAREST;
- if (gl_info->supported[ARB_TEXTURE_FILTER_ANISOTROPIC])
- {
- caps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC |
- WINED3DPTFILTERCAPS_MINFANISOTROPIC;
- }
-
- if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
- {
- caps->CubeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR |
- WINED3DPTFILTERCAPS_MAGFPOINT |
- WINED3DPTFILTERCAPS_MINFLINEAR |
- WINED3DPTFILTERCAPS_MINFPOINT |
- WINED3DPTFILTERCAPS_MIPFLINEAR |
- WINED3DPTFILTERCAPS_MIPFPOINT |
- WINED3DPTFILTERCAPS_LINEAR |
- WINED3DPTFILTERCAPS_LINEARMIPLINEAR |
- WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
- WINED3DPTFILTERCAPS_MIPLINEAR |
- WINED3DPTFILTERCAPS_MIPNEAREST |
- WINED3DPTFILTERCAPS_NEAREST;
-
- if (gl_info->supported[ARB_TEXTURE_FILTER_ANISOTROPIC])
- {
- caps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC |
- WINED3DPTFILTERCAPS_MINFANISOTROPIC;
- }
- }
- else
- {
- caps->CubeTextureFilterCaps = 0;
- }
-
- if (gl_info->supported[EXT_TEXTURE3D])
- {
- caps->VolumeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR |
- WINED3DPTFILTERCAPS_MAGFPOINT |
- WINED3DPTFILTERCAPS_MINFLINEAR |
- WINED3DPTFILTERCAPS_MINFPOINT |
- WINED3DPTFILTERCAPS_MIPFLINEAR |
- WINED3DPTFILTERCAPS_MIPFPOINT |
- WINED3DPTFILTERCAPS_LINEAR |
- WINED3DPTFILTERCAPS_LINEARMIPLINEAR |
- WINED3DPTFILTERCAPS_LINEARMIPNEAREST |
- WINED3DPTFILTERCAPS_MIPLINEAR |
- WINED3DPTFILTERCAPS_MIPNEAREST |
- WINED3DPTFILTERCAPS_NEAREST;
- }
- else
- {
- caps->VolumeTextureFilterCaps = 0;
- }
+ caps->CubeTextureFilterCaps = 0;
+ caps->VolumeTextureFilterCaps = 0;
caps->TextureAddressCaps = WINED3DPTADDRESSCAPS_INDEPENDENTUV |
WINED3DPTADDRESSCAPS_CLAMP |
WINED3DPTADDRESSCAPS_WRAP;
- if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
- {
- caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
- }
- if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
- {
- caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
- }
- if (gl_info->supported[ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE])
- {
- caps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
- }
-
- if (gl_info->supported[EXT_TEXTURE3D])
- {
- caps->VolumeTextureAddressCaps = WINED3DPTADDRESSCAPS_INDEPENDENTUV |
- WINED3DPTADDRESSCAPS_CLAMP |
- WINED3DPTADDRESSCAPS_WRAP;
- if (gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
- {
- caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER;
- }
- if (gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT])
- {
- caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR;
- }
- if (gl_info->supported[ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE])
- {
- caps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE;
- }
- }
- else
- {
- caps->VolumeTextureAddressCaps = 0;
- }
+ caps->VolumeTextureAddressCaps = 0;
caps->LineCaps = WINED3DLINECAPS_TEXTURE |
WINED3DLINECAPS_ZTEST |
@@ -2175,10 +2048,7 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->MaxTextureWidth = d3d_info->limits.texture_size;
caps->MaxTextureHeight = d3d_info->limits.texture_size;
- if (gl_info->supported[EXT_TEXTURE3D])
- caps->MaxVolumeExtent = gl_info->limits.texture3d_size;
- else
- caps->MaxVolumeExtent = 0;
+ caps->MaxVolumeExtent = 0;
caps->MaxTextureRepeat = 32768;
caps->MaxTextureAspectRatio = d3d_info->limits.texture_size;
@@ -2197,18 +2067,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
WINED3DSTENCILCAPS_KEEP |
WINED3DSTENCILCAPS_REPLACE |
WINED3DSTENCILCAPS_ZERO;
- if (gl_info->supported[EXT_STENCIL_WRAP])
- {
- caps->StencilCaps |= WINED3DSTENCILCAPS_DECR |
- WINED3DSTENCILCAPS_INCR;
- }
- if (gl_info->supported[WINED3D_GL_VERSION_2_0] || gl_info->supported[EXT_STENCIL_TWO_SIDE]
- || gl_info->supported[ATI_SEPARATE_STENCIL])
- {
- caps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED;
- }
- caps->MaxAnisotropy = gl_info->limits.anisotropy;
+ caps->MaxAnisotropy = 0;
caps->MaxPointSize = d3d_info->limits.pointsize_max;
caps->MaxPrimitiveCount = 0x555555; /* Taken from an AMD Radeon HD 5700 (Evergreen) GPU. */
@@ -2446,6 +2306,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->max_feature_level = d3d_info->feature_level;
+ adapter->adapter_ops->adapter_get_wined3d_caps(adapter, caps);
+
return WINED3D_OK;
}
@@ -2491,9 +2353,14 @@ static BOOL wined3d_adapter_no3d_create_context(struct wined3d_context *context,
return TRUE;
}
+static void adapter_no3d_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
+{
+}
+
static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
{
wined3d_adapter_no3d_create_context,
+ adapter_no3d_get_wined3d_caps,
};
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, DWORD wined3d_creation_flags)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9bf579ec4613..a18e2ec0d91a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -73,6 +73,7 @@
#define WINED3D_QUIRK_BROKEN_ARB_FOG 0x00000200
struct fragment_pipeline;
+struct wined3d_adapter;
struct wined3d_context;
struct wined3d_state;
struct wined3d_texture_gl;
@@ -2678,6 +2679,7 @@ struct wined3d_adapter_ops
{
BOOL (*adapter_create_context)(struct wined3d_context *context,
struct wined3d_texture *target, const struct wined3d_format *ds_format);
+ void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
};
BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 2f8ed5efc77f..9e4eb8775673 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2206,7 +2206,7 @@ UINT __cdecl wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT
enum wined3d_format_id format_id, enum wined3d_scanline_ordering scanline_ordering);
HRESULT __cdecl wined3d_get_adapter_raster_status(const struct wined3d *wined3d, UINT adapter_idx,
struct wined3d_raster_status *raster_status);
-HRESULT __cdecl wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapter_idx,
+HRESULT __cdecl wined3d_get_device_caps(const struct wined3d *wined3d, unsigned int adapter_idx,
enum wined3d_device_type device_type, struct wined3d_caps *caps);
HRESULT __cdecl wined3d_get_output_desc(const struct wined3d *wined3d, unsigned int adapter_idx,
struct wined3d_output_desc *desc);
--
2.19.2
More information about the wine-devel
mailing list