wined3d: Move pixel formats to wined3d_adapter_gl.

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-28 09:53:57 +01:00 committed by Alexandre Julliard
parent 8497ba8a73
commit cad72d3cd7
4 changed files with 58 additions and 25 deletions

View File

@ -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; int i;
if (gl_info->supported[WGL_ARB_PIXEL_FORMAT]) 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; attribute = WGL_NUMBER_PIXEL_FORMATS_ARB;
GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, 0, 0, 1, &attribute, &cfg_count)); 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_RED_BITS_ARB;
attribs[attrib_count++] = WGL_GREEN_BITS_ARB; attribs[attrib_count++] = WGL_GREEN_BITS_ARB;
attribs[attrib_count++] = WGL_BLUE_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_DOUBLE_BUFFER_ARB;
attribs[attrib_count++] = WGL_AUX_BUFFERS_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; int format_id = i + 1;
if (!GL_EXTCALL(wglGetPixelFormatAttribivARB(dc, format_id, 0, attrib_count, attribs, values))) 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->redSize, cfg->greenSize, cfg->blueSize, cfg->alphaSize,
cfg->depthSize, cfg->stencilSize, cfg->numSamples, cfg->windowDrawable); cfg->depthSize, cfg->stencilSize, cfg->numSamples, cfg->windowDrawable);
++adapter->cfg_count; ++adapter_gl->pixel_format_count;
} }
} }
else else
@ -4200,11 +4200,11 @@ static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc
int cfg_count; int cfg_count;
cfg_count = DescribePixelFormat(dc, 0, 0, 0); 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; PIXELFORMATDESCRIPTOR pfd;
int format_id = i + 1; 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->redSize, cfg->greenSize, cfg->blueSize, cfg->alphaSize,
cfg->depthSize, cfg->stencilSize, cfg->windowDrawable); 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 *adapter_format, const struct wined3d_format *rt_format,
const struct wined3d_format *ds_format) const struct wined3d_format *ds_format)
{ {
const struct wined3d_adapter_gl *adapter_gl = wined3d_adapter_gl_const(adapter);
unsigned int i; unsigned int i;
if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER) 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 /* 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) */ * 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; 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 = static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
{ {
adapter_gl_destroy,
wined3d_adapter_gl_create_context, wined3d_adapter_gl_create_context,
adapter_gl_get_wined3d_caps, adapter_gl_get_wined3d_caps,
adapter_gl_check_format, 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_gl_info *gl_info = &adapter->gl_info;
struct wined3d_caps_gl_ctx caps_gl_ctx = {0}; struct wined3d_caps_gl_ctx caps_gl_ctx = {0};
struct wined3d_adapter_gl *adapter_gl;
unsigned int i; unsigned int i;
TRACE("adapter %p, ordinal %u, wined3d_creation_flags %#x.\n", 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)) if (!wined3d_adapter_init(adapter, ordinal))
return FALSE; return FALSE;
adapter_gl = wined3d_adapter_gl(adapter);
/* Dynamically load all GL core functions */ /* Dynamically load all GL core functions */
#ifdef USE_WIN32_OPENGL #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. " ERR_(winediag)("You are using the backbuffer for offscreen rendering. "
"This is unsupported, and will be removed in a future version.\n"); "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 /* We haven't found any suitable formats. This should only happen in
* case of GDI software rendering, which is pretty useless anyway. */ * 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"); WARN("No suitable pixel formats found.\n");
wined3d_caps_gl_ctx_destroy(&caps_gl_ctx); wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
heap_free(adapter->cfgs); heap_free(adapter_gl->pixel_formats);
return FALSE; return FALSE;
} }
@ -4586,7 +4600,7 @@ static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter,
{ {
ERR("Failed to initialize GL format info.\n"); ERR("Failed to initialize GL format info.\n");
wined3d_caps_gl_ctx_destroy(&caps_gl_ctx); wined3d_caps_gl_ctx_destroy(&caps_gl_ctx);
heap_free(adapter->cfgs); heap_free(adapter_gl->pixel_formats);
return FALSE; return FALSE;
} }

View File

@ -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, const struct wined3d_format *color_format, const struct wined3d_format *ds_format,
BOOL auxBuffers) 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; unsigned int current_value;
PIXELFORMATDESCRIPTOR pfd; PIXELFORMATDESCRIPTOR pfd;
int iPixelFormat = 0; int iPixelFormat = 0;
@ -1665,7 +1665,7 @@ static int context_choose_pixel_format(const struct wined3d_device *device, HDC
current_value = 0; current_value = 0;
for (i = 0; i < cfg_count; ++i) 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; unsigned int value;
/* For now only accept RGBA formats. Perhaps some day we will /* For now only accept RGBA formats. Perhaps some day we will

View File

@ -71,12 +71,9 @@ UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount)
return adapter->vram_bytes_used; 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->formats);
heap_free(adapter->cfgs);
heap_free(adapter);
} }
ULONG CDECL wined3d_incref(struct wined3d *wined3d) 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) 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); heap_free(wined3d);
} }
@ -2213,6 +2212,12 @@ HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, unsigned int adapte
return WINED3D_OK; 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, static BOOL wined3d_adapter_no3d_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)
{ {
@ -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 = static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
{ {
adapter_no3d_destroy,
wined3d_adapter_no3d_create_context, wined3d_adapter_no3d_create_context,
adapter_no3d_get_wined3d_caps, adapter_no3d_get_wined3d_caps,
adapter_no3d_check_format, adapter_no3d_check_format,

View File

@ -2677,6 +2677,7 @@ void wined3d_driver_info_init(struct wined3d_driver_info *driver_info,
struct wined3d_adapter_ops struct wined3d_adapter_ops
{ {
void (*adapter_destroy)(struct wined3d_adapter *adapter);
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);
@ -2701,8 +2702,6 @@ struct wined3d_adapter
LUID luid; LUID luid;
WCHAR device_name[CCHDEVICENAME]; /* for use with e.g. ChangeDisplaySettings() */ WCHAR device_name[CCHDEVICENAME]; /* for use with e.g. ChangeDisplaySettings() */
unsigned int cfg_count;
struct wined3d_pixel_format *cfgs;
void *formats; void *formats;
size_t format_size; size_t format_size;
@ -2714,12 +2713,26 @@ struct wined3d_adapter
}; };
BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal) DECLSPEC_HIDDEN; 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_gl
{ {
struct wined3d_adapter a; 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; 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, BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
struct wined3d_texture *target, const struct wined3d_format *ds_format) DECLSPEC_HIDDEN; struct wined3d_texture *target, const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;