Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/wined3d/adapter_gl.c | 31 ++++++++++++-- dlls/wined3d/device.c | 2 +- dlls/wined3d/directx.c | 76 +++++++++++++++++++++++----------- dlls/wined3d/wined3d_private.h | 22 ++++++---- 4 files changed, 94 insertions(+), 37 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 3a0511e4c0dc..99073f4fbf59 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -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; +} diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 1328543186ad..f9a43c27c7ed 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -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; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index debc4e5dc61f..6fb26d203df3 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -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; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index a18e2ec0d91a..785ee2a3c3eb 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -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;
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=49743
Your paranoid android.
=== debian9 (32 bit report) ===
Report errors: The report seems to have been truncated
=== debian9b (32 bit WoW report) ===
Report errors: The report seems to have been truncated