Signed-off-by: Józef Kucia <jkucia(a)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;
--
2.19.2