[PATCH v2 1/5] wined3d: Introduce table with typed format channels.
Józef Kucia
jkucia at codeweavers.com
Thu Feb 11 06:34:33 CST 2016
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Channels types are not yet exposed in struct wined3d_format.
Version 2: Proper enum elements names.
---
dlls/wined3d/utils.c | 158 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 111 insertions(+), 47 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index d355ee1..da6eb40 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -174,40 +174,64 @@ static const struct wined3d_format_channels formats[] =
{WINED3DFMT_BC5_TYPELESS, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
};
-struct wined3d_format_class_info
+enum wined3d_channel_type
+{
+ WINED3D_CHANNEL_TYPE_NONE,
+ WINED3D_CHANNEL_TYPE_UNORM,
+ WINED3D_CHANNEL_TYPE_SNORM,
+ WINED3D_CHANNEL_TYPE_UINT,
+ WINED3D_CHANNEL_TYPE_SINT,
+ WINED3D_CHANNEL_TYPE_FLOAT,
+ WINED3D_CHANNEL_TYPE_DEPTH,
+ WINED3D_CHANNEL_TYPE_STENCIL,
+};
+
+struct wined3d_typed_format_info
{
enum wined3d_format_id id;
enum wined3d_format_id typeless_id;
+ const char *channels;
};
/**
* The last entry for a given typeless format defines its internal format.
+ *
+ * u - WINED3D_CHANNEL_TYPE_UNORM
+ * i - WINED3D_CHANNEL_TYPE_SNORM
+ * U - WINED3D_CHANNEL_TYPE_UINT
+ * I - WINED3D_CHANNEL_TYPE_SINT
+ * F - WINED3D_CHANNEL_TYPE_FLOAT
+ * D - WINED3D_CHANNEL_TYPE_DEPTH
+ * S - WINED3D_CHANNEL_TYPE_STENCIL
*/
-static const struct wined3d_format_class_info format_class_info[] =
+static const struct wined3d_typed_format_info typed_formats[] =
{
- {WINED3DFMT_R32G32B32A32_UINT, WINED3DFMT_R32G32B32A32_TYPELESS},
- {WINED3DFMT_R32G32B32A32_SINT, WINED3DFMT_R32G32B32A32_TYPELESS},
- {WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_R32G32B32A32_TYPELESS},
- {WINED3DFMT_R32G32B32_FLOAT, WINED3DFMT_R32G32B32_TYPELESS},
- {WINED3DFMT_R16G16B16A16_UNORM, WINED3DFMT_R16G16B16A16_TYPELESS},
- {WINED3DFMT_R16G16B16A16_FLOAT, WINED3DFMT_R16G16B16A16_TYPELESS},
- {WINED3DFMT_R32G32_FLOAT, WINED3DFMT_R32G32_TYPELESS},
- {WINED3DFMT_R10G10B10A2_UNORM, WINED3DFMT_R10G10B10A2_TYPELESS},
- {WINED3DFMT_R8G8B8A8_UNORM_SRGB, WINED3DFMT_R8G8B8A8_TYPELESS},
- {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_R8G8B8A8_TYPELESS},
- {WINED3DFMT_R16G16_UNORM, WINED3DFMT_R16G16_TYPELESS},
- {WINED3DFMT_R16G16_FLOAT, WINED3DFMT_R16G16_TYPELESS},
- {WINED3DFMT_R32_FLOAT, WINED3DFMT_R32_TYPELESS},
- {WINED3DFMT_D24_UNORM_S8_UINT, WINED3DFMT_R24G8_TYPELESS},
- {WINED3DFMT_R8G8_UNORM, WINED3DFMT_R8G8_TYPELESS},
- {WINED3DFMT_R16_FLOAT, WINED3DFMT_R16_TYPELESS},
- {WINED3DFMT_R8_UNORM, WINED3DFMT_R8_TYPELESS},
- {WINED3DFMT_BC1_UNORM_SRGB, WINED3DFMT_BC1_TYPELESS},
- {WINED3DFMT_BC1_UNORM, WINED3DFMT_BC1_TYPELESS},
- {WINED3DFMT_BC2_UNORM_SRGB, WINED3DFMT_BC2_TYPELESS},
- {WINED3DFMT_BC2_UNORM, WINED3DFMT_BC2_TYPELESS},
- {WINED3DFMT_BC3_UNORM_SRGB, WINED3DFMT_BC3_TYPELESS},
- {WINED3DFMT_BC3_UNORM, WINED3DFMT_BC3_TYPELESS},
+ {WINED3DFMT_R32G32B32A32_UINT, WINED3DFMT_R32G32B32A32_TYPELESS, "UUUU"},
+ {WINED3DFMT_R32G32B32A32_SINT, WINED3DFMT_R32G32B32A32_TYPELESS, "IIII"},
+ {WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_R32G32B32A32_TYPELESS, "FFFF"},
+ {WINED3DFMT_R32G32B32_FLOAT, WINED3DFMT_R32G32B32_TYPELESS, "FFF"},
+ {WINED3DFMT_R16G16B16A16_UNORM, WINED3DFMT_R16G16B16A16_TYPELESS, "uuuu"},
+ {WINED3DFMT_R16G16B16A16_FLOAT, WINED3DFMT_R16G16B16A16_TYPELESS, "FFFF"},
+ {WINED3DFMT_R32G32_FLOAT, WINED3DFMT_R32G32_TYPELESS, "FF"},
+ {WINED3DFMT_R10G10B10A2_UNORM, WINED3DFMT_R10G10B10A2_TYPELESS, "uuuu"},
+ {WINED3DFMT_R8G8B8A8_UINT, WINED3DFMT_R8G8B8A8_TYPELESS, "UUUU"},
+ {WINED3DFMT_R8G8B8A8_SINT, WINED3DFMT_R8G8B8A8_TYPELESS, "IIII"},
+ {WINED3DFMT_R8G8B8A8_UNORM_SRGB, WINED3DFMT_R8G8B8A8_TYPELESS, "uuuu"},
+ {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_R8G8B8A8_TYPELESS, "uuuu"},
+ {WINED3DFMT_R16G16_UNORM, WINED3DFMT_R16G16_TYPELESS, "uu"},
+ {WINED3DFMT_R16G16_FLOAT, WINED3DFMT_R16G16_TYPELESS, "FF"},
+ {WINED3DFMT_R32_FLOAT, WINED3DFMT_R32_TYPELESS, "F"},
+ {WINED3DFMT_D24_UNORM_S8_UINT, WINED3DFMT_R24G8_TYPELESS, "DS"},
+ {WINED3DFMT_R8G8_UNORM, WINED3DFMT_R8G8_TYPELESS, "uu"},
+ {WINED3DFMT_R16_UINT, WINED3DFMT_R16_TYPELESS, "U"},
+ {WINED3DFMT_R16_FLOAT, WINED3DFMT_R16_TYPELESS, "F"},
+ {WINED3DFMT_R8_UNORM, WINED3DFMT_R8_TYPELESS, "u"},
+ {WINED3DFMT_BC1_UNORM_SRGB, WINED3DFMT_BC1_TYPELESS, ""},
+ {WINED3DFMT_BC1_UNORM, WINED3DFMT_BC1_TYPELESS, ""},
+ {WINED3DFMT_BC2_UNORM_SRGB, WINED3DFMT_BC2_TYPELESS, ""},
+ {WINED3DFMT_BC2_UNORM, WINED3DFMT_BC2_TYPELESS, ""},
+ {WINED3DFMT_BC3_UNORM_SRGB, WINED3DFMT_BC3_TYPELESS, ""},
+ {WINED3DFMT_BC3_UNORM, WINED3DFMT_BC3_TYPELESS, ""},
};
struct wined3d_format_base_flags
@@ -234,20 +258,8 @@ static const struct wined3d_format_base_flags format_base_flags[] =
{WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC},
{WINED3DFMT_ATI1N, WINED3DFMT_FLAG_BROKEN_PITCH},
{WINED3DFMT_ATI2N, WINED3DFMT_FLAG_BROKEN_PITCH},
- {WINED3DFMT_R32_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R32G32_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R32G32B32_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R16_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R16G16_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R16G16B16A16_FLOAT, WINED3DFMT_FLAG_FLOAT},
{WINED3DFMT_D32_FLOAT, WINED3DFMT_FLAG_FLOAT},
{WINED3DFMT_S8_UINT_D24_FLOAT, WINED3DFMT_FLAG_FLOAT},
- {WINED3DFMT_R8G8B8A8_UINT, WINED3DFMT_FLAG_INTEGER},
- {WINED3DFMT_R8G8B8A8_SINT, WINED3DFMT_FLAG_INTEGER},
- {WINED3DFMT_R16_UINT, WINED3DFMT_FLAG_INTEGER},
- {WINED3DFMT_R32G32B32A32_UINT, WINED3DFMT_FLAG_INTEGER},
- {WINED3DFMT_R32G32B32A32_SINT, WINED3DFMT_FLAG_INTEGER},
};
struct wined3d_format_block_info
@@ -1462,10 +1474,34 @@ static void format_clear_flag(struct wined3d_format *format, unsigned int flag)
format->flags[i] &= ~flag;
}
+static enum wined3d_channel_type map_channel_type(char t)
+{
+ switch (t)
+ {
+ case 'u':
+ return WINED3D_CHANNEL_TYPE_UNORM;
+ case 'i':
+ return WINED3D_CHANNEL_TYPE_SNORM;
+ case 'U':
+ return WINED3D_CHANNEL_TYPE_UINT;
+ case 'I':
+ return WINED3D_CHANNEL_TYPE_SINT;
+ case 'F':
+ return WINED3D_CHANNEL_TYPE_FLOAT;
+ case 'D':
+ return WINED3D_CHANNEL_TYPE_DEPTH;
+ case 'S':
+ return WINED3D_CHANNEL_TYPE_STENCIL;
+ default:
+ ERR("Invalid channel type '%c'.\n", t);
+ return WINED3D_CHANNEL_TYPE_NONE;
+ }
+}
+
static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
{
UINT format_count = sizeof(formats) / sizeof(*formats);
- UINT i;
+ unsigned int i, j;
gl_info->formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, format_count * sizeof(*gl_info->formats));
if (!gl_info->formats)
@@ -1494,7 +1530,35 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
format->block_byte_count = formats[i].bpp;
}
- for (i = 0; i < (sizeof(format_base_flags) / sizeof(*format_base_flags)); ++i)
+ for (i = 0; i < ARRAY_SIZE(typed_formats); ++i)
+ {
+ struct wined3d_format *format;
+ DWORD flags = 0;
+ int fmt_idx;
+
+ fmt_idx = getFmtIdx(typed_formats[i].id);
+ if (fmt_idx == -1)
+ {
+ ERR("Format %s (%#x) not found.\n",
+ debug_d3dformat(typed_formats[i].id), typed_formats[i].id);
+ HeapFree(GetProcessHeap(), 0, gl_info->formats);
+ return FALSE;
+ }
+ format = &gl_info->formats[fmt_idx];
+
+ for (j = 0; j < strlen(typed_formats[i].channels); ++j)
+ {
+ enum wined3d_channel_type channel_type = map_channel_type(typed_formats[i].channels[j]);
+ if (channel_type == WINED3D_CHANNEL_TYPE_UINT || channel_type == WINED3D_CHANNEL_TYPE_SINT)
+ flags |= WINED3DFMT_FLAG_INTEGER;
+ if (channel_type == WINED3D_CHANNEL_TYPE_FLOAT)
+ flags |= WINED3DFMT_FLAG_FLOAT;
+ }
+
+ format_set_flag(format, flags);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(format_base_flags); ++i)
{
int fmt_idx = getFmtIdx(format_base_flags[i].id);
@@ -2906,24 +2970,24 @@ static BOOL init_typeless_formats(struct wined3d_gl_info *gl_info)
unsigned int flags[WINED3D_GL_RES_TYPE_COUNT];
unsigned int i, j;
- for (i = 0; i < ARRAY_SIZE(format_class_info); ++i)
+ for (i = 0; i < ARRAY_SIZE(typed_formats); ++i)
{
struct wined3d_format *format, *typeless_format;
- int fmt_idx = getFmtIdx(format_class_info[i].id);
- int typeless_fmt_idx = getFmtIdx(format_class_info[i].typeless_id);
+ int fmt_idx = getFmtIdx(typed_formats[i].id);
+ int typeless_fmt_idx = getFmtIdx(typed_formats[i].typeless_id);
if (fmt_idx == -1)
{
ERR("Format %s (%#x) not found.\n",
- debug_d3dformat(format_class_info[i].id),
- format_class_info[i].id);
+ debug_d3dformat(typed_formats[i].id),
+ typed_formats[i].id);
return FALSE;
}
if (typeless_fmt_idx == -1)
{
ERR("Format %s (%#x) not found.\n",
- debug_d3dformat(format_class_info[i].typeless_id),
- format_class_info[i].typeless_id);
+ debug_d3dformat(typed_formats[i].typeless_id),
+ typed_formats[i].typeless_id);
return FALSE;
}
@@ -2932,7 +2996,7 @@ static BOOL init_typeless_formats(struct wined3d_gl_info *gl_info)
memcpy(flags, typeless_format->flags, sizeof(flags));
*typeless_format = *format;
- typeless_format->id = format_class_info[i].typeless_id;
+ typeless_format->id = typed_formats[i].typeless_id;
for (j = 0; j < ARRAY_SIZE(typeless_format->flags); ++j)
typeless_format->flags[j] |= flags[j];
}
--
2.4.10
More information about the wine-patches
mailing list