From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/format_gl.c | 62 ++++++++++++++++++++++++++- dlls/wined3d/utils.c | 76 +--------------------------------- dlls/wined3d/wined3d_private.h | 2 + 3 files changed, 64 insertions(+), 76 deletions(-)
diff --git a/dlls/wined3d/format_gl.c b/dlls/wined3d/format_gl.c index 76bc702479e..717210556b0 100644 --- a/dlls/wined3d/format_gl.c +++ b/dlls/wined3d/format_gl.c @@ -61,6 +61,9 @@ struct wined3d_format_texture_info unsigned int caps; enum wined3d_gl_extension extension; wined3d_format_conversion_func upload, download, decompress; + + const char *fixup_desc; + bool legacy_fixup; };
static void convert_l4a4_unorm(const uint8_t *src, uint8_t *dst, @@ -730,6 +733,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_FLOAT, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_FLOAT, + .fixup_desc = "X11W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R32_FLOAT, @@ -738,6 +743,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_FLOAT, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_RG, + .fixup_desc = "X11W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R32G32_FLOAT, @@ -748,6 +755,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_FLOAT, .upload = convert_r32g32_float, + .fixup_desc = "XY1W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R32G32_FLOAT, @@ -756,6 +765,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_FLOAT, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_RG, + .fixup_desc = "XY1W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R32G32B32_FLOAT, @@ -781,6 +792,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_HALF_FLOAT_ARB, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_FLOAT, + .fixup_desc = "X11W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16_FLOAT, @@ -789,6 +802,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_HALF_FLOAT_ARB, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_RG, + .fixup_desc = "X11W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16G16_FLOAT, @@ -799,6 +814,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_FLOAT, .upload = convert_r16g16, + .fixup_desc = "XY1W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16G16_FLOAT, @@ -807,6 +824,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_HALF_FLOAT_ARB, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, .extension = ARB_TEXTURE_RG, + .fixup_desc = "XY1W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16G16B16A16_FLOAT, @@ -939,6 +958,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, .extension = ARB_TEXTURE_RG, + .fixup_desc = "000X", }, { .id = WINED3DFMT_A8_UNORM, @@ -1014,6 +1034,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .conv_byte_count = 6, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .upload = convert_r16g16, + .fixup_desc = "XY1W", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16G16_UNORM, @@ -1023,6 +1045,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, .extension = ARB_TEXTURE_RG, + .fixup_desc = "XY1W", + .legacy_fixup = true, }, { .id = WINED3DFMT_B10G10R10A2_UNORM, @@ -1189,6 +1213,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, .extension = ARB_TEXTURE_RG, + .fixup_desc = "XXX1", }, { .id = WINED3DFMT_L8A8_UNORM, @@ -1197,6 +1222,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_UNSIGNED_BYTE, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = ARB_TEXTURE_RG, + .fixup_desc = "XXXY", }, { .id = WINED3DFMT_L8A8_UNORM, @@ -1217,6 +1243,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_FILTERING, .extension = ARB_TEXTURE_RG, .upload = convert_l4a4_unorm, + .fixup_desc = "XXXY", }, { .id = WINED3DFMT_L4A4_UNORM, @@ -1235,6 +1262,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_UNSIGNED_SHORT, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = ARB_TEXTURE_RG, + .fixup_desc = "XXX1", }, { .id = WINED3DFMT_L16_UNORM, @@ -1253,6 +1281,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .conv_byte_count = 3, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .upload = convert_r8g8_snorm, + .fixup_desc = "xy11", }, { .id = WINED3DFMT_R8G8_SNORM, @@ -1261,6 +1290,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_BYTE, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = NV_TEXTURE_SHADER, + .fixup_desc = "XY11", + .legacy_fixup = true, }, { .id = WINED3DFMT_R8G8_SNORM, @@ -1270,6 +1301,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, .extension = EXT_TEXTURE_SNORM, + .fixup_desc = "XY11", + .legacy_fixup = true, }, { .id = WINED3DFMT_R5G5_SNORM_L6_UNORM, @@ -1279,6 +1312,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .conv_byte_count = 2, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .upload = convert_r5g5_snorm_l6_unorm, + .fixup_desc = "xzY1", }, { .id = WINED3DFMT_R5G5_SNORM_L6_UNORM, @@ -1308,6 +1342,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .conv_byte_count = 4, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .upload = convert_r8g8_snorm_l8x8_unorm, + .fixup_desc = "xyZW", }, { .id = WINED3DFMT_R8G8_SNORM_L8X8_UNORM, @@ -1327,6 +1362,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .conv_byte_count = 4, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .upload = convert_r8g8b8a8_snorm, + .fixup_desc = "xyzw", }, { .id = WINED3DFMT_R8G8B8A8_SNORM, @@ -1353,6 +1389,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .conv_byte_count = 6, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .upload = convert_r16g16_snorm, + .fixup_desc = "xy11", }, { .id = WINED3DFMT_R16G16_SNORM, @@ -1361,6 +1398,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_SHORT, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = NV_TEXTURE_SHADER, + .fixup_desc = "XY11", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16G16_SNORM, @@ -1370,6 +1409,8 @@ static const struct wined3d_format_texture_info format_texture_info[] = .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, .extension = EXT_TEXTURE_SNORM, + .fixup_desc = "XY11", + .legacy_fixup = true, }, { .id = WINED3DFMT_R16G16B16A16_SNORM, @@ -1520,6 +1561,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_UNSIGNED_BYTE, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = ARB_TEXTURE_COMPRESSION_RGTC, + .fixup_desc = "XXXX", }, { .id = WINED3DFMT_ATI2N, @@ -1528,6 +1570,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_UNSIGNED_BYTE, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = ATI_TEXTURE_COMPRESSION_3DC, + .fixup_desc = "XW11", }, { .id = WINED3DFMT_ATI2N, @@ -1536,6 +1579,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_UNSIGNED_BYTE, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = EXT_TEXTURE_COMPRESSION_RGTC, + .fixup_desc = "YX11", }, { .id = WINED3DFMT_ATI2N, @@ -1544,6 +1588,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = .type = GL_UNSIGNED_BYTE, .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, .extension = ARB_TEXTURE_COMPRESSION_RGTC, + .fixup_desc = "YX11", }, { .id = WINED3DFMT_INTZ, @@ -1554,6 +1599,16 @@ static const struct wined3d_format_texture_info format_texture_info[] = | WINED3D_FORMAT_CAP_DEPTH_STENCIL, .extension = EXT_PACKED_DEPTH_STENCIL, }, + { + .id = WINED3DFMT_INTZ, + .internal = GL_DEPTH24_STENCIL8, + .format = GL_DEPTH_STENCIL, + .type = GL_UNSIGNED_INT_24_8, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL, + .extension = WINED3D_GL_CORE_CONTEXT, + .fixup_desc = "XXXX", + }, { .id = WINED3DFMT_NULL, .internal = 0, @@ -1831,6 +1886,7 @@ static void query_internal_format(struct wined3d_adapter *adapter,
bool adapter_gl_init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info) { + bool use_legacy_fixups = adapter->d3d_info.wined3d_creation_flags & WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR; struct wined3d_format_gl *format, *srgb_format; enum wined3d_format_id srgb_format_id; struct fragment_caps fragment_caps; @@ -1872,7 +1928,6 @@ bool adapter_gl_init_format_texture_info(struct wined3d_adapter *adapter, struct format->rt_internal = info->rt_internal; format->format = info->format; format->type = info->type; - format->f.color_fixup = COLOR_FIXUP_IDENTITY; format->f.height_scale.numerator = 1; format->f.height_scale.denominator = 1;
@@ -1911,6 +1966,11 @@ bool adapter_gl_init_format_texture_info(struct wined3d_adapter *adapter, struct format->f.upload = info->upload; format->f.download = info->download;
+ if (info->fixup_desc && (use_legacy_fixups || !info->legacy_fixup)) + format->f.color_fixup = create_color_fixup_desc_from_string(info->fixup_desc); + else + format->f.color_fixup = COLOR_FIXUP_IDENTITY; + srgb_format_id = wined3d_format_get_srgb_format(format->f.id); if (srgb_format_id == WINED3DFMT_UNKNOWN) continue; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 56763487495..3967a1aa4ae 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -2135,7 +2135,7 @@ static unsigned int fixup_sign_from_char(char c) return 0; }
-static struct color_fixup_desc create_color_fixup_desc_from_string(const char *s) +struct color_fixup_desc create_color_fixup_desc_from_string(const char *s) { struct color_fixup_desc fixup;
@@ -2159,83 +2159,9 @@ static struct color_fixup_desc create_color_fixup_desc_from_string(const char *s
static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info) { - const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info; struct wined3d_format_gl *format; - BOOL use_legacy_fixups; unsigned int i;
- static const struct - { - enum wined3d_format_id id; - const char *fixup; - BOOL legacy; - enum wined3d_gl_extension extension; - } - fixups[] = - { - {WINED3DFMT_R16_FLOAT, "X11W", TRUE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R32_FLOAT, "X11W", TRUE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16_UNORM, "XY1W", TRUE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16_FLOAT, "XY1W", TRUE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R32G32_FLOAT, "XY1W", TRUE, WINED3D_GL_EXT_NONE}, - - {WINED3DFMT_R8G8_SNORM, "xy11", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R8G8_SNORM, "XY11", TRUE, NV_TEXTURE_SHADER}, - {WINED3DFMT_R8G8_SNORM, "XY11", TRUE, EXT_TEXTURE_SNORM}, - - {WINED3DFMT_R16G16_SNORM, "xy11", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16_SNORM, "XY11", TRUE, NV_TEXTURE_SHADER}, - {WINED3DFMT_R16G16_SNORM, "XY11", TRUE, EXT_TEXTURE_SNORM}, - - {WINED3DFMT_R8G8B8A8_SNORM, "xyzw", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R8G8B8A8_SNORM, "XYZW", FALSE, NV_TEXTURE_SHADER}, - {WINED3DFMT_R8G8B8A8_SNORM, "XYZW", FALSE, EXT_TEXTURE_SNORM}, - - {WINED3DFMT_R5G5_SNORM_L6_UNORM, "xzY1", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", FALSE, NV_TEXTURE_SHADER}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", FALSE, EXT_TEXTURE_SNORM}, - - {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "xyZW", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "XYZW", FALSE, NV_TEXTURE_SHADER}, - - {WINED3DFMT_ATI1N, "XXXX", FALSE, EXT_TEXTURE_COMPRESSION_RGTC}, - {WINED3DFMT_ATI1N, "XXXX", FALSE, ARB_TEXTURE_COMPRESSION_RGTC}, - - {WINED3DFMT_ATI2N, "XW11", FALSE, ATI_TEXTURE_COMPRESSION_3DC}, - {WINED3DFMT_ATI2N, "YX11", FALSE, EXT_TEXTURE_COMPRESSION_RGTC}, - {WINED3DFMT_ATI2N, "YX11", FALSE, ARB_TEXTURE_COMPRESSION_RGTC}, - - {WINED3DFMT_A8_UNORM, "000X", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A8_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT}, - - {WINED3DFMT_L8A8_UNORM, "XXXY", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_L8A8_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT}, - - {WINED3DFMT_L4A4_UNORM, "XXXY", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_L4A4_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT}, - - {WINED3DFMT_L16_UNORM, "XXX1", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_L16_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT}, - - {WINED3DFMT_INTZ, "XXXX", FALSE, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_INTZ, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT}, - - {WINED3DFMT_L8_UNORM, "XXX1", FALSE, ARB_TEXTURE_RG}, - }; - - use_legacy_fixups = d3d_info->wined3d_creation_flags & WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR; - for (i = 0; i < ARRAY_SIZE(fixups); ++i) - { - if (fixups[i].legacy && !use_legacy_fixups) - continue; - - if (!gl_info->supported[fixups[i].extension]) - continue; - - format = get_format_gl_internal(adapter, fixups[i].id); - format->f.color_fixup = create_color_fixup_desc_from_string(fixups[i].fixup); - } - if (!gl_info->supported[APPLE_YCBCR_422] && !gl_info->supported[APPLE_RGB_422] && (gl_info->supported[ARB_FRAGMENT_PROGRAM] || (gl_info->supported[ARB_FRAGMENT_SHADER] && gl_info->supported[ARB_VERTEX_SHADER]))) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index c9c62ab657e..2eb313868e3 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -180,6 +180,8 @@ struct color_fixup_desc }; #include <poppack.h>
+struct color_fixup_desc create_color_fixup_desc_from_string(const char *s); + struct fragment_caps { unsigned int PrimitiveMiscCaps;