mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-21 12:28:32 +00:00
wined3d: Add adapter_check_format() to adapter_ops.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0b7a403e93
commit
2727dcb07f
|
@ -4385,10 +4385,34 @@ static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, s
|
||||||
caps->MaxAnisotropy = gl_info->limits.anisotropy;
|
caps->MaxAnisotropy = gl_info->limits.anisotropy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
for (i = 0; i < adapter->cfg_count; ++i)
|
||||||
|
{
|
||||||
|
const struct wined3d_pixel_format *cfg = &adapter->cfgs[i];
|
||||||
|
|
||||||
|
if (wined3d_check_pixel_format_color(cfg, rt_format)
|
||||||
|
&& wined3d_check_pixel_format_depth(cfg, ds_format))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
|
static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
|
||||||
{
|
{
|
||||||
wined3d_adapter_gl_create_context,
|
wined3d_adapter_gl_create_context,
|
||||||
adapter_gl_get_wined3d_caps,
|
adapter_gl_get_wined3d_caps,
|
||||||
|
adapter_gl_check_format,
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter,
|
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter,
|
||||||
|
|
|
@ -1277,7 +1277,7 @@ HRESULT CDECL wined3d_get_adapter_raster_status(const struct wined3d *wined3d, U
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg,
|
BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg,
|
||||||
const struct wined3d_format *format)
|
const struct wined3d_format *format)
|
||||||
{
|
{
|
||||||
/* Float formats need FBOs. If FBOs are used this function isn't called */
|
/* Float formats need FBOs. If FBOs are used this function isn't called */
|
||||||
|
@ -1297,7 +1297,7 @@ static BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg,
|
BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg,
|
||||||
const struct wined3d_format *format)
|
const struct wined3d_format *format)
|
||||||
{
|
{
|
||||||
BOOL lockable = FALSE;
|
BOOL lockable = FALSE;
|
||||||
|
@ -1331,6 +1331,7 @@ 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,
|
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)
|
enum wined3d_format_id render_target_format_id, enum wined3d_format_id depth_stencil_format_id)
|
||||||
{
|
{
|
||||||
|
const struct wined3d_format *adapter_format;
|
||||||
const struct wined3d_format *rt_format;
|
const struct wined3d_format *rt_format;
|
||||||
const struct wined3d_format *ds_format;
|
const struct wined3d_format *ds_format;
|
||||||
const struct wined3d_adapter *adapter;
|
const struct wined3d_adapter *adapter;
|
||||||
|
@ -1344,6 +1345,8 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
|
||||||
return WINED3DERR_INVALIDCALL;
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
|
||||||
adapter = wined3d->adapters[adapter_idx];
|
adapter = wined3d->adapters[adapter_idx];
|
||||||
|
|
||||||
|
adapter_format = wined3d_get_format(adapter, adapter_format_id, WINED3D_BIND_RENDER_TARGET);
|
||||||
rt_format = wined3d_get_format(adapter, render_target_format_id, WINED3D_BIND_RENDER_TARGET);
|
rt_format = wined3d_get_format(adapter, render_target_format_id, WINED3D_BIND_RENDER_TARGET);
|
||||||
ds_format = wined3d_get_format(adapter, depth_stencil_format_id, WINED3D_BIND_DEPTH_STENCIL);
|
ds_format = wined3d_get_format(adapter, depth_stencil_format_id, WINED3D_BIND_DEPTH_STENCIL);
|
||||||
|
|
||||||
|
@ -1358,33 +1361,17 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
|
||||||
return WINED3DERR_NOTAVAILABLE;
|
return WINED3DERR_NOTAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
|
if (adapter->adapter_ops->adapter_check_format(adapter, adapter_format, rt_format, ds_format))
|
||||||
{
|
{
|
||||||
const struct wined3d_pixel_format *cfgs;
|
TRACE("Formats match.\n");
|
||||||
unsigned int cfg_count;
|
return WINED3D_OK;
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
cfgs = adapter->cfgs;
|
|
||||||
cfg_count = adapter->cfg_count;
|
|
||||||
for (i = 0; i < cfg_count; ++i)
|
|
||||||
{
|
|
||||||
if (wined3d_check_pixel_format_color(&cfgs[i], rt_format)
|
|
||||||
&& wined3d_check_pixel_format_depth(&cfgs[i], ds_format))
|
|
||||||
{
|
|
||||||
TRACE("Formats match.\n");
|
|
||||||
return WINED3D_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("Unsupported format pair: %s and %s.\n",
|
|
||||||
debug_d3dformat(render_target_format_id),
|
|
||||||
debug_d3dformat(depth_stencil_format_id));
|
|
||||||
|
|
||||||
return WINED3DERR_NOTAVAILABLE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Formats match.\n");
|
TRACE("Unsupported format pair: %s and %s.\n",
|
||||||
return WINED3D_OK;
|
debug_d3dformat(render_target_format_id),
|
||||||
|
debug_d3dformat(depth_stencil_format_id));
|
||||||
|
|
||||||
|
return WINED3DERR_NOTAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3d, UINT adapter_idx,
|
HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3d, UINT adapter_idx,
|
||||||
|
@ -2336,10 +2323,18 @@ static void adapter_no3d_get_wined3d_caps(const struct wined3d_adapter *adapter,
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL adapter_no3d_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)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
|
static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
|
||||||
{
|
{
|
||||||
wined3d_adapter_no3d_create_context,
|
wined3d_adapter_no3d_create_context,
|
||||||
adapter_no3d_get_wined3d_caps,
|
adapter_no3d_get_wined3d_caps,
|
||||||
|
adapter_no3d_check_format,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, unsigned int wined3d_creation_flags)
|
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, unsigned int wined3d_creation_flags)
|
||||||
|
|
|
@ -2680,6 +2680,9 @@ struct wined3d_adapter_ops
|
||||||
BOOL (*adapter_create_context)(struct wined3d_context *context,
|
BOOL (*adapter_create_context)(struct wined3d_context *context,
|
||||||
struct wined3d_texture *target, const struct wined3d_format *ds_format);
|
struct wined3d_texture *target, const struct wined3d_format *ds_format);
|
||||||
void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
|
void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
|
||||||
|
BOOL (*adapter_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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The adapter structure */
|
/* The adapter structure */
|
||||||
|
@ -4721,4 +4724,9 @@ 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 */
|
/* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
|
||||||
#define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
|
#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
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue