[PATCH v2 3/5] wined3d: Use format id as index in formats table whenever possible.
Józef Kucia
jkucia at codeweavers.com
Thu Feb 11 06:34:35 CST 2016
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Version 2: Simplify format index allocation.
---
dlls/wined3d/utils.c | 96 ++++++++++++++++++++++++++++++------------
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 71 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 9af7e80..9edd23f 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -33,6 +33,42 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+#define WINED3D_FORMAT_FOURCC_BASE (WINED3DFMT_BC7_UNORM_SRGB + 1)
+
+static const struct
+{
+ enum wined3d_format_id id;
+ unsigned int idx;
+}
+format_index_remap[] =
+{
+ {WINED3DFMT_UYVY, WINED3D_FORMAT_FOURCC_BASE},
+ {WINED3DFMT_YUY2, WINED3D_FORMAT_FOURCC_BASE + 1},
+ {WINED3DFMT_YV12, WINED3D_FORMAT_FOURCC_BASE + 2},
+ {WINED3DFMT_DXT1, WINED3D_FORMAT_FOURCC_BASE + 3},
+ {WINED3DFMT_DXT2, WINED3D_FORMAT_FOURCC_BASE + 4},
+ {WINED3DFMT_DXT3, WINED3D_FORMAT_FOURCC_BASE + 5},
+ {WINED3DFMT_DXT4, WINED3D_FORMAT_FOURCC_BASE + 6},
+ {WINED3DFMT_DXT5, WINED3D_FORMAT_FOURCC_BASE + 7},
+ {WINED3DFMT_MULTI2_ARGB8, WINED3D_FORMAT_FOURCC_BASE + 8},
+ {WINED3DFMT_G8R8_G8B8, WINED3D_FORMAT_FOURCC_BASE + 9},
+ {WINED3DFMT_R8G8_B8G8, WINED3D_FORMAT_FOURCC_BASE + 10},
+ {WINED3DFMT_ATI1N, WINED3D_FORMAT_FOURCC_BASE + 11},
+ {WINED3DFMT_ATI2N, WINED3D_FORMAT_FOURCC_BASE + 12},
+ {WINED3DFMT_INST, WINED3D_FORMAT_FOURCC_BASE + 13},
+ {WINED3DFMT_NVDB, WINED3D_FORMAT_FOURCC_BASE + 14},
+ {WINED3DFMT_NVHU, WINED3D_FORMAT_FOURCC_BASE + 15},
+ {WINED3DFMT_NVHS, WINED3D_FORMAT_FOURCC_BASE + 16},
+ {WINED3DFMT_INTZ, WINED3D_FORMAT_FOURCC_BASE + 17},
+ {WINED3DFMT_RESZ, WINED3D_FORMAT_FOURCC_BASE + 18},
+ {WINED3DFMT_NULL, WINED3D_FORMAT_FOURCC_BASE + 19},
+ {WINED3DFMT_R16, WINED3D_FORMAT_FOURCC_BASE + 20},
+ {WINED3DFMT_AL16, WINED3D_FORMAT_FOURCC_BASE + 21},
+ {WINED3DFMT_NV12, WINED3D_FORMAT_FOURCC_BASE + 22},
+};
+
+#define WINED3D_FORMAT_COUNT (WINED3D_FORMAT_FOURCC_BASE + ARRAY_SIZE(format_index_remap))
+
struct wined3d_format_channels
{
enum wined3d_format_id id;
@@ -1439,22 +1475,17 @@ static const struct wined3d_format_srgb_info format_srgb_info[] =
static inline int get_format_idx(enum wined3d_format_id format_id)
{
- /* First check if the format is at the position of its value.
- * This will catch the argb formats before the loop is entered. */
- if (format_id < (sizeof(formats) / sizeof(*formats))
- && formats[format_id].id == format_id)
- {
+ unsigned int i;
+
+ if (format_id < WINED3D_FORMAT_FOURCC_BASE)
return format_id;
- }
- else
- {
- unsigned int i;
- for (i = 0; i < (sizeof(formats) / sizeof(*formats)); ++i)
- {
- if (formats[i].id == format_id) return i;
- }
+ for (i = 0; i < ARRAY_SIZE(format_index_remap); ++i)
+ {
+ if (format_index_remap[i].id == format_id)
+ return format_index_remap[i].idx;
}
+
return -1;
}
@@ -1500,19 +1531,30 @@ static enum wined3d_channel_type map_channel_type(char t)
static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
{
- UINT format_count = sizeof(formats) / sizeof(*formats);
unsigned int i, j;
- gl_info->formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, format_count * sizeof(*gl_info->formats));
- if (!gl_info->formats)
+ gl_info->format_count = WINED3D_FORMAT_COUNT;
+ if (!(gl_info->formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ gl_info->format_count * sizeof(*gl_info->formats))))
{
ERR("Failed to allocate memory.\n");
return FALSE;
}
- for (i = 0; i < format_count; ++i)
+ for (i = 0; i < ARRAY_SIZE(formats); ++i)
{
- struct wined3d_format *format = &gl_info->formats[i];
+ struct wined3d_format *format;
+ int fmt_idx;
+
+ fmt_idx = get_format_idx(formats[i].id);
+ if (fmt_idx == -1)
+ {
+ ERR("Could not allocate index for format %s %#x.\n",
+ debug_d3dformat(formats[i].id), formats[i].id);
+ goto fail;
+ }
+ format = &gl_info->formats[fmt_idx];
+
format->id = formats[i].id;
format->red_size = formats[i].red_size;
format->green_size = formats[i].green_size;
@@ -1539,10 +1581,9 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
fmt_idx = get_format_idx(typed_formats[i].id);
if (fmt_idx == -1)
{
- ERR("Format %s (%#x) not found.\n",
+ ERR("Could not allocate index for format %s %#x.\n",
debug_d3dformat(typed_formats[i].id), typed_formats[i].id);
- HeapFree(GetProcessHeap(), 0, gl_info->formats);
- return FALSE;
+ goto fail;
}
format = &gl_info->formats[fmt_idx];
@@ -1566,14 +1607,17 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
{
ERR("Format %s (%#x) not found.\n",
debug_d3dformat(format_base_flags[i].id), format_base_flags[i].id);
- HeapFree(GetProcessHeap(), 0, gl_info->formats);
- return FALSE;
+ goto fail;
}
format_set_flag(&gl_info->formats[fmt_idx], format_base_flags[i].flags);
}
return TRUE;
+
+fail:
+ HeapFree(GetProcessHeap(), 0, gl_info->formats);
+ return FALSE;
}
static BOOL init_format_block_info(struct wined3d_gl_info *gl_info)
@@ -2176,7 +2220,7 @@ static void init_format_fbo_compat_info(struct wined3d_caps_gl_ctx *ctx)
if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2])
{
- for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
+ for (i = 0; i < gl_info->format_count; ++i)
{
GLint value;
struct wined3d_format *format = &gl_info->formats[i];
@@ -2287,7 +2331,7 @@ static void init_format_fbo_compat_info(struct wined3d_caps_gl_ctx *ctx)
gl_info->gl_ops.gl.p_glReadBuffer(GL_COLOR_ATTACHMENT0);
}
- for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
+ for (i = 0; i < gl_info->format_count; ++i)
{
struct wined3d_format *format = &gl_info->formats[i];
@@ -2897,7 +2941,7 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
format_set_flag(&gl_info->formats[idx], WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET);
}
- for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
+ for (i = 0; i < gl_info->format_count; ++i)
{
struct wined3d_format *format = &gl_info->formats[i];
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 470db1f..fdc5c5b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1828,6 +1828,7 @@ struct wined3d_gl_info
struct wined3d_fbo_ops fbo_ops;
struct wined3d_format *formats;
+ unsigned int format_count;
};
struct wined3d_driver_info
--
2.4.10
More information about the wine-patches
mailing list