wined3d_check_pixel_format_{color,depth}() functions are moved to adapter_gl.c.
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/wined3d/adapter_gl.c | 73 ++++++++++++++++++++++++++++- dlls/wined3d/directx.c | 86 +--------------------------------- dlls/wined3d/wined3d_private.h | 5 -- 3 files changed, 73 insertions(+), 91 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 30c1515bbdaa..3aaceaf5a9aa 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -4385,6 +4385,56 @@ static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, s caps->MaxAnisotropy = gl_info->limits.anisotropy; }
+static BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg, + const struct wined3d_format *format) +{ + /* Float formats need FBOs. If FBOs are used this function isn't called */ + if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT) + return FALSE; + + /* Probably a RGBA_float or color index mode. */ + if (cfg->iPixelType != WGL_TYPE_RGBA_ARB) + return FALSE; + + if (cfg->redSize < format->red_size + || cfg->greenSize < format->green_size + || cfg->blueSize < format->blue_size + || cfg->alphaSize < format->alpha_size) + return FALSE; + + return TRUE; +} + +static BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg, + const struct wined3d_format *format) +{ + BOOL lockable = FALSE; + + /* Float formats need FBOs. If FBOs are used this function isn't called */ + if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT) + return FALSE; + + if ((format->id == WINED3DFMT_D16_LOCKABLE) || (format->id == WINED3DFMT_D32_FLOAT)) + lockable = TRUE; + + /* On some modern cards like the Geforce8/9, GLX doesn't offer some + * depth/stencil formats which D3D9 reports. We can safely report + * "compatible" formats (e.g. D24 can be used for D16) as long as we + * aren't dealing with a lockable format. This also helps D3D <= 7 as they + * expect D16 which isn't offered without this on Geforce8 cards. */ + if (!(cfg->depthSize == format->depth_size || (!lockable && cfg->depthSize > format->depth_size))) + return FALSE; + + /* Some cards like Intel i915 ones only offer D24S8 but lots of games also + * need a format without stencil. We can allow a mismatch if the format + * doesn't have any stencil bits. If it does have stencil bits the size + * must match, or stencil wrapping would break. */ + if (format->stencil_size && cfg->stencilSize != format->stencil_size) + return FALSE; + + return TRUE; +} + static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter, const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format, const struct wined3d_format *ds_format) @@ -4394,14 +4444,35 @@ static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter, if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER) return TRUE;
+ if (adapter_format && rt_format) + { + /* In backbuffer mode the front and backbuffer share the same WGL + * pixelformat. The format must match in RGB, alpha is allowed to be + * different. (Only the backbuffer can have alpha.) */ + if (adapter_format->red_size != rt_format->red_size + || adapter_format->green_size != rt_format->green_size + || adapter_format->blue_size != rt_format->blue_size) + { + TRACE("Render target format %s doesn't match with adapter format %s.\n", + debug_d3dformat(rt_format->id), debug_d3dformat(adapter_format->id)); + return FALSE; + } + } + for (i = 0; i < adapter->cfg_count; ++i) { const struct wined3d_pixel_format *cfg = &adapter->cfgs[i];
+ /* Check if there is a WGL pixel format matching the requirements, the format should also be window + * drawable (not offscreen; e.g. Nvidia offers R5G6B5 for pbuffers even when X is running at 24bit) */ + if (adapter_format && rt_format && !cfg->windowDrawable) + continue; + if ((!adapter_format || wined3d_check_pixel_format_color(cfg, adapter_format)) && (!rt_format || wined3d_check_pixel_format_color(cfg, rt_format)) - && wined3d_check_pixel_format_depth(cfg, ds_format)) + && (!ds_format || wined3d_check_pixel_format_depth(cfg, ds_format))) { + TRACE("Pixel format %d is compatible.\n", cfg->iPixelFormat); return TRUE; } } diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 260fcc342326..75f1fddf5d42 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -1277,56 +1277,6 @@ HRESULT CDECL wined3d_get_adapter_raster_status(const struct wined3d *wined3d, U return WINED3D_OK; }
-BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg, - const struct wined3d_format *format) -{ - /* Float formats need FBOs. If FBOs are used this function isn't called */ - if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT) - return FALSE; - - /* Probably a RGBA_float or color index mode. */ - if (cfg->iPixelType != WGL_TYPE_RGBA_ARB) - return FALSE; - - if (cfg->redSize < format->red_size - || cfg->greenSize < format->green_size - || cfg->blueSize < format->blue_size - || cfg->alphaSize < format->alpha_size) - return FALSE; - - return TRUE; -} - -BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg, - const struct wined3d_format *format) -{ - BOOL lockable = FALSE; - - /* Float formats need FBOs. If FBOs are used this function isn't called */ - if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT) - return FALSE; - - if ((format->id == WINED3DFMT_D16_LOCKABLE) || (format->id == WINED3DFMT_D32_FLOAT)) - lockable = TRUE; - - /* On some modern cards like the Geforce8/9, GLX doesn't offer some - * depth/stencil formats which D3D9 reports. We can safely report - * "compatible" formats (e.g. D24 can be used for D16) as long as we - * aren't dealing with a lockable format. This also helps D3D <= 7 as they - * expect D16 which isn't offered without this on Geforce8 cards. */ - if (!(cfg->depthSize == format->depth_size || (!lockable && cfg->depthSize > format->depth_size))) - return FALSE; - - /* Some cards like Intel i915 ones only offer D24S8 but lots of games also - * need a format without stencil. We can allow a mismatch if the format - * doesn't have any stencil bits. If it does have stencil bits the size - * must match, or stencil wrapping would break. */ - if (format->stencil_size && cfg->stencilSize != format->stencil_size) - return FALSE; - - return TRUE; -} - HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d, UINT adapter_idx, enum wined3d_device_type device_type, enum wined3d_format_id adapter_format_id, enum wined3d_format_id render_target_format_id, enum wined3d_format_id depth_stencil_format_id) @@ -1446,41 +1396,7 @@ static BOOL wined3d_check_render_target_format(const struct wined3d_adapter *ada if (!(rt_format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE;
- if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) - { - const struct wined3d_pixel_format *cfgs = adapter->cfgs; - unsigned int i; - - /* In backbuffer mode the front and backbuffer share the same WGL - * pixelformat. The format must match in RGB, alpha is allowed to be - * different. (Only the backbuffer can have alpha.) */ - if (adapter_format->red_size != rt_format->red_size - || adapter_format->green_size != rt_format->green_size - || adapter_format->blue_size != rt_format->blue_size) - { - TRACE("Render target format %s doesn't match with adapter format %s.\n", - debug_d3dformat(rt_format->id), debug_d3dformat(adapter_format->id)); - return FALSE; - } - - /* Check if there is a WGL pixel format matching the requirements, the format should also be window - * drawable (not offscreen; e.g. Nvidia offers R5G6B5 for pbuffers even when X is running at 24bit) */ - for (i = 0; i < adapter->cfg_count; ++i) - { - if (cfgs[i].windowDrawable - && wined3d_check_pixel_format_color(&cfgs[i], adapter_format) - && wined3d_check_pixel_format_color(&cfgs[i], rt_format)) - { - TRACE("Pixel format %d is compatible with format %s.\n", - cfgs[i].iPixelFormat, debug_d3dformat(rt_format->id)); - return TRUE; - } - } - - return FALSE; - } - - return TRUE; + return adapter->adapter_ops->adapter_check_format(adapter, adapter_format, rt_format, NULL); }
static BOOL wined3d_check_surface_format(const struct wined3d_format *format) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 83fc09ddc432..b9f906a143f0 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4724,9 +4724,4 @@ static inline void wined3d_not_from_cs(struct wined3d_cs *cs) /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */ #define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
-BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg, - const struct wined3d_format *format) DECLSPEC_HIDDEN; -BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg, - const struct wined3d_format *format) DECLSPEC_HIDDEN; - #endif
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=50072
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/wined3d/directx.c:1428 error: patch failed: dlls/wined3d/directx.c:1434 error: patch failed: dlls/wined3d/directx.c:1463 error: patch failed: dlls/wined3d/directx.c:1506 error: patch failed: dlls/wined3d/directx.c:1335 error: patch failed: dlls/wined3d/adapter_gl.c:4385 error: patch failed: dlls/wined3d/directx.c:1277 error: patch failed: dlls/wined3d/wined3d_private.h:2680 error: patch failed: dlls/wined3d/adapter_gl.c:4398 error: patch failed: dlls/wined3d/directx.c:1331 error: patch failed: dlls/wined3d/directx.c:1468 error: patch failed: dlls/wined3d/adapter_gl.c:4385 error: patch failed: dlls/wined3d/directx.c:1277 error: patch failed: dlls/wined3d/wined3d_private.h:4724 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/wined3d/directx.c:1428 error: patch failed: dlls/wined3d/directx.c:1434 error: patch failed: dlls/wined3d/directx.c:1463 error: patch failed: dlls/wined3d/directx.c:1506 error: patch failed: dlls/wined3d/directx.c:1335 error: patch failed: dlls/wined3d/adapter_gl.c:4385 error: patch failed: dlls/wined3d/directx.c:1277 error: patch failed: dlls/wined3d/wined3d_private.h:2680 error: patch failed: dlls/wined3d/adapter_gl.c:4398 error: patch failed: dlls/wined3d/directx.c:1331 error: patch failed: dlls/wined3d/directx.c:1468 error: patch failed: dlls/wined3d/adapter_gl.c:4385 error: patch failed: dlls/wined3d/directx.c:1277 error: patch failed: dlls/wined3d/wined3d_private.h:4724 Task: Patch failed to apply