From f9fe72536100b4beb8544e870cb8f17fbc663ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Sun, 17 Mar 2019 18:51:05 +0100 Subject: [PATCH] wined3d: Make adapter partially responsible for filling wined3d caps. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- 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 e7dd0dac961..4b544550429 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 d51e672a137..d2e44f4955d 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 9bf579ec461..a18e2ec0d91 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 2f8ed5efc77..9e4eb877567 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);