wined3d: Introduce a separate structure for OpenGL adapters.

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:
Józef Kucia 2019-03-22 09:42:05 +01:00 committed by Alexandre Julliard
parent 43965b9005
commit 7593a7544d
4 changed files with 94 additions and 37 deletions

View file

@ -3222,7 +3222,7 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info, struct
/* Context activation is done by the caller. */
static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
struct wined3d_caps_gl_ctx *caps_gl_ctx, DWORD wined3d_creation_flags)
struct wined3d_caps_gl_ctx *caps_gl_ctx, unsigned int wined3d_creation_flags)
{
static const struct
{
@ -4391,7 +4391,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
adapter_gl_get_wined3d_caps,
};
BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, DWORD wined3d_creation_flags)
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter,
unsigned int ordinal, unsigned int wined3d_creation_flags)
{
static const DWORD supported_gl_versions[] =
{
@ -4403,9 +4404,13 @@ BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, DWORD wined3d_crea
struct wined3d_caps_gl_ctx caps_gl_ctx = {0};
unsigned int i;
TRACE("adapter %p, wined3d_creation_flags %#x.\n", adapter, wined3d_creation_flags);
TRACE("adapter %p, ordinal %u, wined3d_creation_flags %#x.\n",
adapter, ordinal, wined3d_creation_flags);
/* Dynamically load all GL core functions */
if (!wined3d_adapter_init(adapter, ordinal))
return FALSE;
/* Dynamically load all GL core functions */
#ifdef USE_WIN32_OPENGL
{
HMODULE mod_gl = GetModuleHandleA("opengl32.dll");
@ -4496,3 +4501,21 @@ BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, DWORD wined3d_crea
return TRUE;
}
struct wined3d_adapter *wined3d_adapter_gl_create(unsigned int ordinal, unsigned int wined3d_creation_flags)
{
struct wined3d_adapter_gl *adapter;
if (!(adapter = heap_alloc_zero(sizeof(*adapter))))
return NULL;
if (!wined3d_adapter_gl_init(&adapter->a, ordinal, wined3d_creation_flags))
{
heap_free(adapter);
return NULL;
}
TRACE("Created adapter %p.\n", adapter);
return &adapter->a;
}

View file

@ -5322,7 +5322,7 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,
struct wined3d_device_parent *device_parent)
{
struct wined3d_adapter *adapter = &wined3d->adapters[adapter_idx];
struct wined3d_adapter *adapter = wined3d->adapters[adapter_idx];
const struct wined3d_vertex_pipe_ops *vertex_pipeline;
const struct fragment_pipeline *fragment_pipeline;
unsigned int i;

View file

@ -75,6 +75,8 @@ static void wined3d_adapter_cleanup(struct wined3d_adapter *adapter)
{
heap_free(adapter->formats);
heap_free(adapter->cfgs);
heap_free(adapter);
}
ULONG CDECL wined3d_incref(struct wined3d *wined3d)
@ -98,7 +100,7 @@ ULONG CDECL wined3d_decref(struct wined3d *wined3d)
for (i = 0; i < wined3d->adapter_count; ++i)
{
wined3d_adapter_cleanup(&wined3d->adapters[i]);
wined3d_adapter_cleanup(wined3d->adapters[i]);
}
heap_free(wined3d);
}
@ -738,7 +740,7 @@ HRESULT CDECL wined3d_get_output_desc(const struct wined3d *wined3d, unsigned in
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
if (!(monitor = MonitorFromPoint(adapter->monitor_position, MONITOR_DEFAULTTOPRIMARY)))
return WINED3DERR_INVALIDCALL;
@ -777,7 +779,7 @@ UINT CDECL wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT ad
if (adapter_idx >= wined3d->adapter_count)
return 0;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
format = wined3d_get_format(adapter, format_id, WINED3D_BIND_RENDER_TARGET);
format_bits = format->byte_count * CHAR_BIT;
@ -831,7 +833,7 @@ HRESULT CDECL wined3d_enum_adapter_modes(const struct wined3d *wined3d, UINT ada
if (!mode || adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
format = wined3d_get_format(adapter, format_id, WINED3D_BIND_RENDER_TARGET);
format_bits = format->byte_count * CHAR_BIT;
@ -1004,7 +1006,7 @@ HRESULT CDECL wined3d_get_adapter_display_mode(const struct wined3d *wined3d, UI
if (!mode || adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
memset(&m, 0, sizeof(m));
m.dmSize = sizeof(m);
@ -1078,7 +1080,7 @@ HRESULT CDECL wined3d_set_adapter_display_mode(struct wined3d *wined3d,
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
memset(&new_mode, 0, sizeof(new_mode));
new_mode.dmSize = sizeof(new_mode);
@ -1176,7 +1178,7 @@ HRESULT CDECL wined3d_get_adapter_identifier(const struct wined3d *wined3d,
if (adapter_idx >= wined3d->adapter_count)
goto fail;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
if (identifier->driver_size)
{
@ -1341,7 +1343,7 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
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);
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
@ -1404,7 +1406,7 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
return WINED3DERR_NOTAVAILABLE;
}
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
format = wined3d_get_format(adapter, surface_format_id, 0);
if (multisample_type && !(format->multisample_types & 1u << (multisample_type - 1)))
@ -1561,7 +1563,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
if (adapter_idx >= wined3d->adapter_count)
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);
format = wined3d_get_format(adapter, check_format_id, bind_flags);
@ -1741,7 +1743,7 @@ UINT CDECL wined3d_calculate_format_pitch(const struct wined3d *wined3d, UINT ad
if (adapter_idx >= wined3d->adapter_count)
return ~0u;
adapter = &wined3d->adapters[adapter_idx];
adapter = wined3d->adapters[adapter_idx];
wined3d_format_calculate_pitch(wined3d_get_format(adapter, format_id, 0),
1, width, 1, &row_pitch, &slice_pitch);
@ -1874,10 +1876,10 @@ HRESULT CDECL wined3d_check_device_type(const struct wined3d *wined3d, UINT adap
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];
const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
const struct wined3d_d3d_info *d3d_info;
struct wined3d_vertex_caps vertex_caps;
const struct wined3d_gl_info *gl_info;
const struct wined3d_adapter *adapter;
DWORD ckey_caps, blit_caps, fx_caps;
struct fragment_caps fragment_caps;
struct shader_caps shader_caps;
@ -1888,6 +1890,10 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, unsigned in
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
adapter = wined3d->adapters[adapter_idx];
d3d_info = &adapter->d3d_info;
gl_info = &adapter->gl_info;
caps->DeviceType = (device_type == WINED3D_DEVICE_TYPE_HAL) ? WINED3D_DEVICE_TYPE_HAL : WINED3D_DEVICE_TYPE_REF;
caps->AdapterOrdinal = adapter_idx;
@ -2353,7 +2359,7 @@ static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
adapter_no3d_get_wined3d_caps,
};
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, DWORD wined3d_creation_flags)
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, unsigned int wined3d_creation_flags)
{
struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
@ -2362,21 +2368,35 @@ static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter,
d3d_info->feature_level = WINED3D_FEATURE_LEVEL_5;
}
static BOOL wined3d_adapter_no3d_init(struct wined3d_adapter *adapter, DWORD wined3d_creation_flags)
static struct wined3d_adapter *wined3d_adapter_no3d_create(unsigned int ordinal, unsigned int wined3d_creation_flags)
{
struct wined3d_adapter *adapter;
static const struct wined3d_gpu_description gpu_description =
{
HW_VENDOR_SOFTWARE, CARD_WINE, "WineD3D DirectDraw Emulation", DRIVER_WINE, 128,
};
TRACE("adapter %p.\n", adapter);
TRACE("ordinal %u, wined3d_creation_flags %#x.\n", ordinal, wined3d_creation_flags);
if (!(adapter = heap_alloc_zero(sizeof(*adapter))))
return NULL;
wined3d_driver_info_init(&adapter->driver_info, &gpu_description, 0);
adapter->vram_bytes_used = 0;
TRACE("Emulating 0x%s bytes of video ram.\n", wine_dbgstr_longlong(adapter->driver_info.vram_bytes));
if (!wined3d_adapter_init(adapter, ordinal))
{
heap_free(adapter);
return NULL;
}
if (!wined3d_adapter_no3d_init_format_info(adapter))
return FALSE;
{
heap_free(adapter);
return NULL;
}
adapter->vertex_pipe = &none_vertex_pipe;
adapter->fragment_pipe = &none_fragment_pipe;
@ -2385,10 +2405,12 @@ static BOOL wined3d_adapter_no3d_init(struct wined3d_adapter *adapter, DWORD win
wined3d_adapter_no3d_init_d3d_info(adapter, wined3d_creation_flags);
return TRUE;
TRACE("Created adapter %p.\n", adapter);
return adapter;
}
static BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal, DWORD wined3d_creation_flags)
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal)
{
DISPLAY_DEVICEW display_device;
@ -2412,9 +2434,15 @@ static BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int o
adapter->formats = NULL;
return TRUE;
}
static struct wined3d_adapter *wined3d_adapter_create(unsigned int ordinal, DWORD wined3d_creation_flags)
{
if (wined3d_creation_flags & WINED3D_NO3D)
return wined3d_adapter_no3d_init(adapter, wined3d_creation_flags);
return wined3d_adapter_gl_init(adapter, wined3d_creation_flags);
return wined3d_adapter_no3d_create(ordinal, wined3d_creation_flags);
return wined3d_adapter_gl_create(ordinal, wined3d_creation_flags);
}
static void STDMETHODCALLTYPE wined3d_null_wined3d_object_destroyed(void *parent) {}
@ -2431,9 +2459,9 @@ HRESULT wined3d_init(struct wined3d *wined3d, DWORD flags)
TRACE("Initialising adapters.\n");
if (!wined3d_adapter_init(&wined3d->adapters[0], 0, flags))
if (!(wined3d->adapters[0] = wined3d_adapter_create(0, flags)))
{
WARN("Failed to initialise adapter.\n");
WARN("Failed to create adapter.\n");
return E_FAIL;
}
wined3d->adapter_count = 1;

View file

@ -196,7 +196,7 @@ struct wined3d_d3d_info
{
struct wined3d_d3d_limits limits;
struct wined3d_ffp_attrib_ops ffp_attrib_ops;
DWORD wined3d_creation_flags;
unsigned int wined3d_creation_flags;
unsigned int xyzrhw : 1;
unsigned int emulated_flatshading : 1;
unsigned int ffp_generic_attributes : 1;
@ -2682,9 +2682,6 @@ struct wined3d_adapter_ops
void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
};
BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
struct wined3d_texture *target, const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
/* The adapter structure */
struct wined3d_adapter
{
@ -2713,7 +2710,16 @@ struct wined3d_adapter
const struct wined3d_adapter_ops *adapter_ops;
};
BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, DWORD wined3d_creation_flags) DECLSPEC_HIDDEN;
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal) DECLSPEC_HIDDEN;
struct wined3d_adapter_gl
{
struct wined3d_adapter a;
};
struct wined3d_adapter *wined3d_adapter_gl_create(unsigned int ordinal, unsigned int wined3d_creation_flags) DECLSPEC_HIDDEN;
BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
struct wined3d_texture *target, const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
struct wined3d_caps_gl_ctx
{
@ -2859,9 +2865,9 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
struct wined3d
{
LONG ref;
DWORD flags;
UINT adapter_count;
struct wined3d_adapter adapters[1];
unsigned int flags;
unsigned int adapter_count;
struct wined3d_adapter *adapters[1];
};
HRESULT wined3d_init(struct wined3d *wined3d, DWORD flags) DECLSPEC_HIDDEN;