Commit 39e19d2d authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Use a table for colour fixups in apply_format_fixups().

This ends up being slightly more code, but I think the table is much more readable. Signed-off-by: 's avatarHenri Verbeet <hverbeet@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent cff217f9
......@@ -3403,85 +3403,129 @@ static void init_format_filter_info(struct wined3d_adapter *adapter,
}
}
static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
static enum fixup_channel_source fixup_source_from_char(char c)
{
struct wined3d_format *format;
unsigned int i;
format = get_format_internal(adapter, WINED3DFMT_R16_FLOAT);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
switch (c)
{
default:
case '0':
return CHANNEL_SOURCE_ZERO;
case '1':
return CHANNEL_SOURCE_ONE;
case 'x':
case 'X':
return CHANNEL_SOURCE_X;
case 'y':
case 'Y':
return CHANNEL_SOURCE_Y;
case 'z':
case 'Z':
return CHANNEL_SOURCE_Z;
case 'w':
case 'W':
return CHANNEL_SOURCE_W;
}
}
format = get_format_internal(adapter, WINED3DFMT_R32_FLOAT);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
static unsigned int fixup_sign_from_char(char c)
{
if (c == 'x' || c == 'y' || c == 'z' || c == 'w')
return 1;
return 0;
}
format = get_format_internal(adapter, WINED3DFMT_R16G16_UNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
static struct color_fixup_desc create_color_fixup_desc_from_string(const char *s)
{
struct color_fixup_desc fixup;
format = get_format_internal(adapter, WINED3DFMT_R16G16_FLOAT);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
format = get_format_internal(adapter, WINED3DFMT_R32G32_FLOAT);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W);
/* GL_ATI_envmap_bumpmap in theory supports R8G8_SNORM but is no longer supported by
* any driver. */
if (gl_info->supported[NV_TEXTURE_SHADER] || gl_info->supported[EXT_TEXTURE_SNORM])
{
/* R8G8_SNORM and R16G16_SNORM need a fixup of the undefined blue channel. OpenGL
* returns 0.0 when sampling from it, DirectX 1.0. So we always have in-shader
* conversion for this format. */
format = get_format_internal(adapter, WINED3DFMT_R8G8_SNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
format = get_format_internal(adapter, WINED3DFMT_R16G16_SNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
}
else
if (strlen(s) != 4)
{
/* Emulate using unsigned formats. This requires load-time conversion in addition to the
* fixups here. */
format = get_format_internal(adapter, WINED3DFMT_R8G8_SNORM);
format->color_fixup = create_color_fixup_desc(
1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
format = get_format_internal(adapter, WINED3DFMT_R16G16_SNORM);
format->color_fixup = create_color_fixup_desc(
1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
format = get_format_internal(adapter, WINED3DFMT_R8G8B8A8_SNORM);
format->color_fixup = create_color_fixup_desc(
1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 1, CHANNEL_SOURCE_Z, 1, CHANNEL_SOURCE_W);
format = get_format_internal(adapter, WINED3DFMT_R5G5_SNORM_L6_UNORM);
format->color_fixup = create_color_fixup_desc(
1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE);
ERR("Invalid fixup string %s.\n", wine_dbgstr_a(s));
return COLOR_FIXUP_IDENTITY;
}
if (!gl_info->supported[NV_TEXTURE_SHADER])
fixup.x_sign_fixup = fixup_sign_from_char(s[0]);
fixup.x_source = fixup_source_from_char(s[0]);
fixup.y_sign_fixup = fixup_sign_from_char(s[1]);
fixup.y_source = fixup_source_from_char(s[1]);
fixup.z_sign_fixup = fixup_sign_from_char(s[2]);
fixup.z_source = fixup_source_from_char(s[2]);
fixup.w_sign_fixup = fixup_sign_from_char(s[3]);
fixup.w_source = fixup_source_from_char(s[3]);
return fixup;
}
static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
{
struct wined3d_format *format;
unsigned int i;
static const struct
{
format = get_format_internal(adapter, WINED3DFMT_R8G8_SNORM_L8X8_UNORM);
format->color_fixup = create_color_fixup_desc(
1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_W);
enum wined3d_format_id id;
const char *fixup;
enum wined3d_gl_extension extension;
}
if (gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC] || gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
fixups[] =
{
format = get_format_internal(adapter, WINED3DFMT_ATI1N);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X);
{WINED3DFMT_R16_FLOAT, "X11W", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R32_FLOAT, "X11W", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R16G16_UNORM, "XY1W", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R16G16_FLOAT, "XY1W", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R32G32_FLOAT, "XY1W", WINED3D_GL_EXT_NONE},
format = get_format_internal(adapter, WINED3DFMT_ATI2N);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
}
else if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC])
{WINED3DFMT_R8G8_SNORM, "xy11", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R8G8_SNORM, "XY11", NV_TEXTURE_SHADER},
{WINED3DFMT_R8G8_SNORM, "XY11", EXT_TEXTURE_SNORM},
{WINED3DFMT_R16G16_SNORM, "xy11", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R16G16_SNORM, "XY11", NV_TEXTURE_SHADER},
{WINED3DFMT_R16G16_SNORM, "XY11", EXT_TEXTURE_SNORM},
{WINED3DFMT_R8G8B8A8_SNORM, "xyzw", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R8G8B8A8_SNORM, "XYZW", NV_TEXTURE_SHADER},
{WINED3DFMT_R8G8B8A8_SNORM, "XYZW", EXT_TEXTURE_SNORM},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, "xzY1", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", NV_TEXTURE_SHADER},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", EXT_TEXTURE_SNORM},
{WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "xyZW", WINED3D_GL_EXT_NONE},
{WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "XYZW", NV_TEXTURE_SHADER},
{WINED3DFMT_ATI1N, "XXXX", EXT_TEXTURE_COMPRESSION_RGTC},
{WINED3DFMT_ATI1N, "XXXX", ARB_TEXTURE_COMPRESSION_RGTC},
{WINED3DFMT_ATI2N, "XW11", ATI_TEXTURE_COMPRESSION_3DC},
{WINED3DFMT_ATI2N, "YX11", EXT_TEXTURE_COMPRESSION_RGTC},
{WINED3DFMT_ATI2N, "YX11", ARB_TEXTURE_COMPRESSION_RGTC},
{WINED3DFMT_A8_UNORM, "000X", WINED3D_GL_EXT_NONE},
{WINED3DFMT_A8_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
{WINED3DFMT_L8A8_UNORM, "XXXY", WINED3D_GL_EXT_NONE},
{WINED3DFMT_L8A8_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
{WINED3DFMT_L4A4_UNORM, "XXXY", WINED3D_GL_EXT_NONE},
{WINED3DFMT_L4A4_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
{WINED3DFMT_L16_UNORM, "XXX1", WINED3D_GL_EXT_NONE},
{WINED3DFMT_L16_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
{WINED3DFMT_INTZ, "XXXX", WINED3D_GL_EXT_NONE},
{WINED3DFMT_INTZ, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
{WINED3DFMT_L8_UNORM, "XXX1", ARB_TEXTURE_RG},
};
for (i = 0; i < ARRAY_SIZE(fixups); ++i)
{
format = get_format_internal(adapter, WINED3DFMT_ATI2N);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_W, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
if (!gl_info->supported[fixups[i].extension])
continue;
format = get_format_internal(adapter, fixups[i].id);
format->color_fixup = create_color_fixup_desc_from_string(fixups[i].fixup);
}
if (!gl_info->supported[APPLE_YCBCR_422] && (gl_info->supported[ARB_FRAGMENT_PROGRAM]
......@@ -3527,32 +3571,6 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
format->glInternal = 0;
}
if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT])
{
format = get_format_internal(adapter, WINED3DFMT_A8_UNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_ZERO, 0, CHANNEL_SOURCE_ZERO, 0, CHANNEL_SOURCE_ZERO, 0, CHANNEL_SOURCE_X);
format = get_format_internal(adapter, WINED3DFMT_L8A8_UNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y);
format = get_format_internal(adapter, WINED3DFMT_L4A4_UNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y);
format = get_format_internal(adapter, WINED3DFMT_L16_UNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE);
format = get_format_internal(adapter, WINED3DFMT_INTZ);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X);
}
if (gl_info->supported[ARB_TEXTURE_RG])
{
format = get_format_internal(adapter, WINED3DFMT_L8_UNORM);
format->color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE);
}
if (gl_info->supported[ARB_FRAGMENT_PROGRAM] || gl_info->supported[ARB_FRAGMENT_SHADER])
{
format = get_format_internal(adapter, WINED3DFMT_P8_UINT);
......
......@@ -201,20 +201,6 @@ struct wined3d_d3d_info
static const struct color_fixup_desc COLOR_FIXUP_IDENTITY =
{0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_W};
static inline struct color_fixup_desc create_color_fixup_desc(
int sign0, enum fixup_channel_source src0, int sign1, enum fixup_channel_source src1,
int sign2, enum fixup_channel_source src2, int sign3, enum fixup_channel_source src3)
{
struct color_fixup_desc fixup =
{
sign0, src0,
sign1, src1,
sign2, src2,
sign3, src3,
};
return fixup;
}
static inline struct color_fixup_desc create_complex_fixup_desc(enum complex_fixup complex_fixup)
{
struct color_fixup_desc fixup =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment