wined3d: Add support for variable-sized format structures.

In order to move GL-specific fields into their own structure.

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 2018-09-20 09:02:00 +02:00 committed by Alexandre Julliard
parent 6a38579d0f
commit ff6d7de8ca
3 changed files with 19 additions and 16 deletions

View File

@ -2490,7 +2490,7 @@ static BOOL wined3d_adapter_no3d_init(struct wined3d_adapter *adapter)
adapter->vram_bytes_used = 0;
TRACE("Emulating 0x%s bytes of video ram.\n", wine_dbgstr_longlong(adapter->vram_bytes));
if (!wined3d_adapter_init_format_info(adapter))
if (!wined3d_adapter_init_format_info(adapter, sizeof(struct wined3d_format)))
return FALSE;
adapter->vertex_pipe = &none_vertex_pipe;

View File

@ -1927,7 +1927,7 @@ static inline int get_format_idx(enum wined3d_format_id format_id)
static struct wined3d_format *get_format_by_idx(const struct wined3d_adapter *adapter, int fmt_idx)
{
return &adapter->formats[fmt_idx];
return (struct wined3d_format *)((BYTE *)adapter->formats + fmt_idx * adapter->format_size);
}
static struct wined3d_format *get_format_internal(const struct wined3d_adapter *adapter,
@ -1944,10 +1944,11 @@ static struct wined3d_format *get_format_internal(const struct wined3d_adapter *
return get_format_by_idx(adapter, fmt_idx);
}
static void copy_format(struct wined3d_format *dst_format, const struct wined3d_format *src_format)
static void copy_format(const struct wined3d_adapter *adapter,
struct wined3d_format *dst_format, const struct wined3d_format *src_format)
{
enum wined3d_format_id id = dst_format->id;
*dst_format = *src_format;
memcpy(dst_format, src_format, adapter->format_size);
dst_format->id = id;
}
@ -1993,13 +1994,14 @@ static enum wined3d_channel_type map_channel_type(char t)
}
}
static BOOL init_format_base_info(struct wined3d_adapter *adapter)
static BOOL init_format_base_info(struct wined3d_adapter *adapter, size_t format_size)
{
struct wined3d_format *format;
unsigned int i, j;
adapter->format_size = format_size;
if (!(adapter->formats = heap_calloc(WINED3D_FORMAT_COUNT
+ ARRAY_SIZE(typeless_depth_stencil_formats), sizeof(*adapter->formats))))
+ ARRAY_SIZE(typeless_depth_stencil_formats), adapter->format_size)))
{
ERR("Failed to allocate memory.\n");
return FALSE;
@ -3198,7 +3200,7 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
if (!srgb_format)
continue;
copy_format(srgb_format, format);
copy_format(adapter, srgb_format, format);
if (gl_info->supported[EXT_TEXTURE_SRGB]
&& !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL))
@ -3716,7 +3718,7 @@ static BOOL init_typeless_formats(const struct wined3d_adapter *adapter)
return FALSE;
memcpy(flags, typeless_format->flags, sizeof(flags));
copy_format(typeless_format, format);
copy_format(adapter, typeless_format, format);
for (j = 0; j < ARRAY_SIZE(typeless_format->flags); ++j)
typeless_format->flags[j] |= flags[j];
}
@ -3734,7 +3736,7 @@ static BOOL init_typeless_formats(const struct wined3d_adapter *adapter)
typeless_ds_format = get_format_by_idx(adapter, WINED3D_FORMAT_COUNT + i);
typeless_ds_format->id = typeless_depth_stencil_formats[i].typeless_id;
copy_format(typeless_ds_format, ds_format);
copy_format(adapter, typeless_ds_format, ds_format);
for (j = 0; j < ARRAY_SIZE(typeless_ds_format->flags); ++j)
{
typeless_ds_format->flags[j] = typeless_format->flags[j];
@ -3746,13 +3748,13 @@ static BOOL init_typeless_formats(const struct wined3d_adapter *adapter)
{
if (!(depth_view_format = get_format_internal(adapter, format_id)))
return FALSE;
copy_format(depth_view_format, ds_format);
copy_format(adapter, depth_view_format, ds_format);
}
if ((format_id = typeless_depth_stencil_formats[i].stencil_view_id))
{
if (!(stencil_view_format = get_format_internal(adapter, format_id)))
return FALSE;
copy_format(stencil_view_format, ds_format);
copy_format(adapter, stencil_view_format, ds_format);
}
}
@ -3947,9 +3949,9 @@ static void init_format_depth_bias_scale(struct wined3d_adapter *adapter,
}
}
BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter)
BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, size_t format_size)
{
if (!init_format_base_info(adapter)) return FALSE;
if (!init_format_base_info(adapter, format_size)) return FALSE;
if (!init_format_block_info(adapter)) goto fail;
if (!init_format_decompress_info(adapter)) goto fail;
@ -3966,7 +3968,7 @@ BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct
{
struct wined3d_gl_info *gl_info = &adapter->gl_info;
if (!wined3d_adapter_init_format_info(adapter))
if (!wined3d_adapter_init_format_info(adapter, sizeof(struct wined3d_format)))
return FALSE;
if (!init_format_texture_info(adapter, gl_info)) goto fail;

View File

@ -2667,7 +2667,8 @@ struct wined3d_adapter
UINT64 vram_bytes_used;
LUID luid;
struct wined3d_format *formats;
void *formats;
size_t format_size;
const struct wined3d_vertex_pipe_ops *vertex_pipe;
const struct fragment_pipeline *fragment_pipe;
@ -2690,7 +2691,7 @@ struct wined3d_caps_gl_ctx
GLuint test_program_id;
};
BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, size_t format_size) DECLSPEC_HIDDEN;
BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter,
struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;