Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/wined3d/adapter_gl.c | 46 ++++++++++++++++++++++------------ dlls/wined3d/context.c | 4 +-- dlls/wined3d/directx.c | 16 ++++++++---- dlls/wined3d/wined3d_private.h | 17 +++++++++++-- 4 files changed, 58 insertions(+), 25 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 3aaceaf5a9aa..8cf90d59084e 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -4119,9 +4119,9 @@ static void wined3d_adapter_init_ffp_attrib_ops(struct wined3d_adapter *adapter) } }
-static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc) +static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter_gl *adapter_gl, HDC dc) { - const struct wined3d_gl_info *gl_info = &adapter->gl_info; + const struct wined3d_gl_info *gl_info = &adapter_gl->a.gl_info; int i;
if (gl_info->supported[WGL_ARB_PIXEL_FORMAT]) @@ -4135,7 +4135,7 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc attribute = WGL_NUMBER_PIXEL_FORMATS_ARB; GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, 0, 0, 1, &attribute, &cfg_count));
- adapter->cfgs = heap_calloc(cfg_count, sizeof(*adapter->cfgs)); + adapter_gl->pixel_formats = heap_calloc(cfg_count, sizeof(*adapter_gl->pixel_formats)); attribs[attrib_count++] = WGL_RED_BITS_ARB; attribs[attrib_count++] = WGL_GREEN_BITS_ARB; attribs[attrib_count++] = WGL_BLUE_BITS_ARB; @@ -4148,9 +4148,9 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc attribs[attrib_count++] = WGL_DOUBLE_BUFFER_ARB; attribs[attrib_count++] = WGL_AUX_BUFFERS_ARB;
- for (i = 0, adapter->cfg_count = 0; i < cfg_count; ++i) + for (i = 0, adapter_gl->pixel_format_count = 0; i < cfg_count; ++i) { - struct wined3d_pixel_format *cfg = &adapter->cfgs[adapter->cfg_count]; + struct wined3d_pixel_format *cfg = &adapter_gl->pixel_formats[adapter_gl->pixel_format_count]; int format_id = i + 1;
if (!GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, format_id, 0, attrib_count, attribs, values))) @@ -4192,7 +4192,7 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc cfg->redSize, cfg->greenSize, cfg->blueSize, cfg->alphaSize, cfg->depthSize, cfg->stencilSize, cfg->numSamples, cfg->windowDrawable);
- ++adapter->cfg_count; + ++adapter_gl->pixel_format_count; } } else @@ -4200,11 +4200,11 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc int cfg_count;
cfg_count = DescribePixelFormat(dc, 0, 0, 0); - adapter->cfgs = heap_calloc(cfg_count, sizeof(*adapter->cfgs)); + adapter_gl->pixel_formats = heap_calloc(cfg_count, sizeof(*adapter_gl->pixel_formats));
- for (i = 0, adapter->cfg_count = 0; i < cfg_count; ++i) + for (i = 0, adapter_gl->pixel_format_count = 0; i < cfg_count; ++i) { - struct wined3d_pixel_format *cfg = &adapter->cfgs[adapter->cfg_count]; + struct wined3d_pixel_format *cfg = &adapter_gl->pixel_formats[adapter_gl->pixel_format_count]; PIXELFORMATDESCRIPTOR pfd; int format_id = i + 1;
@@ -4241,7 +4241,7 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc cfg->redSize, cfg->greenSize, cfg->blueSize, cfg->alphaSize, cfg->depthSize, cfg->stencilSize, cfg->windowDrawable);
- ++adapter->cfg_count; + ++adapter_gl->pixel_format_count; } } } @@ -4439,6 +4439,7 @@ 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) { + const struct wined3d_adapter_gl *adapter_gl = wined3d_adapter_gl_const(adapter); unsigned int i;
if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER) @@ -4459,9 +4460,9 @@ static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter, } }
- for (i = 0; i < adapter->cfg_count; ++i) + for (i = 0; i < adapter_gl->pixel_format_count; ++i) { - const struct wined3d_pixel_format *cfg = &adapter->cfgs[i]; + const struct wined3d_pixel_format *cfg = &adapter_gl->pixel_formats[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) */ @@ -4480,8 +4481,18 @@ static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter, return FALSE; }
+static void adapter_gl_destroy(struct wined3d_adapter *adapter) +{ + struct wined3d_adapter_gl *adapter_gl = wined3d_adapter_gl(adapter); + + heap_free(adapter_gl->pixel_formats); + wined3d_adapter_cleanup(adapter); + heap_free(adapter_gl); +} + static const struct wined3d_adapter_ops wined3d_adapter_gl_ops = { + adapter_gl_destroy, wined3d_adapter_gl_create_context, adapter_gl_get_wined3d_caps, adapter_gl_check_format, @@ -4498,6 +4509,7 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, }; struct wined3d_gl_info *gl_info = &adapter->gl_info; struct wined3d_caps_gl_ctx caps_gl_ctx = {0}; + struct wined3d_adapter_gl *adapter_gl; unsigned int i;
TRACE("adapter %p, ordinal %u, wined3d_creation_flags %#x.\n", @@ -4506,6 +4518,8 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, if (!wined3d_adapter_init(adapter, ordinal)) return FALSE;
+ adapter_gl = wined3d_adapter_gl(adapter); + /* Dynamically load all GL core functions */ #ifdef USE_WIN32_OPENGL { @@ -4571,14 +4585,14 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, ERR_(winediag)("You are using the backbuffer for offscreen rendering. " "This is unsupported, and will be removed in a future version.\n");
- wined3d_adapter_init_fb_cfgs(adapter, caps_gl_ctx.dc); + wined3d_adapter_init_fb_cfgs(adapter_gl, caps_gl_ctx.dc); /* We haven't found any suitable formats. This should only happen in * case of GDI software rendering, which is pretty useless anyway. */ - if (!adapter->cfg_count) + if (!adapter_gl->pixel_format_count) { WARN("No suitable pixel formats found.\n"); wined3d_caps_gl_ctx_destroy(&caps_gl_ctx); - heap_free(adapter->cfgs); + heap_free(adapter_gl->pixel_formats); return FALSE; }
@@ -4586,7 +4600,7 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter, { ERR("Failed to initialize GL format info.\n"); wined3d_caps_gl_ctx_destroy(&caps_gl_ctx); - heap_free(adapter->cfgs); + heap_free(adapter_gl->pixel_formats); return FALSE; }
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 6d270a7eb693..425721aaa238 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1652,7 +1652,7 @@ static int context_choose_pixel_format(const struct wined3d_device *device, HDC const struct wined3d_format *color_format, const struct wined3d_format *ds_format, BOOL auxBuffers) { - unsigned int cfg_count = device->adapter->cfg_count; + unsigned int cfg_count = wined3d_adapter_gl(device->adapter)->pixel_format_count; unsigned int current_value; PIXELFORMATDESCRIPTOR pfd; int iPixelFormat = 0; @@ -1665,7 +1665,7 @@ static int context_choose_pixel_format(const struct wined3d_device *device, HDC current_value = 0; for (i = 0; i < cfg_count; ++i) { - const struct wined3d_pixel_format *cfg = &device->adapter->cfgs[i]; + const struct wined3d_pixel_format *cfg = &wined3d_adapter_gl(device->adapter)->pixel_formats[i]; unsigned int value;
/* For now only accept RGBA formats. Perhaps some day we will diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 75f1fddf5d42..13014d1272a0 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -71,12 +71,9 @@ UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) return adapter->vram_bytes_used; }
-static void wined3d_adapter_cleanup(struct wined3d_adapter *adapter) +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) @@ -100,7 +97,9 @@ ULONG CDECL wined3d_decref(struct wined3d *wined3d)
for (i = 0; i < wined3d->adapter_count; ++i) { - wined3d_adapter_cleanup(wined3d->adapters[i]); + struct wined3d_adapter *adapter = wined3d->adapters[i]; + + adapter->adapter_ops->adapter_destroy(adapter); } heap_free(wined3d); } @@ -2213,6 +2212,12 @@ HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, unsigned int adapte return WINED3D_OK; }
+static void adapter_no3d_destroy(struct wined3d_adapter *adapter) +{ + wined3d_adapter_cleanup(adapter); + heap_free(adapter); +} + static BOOL wined3d_adapter_no3d_create_context(struct wined3d_context *context, struct wined3d_texture *target, const struct wined3d_format *ds_format) { @@ -2232,6 +2237,7 @@ static BOOL adapter_no3d_check_format(const struct wined3d_adapter *adapter,
static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops = { + adapter_no3d_destroy, wined3d_adapter_no3d_create_context, adapter_no3d_get_wined3d_caps, adapter_no3d_check_format, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b9f906a143f0..88885fe88c4d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2677,6 +2677,7 @@ void wined3d_driver_info_init(struct wined3d_driver_info *driver_info,
struct wined3d_adapter_ops { + void (*adapter_destroy)(struct wined3d_adapter *adapter); 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); @@ -2701,8 +2702,6 @@ struct wined3d_adapter LUID luid;
WCHAR device_name[CCHDEVICENAME]; /* for use with e.g. ChangeDisplaySettings() */ - unsigned int cfg_count; - struct wined3d_pixel_format *cfgs;
void *formats; size_t format_size; @@ -2714,12 +2713,26 @@ struct wined3d_adapter };
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal) DECLSPEC_HIDDEN; +void wined3d_adapter_cleanup(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
struct wined3d_adapter_gl { struct wined3d_adapter a; + + struct wined3d_pixel_format *pixel_formats; + unsigned int pixel_format_count; };
+static inline struct wined3d_adapter_gl *wined3d_adapter_gl(struct wined3d_adapter *adapter) +{ + return CONTAINING_RECORD(adapter, struct wined3d_adapter_gl, a); +} + +static inline const struct wined3d_adapter_gl *wined3d_adapter_gl_const(const struct wined3d_adapter *adapter) +{ + return CONTAINING_RECORD(adapter, struct wined3d_adapter_gl, 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;
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=50073
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 error: patch failed: dlls/wined3d/adapter_gl.c:4119 error: patch failed: dlls/wined3d/context.c:1652 error: patch failed: dlls/wined3d/directx.c:71 error: patch failed: dlls/wined3d/wined3d_private.h:2677 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 error: patch failed: dlls/wined3d/adapter_gl.c:4119 error: patch failed: dlls/wined3d/context.c:1652 error: patch failed: dlls/wined3d/directx.c:71 error: patch failed: dlls/wined3d/wined3d_private.h:2677 Task: Patch failed to apply