This series begins the process of moving GL format detection code to a separate file, for reasons described in 1/6 and [1].
Still, if this is deemed undesirable or not worthwhile, I don't particularly mind dropping this and/or further refactoring work. At this point my initial goal, viz. to find all of the code in wined3d that implicitly assumes it's running under the GL backend, has basically been accomplished.
[1] https://gitlab.winehq.org/wine/wine/-/merge_requests/3238
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/utils.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index a46a4c7257d..07e2190db20 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1929,6 +1929,17 @@ static const struct wined3d_format_srgb_info format_srgb_info[] = {WINED3DFMT_BC7_UNORM_SRGB, WINED3DFMT_BC7_UNORM}, };
+static enum wined3d_format_id wined3d_format_get_srgb_format(enum wined3d_format_id id) +{ + for (unsigned int i = 0; i < ARRAY_SIZE(format_srgb_info); ++i) + { + if (format_srgb_info[i].base_format_id == id) + return format_srgb_info[i].srgb_format_id; + } + + return WINED3DFMT_UNKNOWN; +} + static inline int get_format_idx(enum wined3d_format_id format_id) { unsigned int i; @@ -3186,6 +3197,7 @@ static void query_internal_format(struct wined3d_adapter *adapter, static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info) { struct wined3d_format_gl *format, *srgb_format; + enum wined3d_format_id srgb_format_id; struct fragment_caps fragment_caps; struct shader_caps shader_caps; unsigned int i, j; @@ -3262,18 +3274,11 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win format->f.upload = format_texture_info[i].upload; format->f.download = format_texture_info[i].download;
- srgb_format = NULL; - for (j = 0; j < ARRAY_SIZE(format_srgb_info); ++j) - { - if (format_srgb_info[j].base_format_id == format->f.id) - { - if (!(srgb_format = get_format_gl_internal(adapter, format_srgb_info[j].srgb_format_id))) - return FALSE; - break; - } - } - if (!srgb_format) + srgb_format_id = wined3d_format_get_srgb_format(format->f.id); + if (srgb_format_id == WINED3DFMT_UNKNOWN) continue; + if (!(srgb_format = get_format_gl_internal(adapter, srgb_format_id))) + return FALSE;
copy_format(adapter, &srgb_format->f, &format->f);
From: Zebediah Figura zfigura@codeweavers.com
Part of an effort to cleanly separate GL, Vulkan, and common code.
The rationale is broadly described in [1]. In the case if GL format detection specifically, we are splitting about 2500-3000 lines of code that has a single conceptual purpose and minimal interaction with other files (ultimately we make 6 more functions non-static).
[1] https://gitlab.winehq.org/wine/wine/-/merge_requests/3238 --- dlls/wined3d/Makefile.in | 1 + dlls/wined3d/format_gl.c | 1407 ++++++++++++++++++++++++++++++++ dlls/wined3d/utils.c | 1381 +------------------------------ dlls/wined3d/wined3d_gl.h | 10 +- dlls/wined3d/wined3d_private.h | 1 + 5 files changed, 1422 insertions(+), 1378 deletions(-) create mode 100644 dlls/wined3d/format_gl.c
diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in index 35de4aec8da..5797e2dca95 100644 --- a/dlls/wined3d/Makefile.in +++ b/dlls/wined3d/Makefile.in @@ -15,6 +15,7 @@ SOURCES = \ cs.c \ device.c \ directx.c \ + format_gl.c \ gl_compat.c \ glsl_shader.c \ nvidia_texture_shader.c \ diff --git a/dlls/wined3d/format_gl.c b/dlls/wined3d/format_gl.c new file mode 100644 index 00000000000..b899b2913fc --- /dev/null +++ b/dlls/wined3d/format_gl.c @@ -0,0 +1,1407 @@ +/* + * OpenGL format initialization + * + * Copyright 2002-2004 Jason Edmeades + * Copyright 2003-2004 Raphael Junqueira + * Copyright 2004 Christian Costa + * Copyright 2005 Oliver Stieber + * Copyright 2006-2008 Henri Verbeet + * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009-2010 Henri Verbeet for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wined3d_private.h" +#include "wined3d_gl.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); + +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; + memcpy(dst_format, src_format, adapter->format_size); + dst_format->id = id; +} + +static void format_set_caps(struct wined3d_format *format, unsigned int caps) +{ + for (unsigned int i = 0; i < ARRAY_SIZE(format->caps); ++i) + format->caps[i] |= caps; +} + +static void format_clear_caps(struct wined3d_format *format, unsigned int caps) +{ + for (unsigned int i = 0; i < ARRAY_SIZE(format->caps); ++i) + format->caps[i] &= ~caps; +} + +struct wined3d_format_texture_info +{ + enum wined3d_format_id id; + GLint internal; + GLint srgb_internal; + GLint rt_internal; + GLint format; + GLint type; + unsigned int conv_byte_count; + unsigned int caps; + enum wined3d_gl_extension extension; + void (*upload)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth); + void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth); + void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth); +}; + +static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + /* WINED3DFMT_L4A4_UNORM exists as an internal GL format, but for some + * reason there is not a format+type combination to load it. Thus convert + * it to A8L8, then load it with A4L4 internal, but A8L8 format+type. */ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint8_t *source = src + z * src_slice_pitch + y * src_row_pitch; + uint8_t *dest = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint8_t color = *source++; + + /* A */ dest[1] = (color & 0xf0u) << 0; + /* L */ dest[0] = (color & 0x0fu) << 4; + dest += 2; + } + } + } +} + +static void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + /* Emulating signed 5 bit 2values with unsigned 5 bit values has some + * precision problems by design, e.g. the signed input value 0 becomes 16. + * GL normalizes it to 16 / 31 = 0.516. We convert it back to a signed + * value by subtracting 0.5 and multiplying by 2.0. The resulting value is + * ((16 / 31) - 0.5) * 2.0 = 0.032, which is quite different from the + * intended result 0.000. */ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint16_t *texel_in = (const uint16_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint16_t *texel_out = (uint16_t *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + + for (unsigned int x = 0; x < width; ++x) + { + uint8_t l_in = (*texel_in & 0xfc00u) >> 10; + uint8_t g_in = (*texel_in & 0x03e0u) >> 5; + uint8_t r_in = *texel_in & 0x001fu; + + *texel_out = ((r_in + 16) << 11) | (l_in << 5) | (g_in + 16); + texel_out++; + texel_in++; + } + } + } +} + +static void convert_r5g5_snorm_l6_unorm_ext(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint16_t *texel_in = (const uint16_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint8_t *texel_out = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint8_t l_in = (*texel_in & 0xfc00u) >> 10; + uint8_t g_in = (*texel_in & 0x03e0u) >> 5; + uint8_t r_in = *texel_in & 0x001fu; + uint8_t r_out, g_out; + + r_out = r_in << 3; + if (!(r_in & 0x10)) /* r > 0 */ + r_out |= r_in >> 1; + + g_out = g_in << 3; + if (!(g_in & 0x10)) /* g > 0 */ + g_out |= g_in >> 1; + + texel_out[0] = r_out; + texel_out[1] = g_out; + texel_out[2] = l_in << 1 | l_in >> 5; + texel_out[3] = 0; + + texel_out += 4; + texel_in++; + } + } + } +} + +static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + /* This makes the gl surface bigger (24 bit instead of 16), but it works + * with fixed function and shaders without further conversion once the + * surface is loaded. + * + * The difference between this function and convert_r5g5_snorm_l6_unorm_ext + * is that convert_r5g5_snorm_l6_unorm_ext creates a 32 bit xRGB texture + * and this function creates a 24 bit DSDT_MAG texture. Trying to load a + * DSDT_MAG internal with a 32 bit DSDT_MAG_INTENSITY or DSDT_MAG_VIB + * format fails. */ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint16_t *texel_in = (const uint16_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint8_t *texel_out = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint8_t l_in = (*texel_in & 0xfc00u) >> 10; + uint8_t g_in = (*texel_in & 0x03e0u) >> 5; + uint8_t r_in = *texel_in & 0x001fu; + uint8_t ds_out, dt_out; + + ds_out = r_in << 3; + if (!(r_in & 0x10)) /* r > 0 */ + ds_out |= r_in >> 1; + + dt_out = g_in << 3; + if (!(g_in & 0x10)) /* g > 0 */ + dt_out |= g_in >> 1; + + texel_out[0] = ds_out; + texel_out[1] = dt_out; + texel_out[2] = l_in << 1 | l_in >> 5; + + texel_out += 3; + texel_in++; + } + } + } +} + +static void convert_r8g8_snorm(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint16_t *source = (const uint16_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint8_t *dest = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint16_t color = *source++; + + /* B */ dest[0] = 0xff; + /* G */ dest[1] = (color >> 8) + 128; /* V */ + /* R */ dest[2] = (color & 0xff) + 128; /* U */ + dest += 3; + } + } + } +} + +static void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + /* Doesn't work correctly with the fixed function pipeline, but can work in + * shaders if the shader is adjusted. (There's no use for this format in + * GL's standard fixed function pipeline anyway). */ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint8_t *dest = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint32_t color = *source++; + + /* B */ dest[0] = ((color >> 16) & 0xff); /* L */ + /* G */ dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */ + /* R */ dest[2] = (color & 0xff) + 128; /* U */ + dest += 4; + } + } + } +} + +static void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + /* This implementation works with the fixed function pipeline and shaders + * without further modification after converting the surface. */ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint8_t *dest = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint32_t color = *source++; + + /* L */ dest[2] = ((color >> 16) & 0xff); /* L */ + /* V */ dest[1] = ((color >> 8 ) & 0xff); /* V */ + /* U */ dest[0] = (color & 0xff); /* U */ + /* I */ dest[3] = 255; /* X */ + dest += 4; + } + } + } +} + +static void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint8_t *dest = dst + z * dst_slice_pitch + y * dst_row_pitch; + + for (unsigned int x = 0; x < width; ++x) + { + uint32_t color = *source++; + + /* B */ dest[0] = ((color >> 16) & 0xff) + 128; /* W */ + /* G */ dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */ + /* R */ dest[2] = (color & 0xff) + 128; /* U */ + /* A */ dest[3] = ((color >> 24) & 0xff) + 128; /* Q */ + dest += 4; + } + } + } +} + +static void convert_r16g16_snorm(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint16_t *dest = (uint16_t *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + + for (unsigned int x = 0; x < width; ++x) + { + uint32_t color = *source++; + + /* B */ dest[0] = 0xffff; + /* G */ dest[1] = (color >> 16) + 32768; /* V */ + /* R */ dest[2] = (color & 0xffff) + 32768; /* U */ + dest += 3; + } + } + } +} + +static void convert_r16g16(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint16_t *source = (const uint16_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint16_t *dest = (uint16_t *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + + for (unsigned int x = 0; x < width; ++x) + { + uint16_t green = *source++; + uint16_t red = *source++; + + dest[0] = green; + dest[1] = red; + /* Strictly speaking this is not correct for R16G16F, but it + * doesn't matter because the shader overwrites it anyway. */ + dest[2] = 0xffff; + dest += 3; + } + } + } +} + +static void convert_r32g32_float(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const float *source = (const float *)(src + z * src_slice_pitch + y * src_row_pitch); + float *dest = (float *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + + for (unsigned int x = 0; x < width; ++x) + { + float green = *source++; + float red = *source++; + + dest[0] = green; + dest[1] = red; + dest[2] = 1.0f; + dest += 3; + } + } + } +} + +static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + float *dest_f = (float *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + uint32_t *dest_s = (uint32_t *)dest_f; + + for (unsigned int x = 0; x < width; ++x) + { + dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00u) >> 8); + dest_s[x * 2 + 1] = source[x] & 0xff; + } + } + } +} + +static void x8_d24_unorm_upload(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint32_t *dest = (uint32_t *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + + for (unsigned int x = 0; x < width; ++x) + dest[x] = source[x] << 8 | ((source[x] >> 16) & 0xff); + } + } +} + +static void x8_d24_unorm_download(const BYTE *src, BYTE *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth) +{ + for (unsigned int z = 0; z < depth; ++z) + { + for (unsigned int y = 0; y < height; ++y) + { + const uint32_t *source = (const uint32_t *)(src + z * src_slice_pitch + y * src_row_pitch); + uint32_t *dest = (uint32_t *)(dst + z * dst_slice_pitch + y * dst_row_pitch); + + for (unsigned int x = 0; x < width; ++x) + dest[x] = source[x] >> 8; + } + } +} + +/* We intentionally don't support WINED3DFMT_D32_UNORM. No hardware driver + * supports it, and applications get confused when we do. + * + * The following formats explicitly don't have WINED3D_FORMAT_CAP_TEXTURE set: + * + * These are never supported on native. + * WINED3DFMT_B8G8R8_UNORM + * WINED3DFMT_B2G3R3_UNORM + * WINED3DFMT_L4A4_UNORM + * WINED3DFMT_S1_UINT_D15_UNORM + * WINED3DFMT_S4X4_UINT_D24_UNORM + * + * Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of ddraw. + * Since it is not widely available, don't offer it. Further no Windows driver + * offers WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either. + * WINED3DFMT_P8_UINT + * WINED3DFMT_P8_UINT_A8_UNORM + * + * These formats seem to be similar to the HILO formats in + * GL_NV_texture_shader. NVHU is said to be GL_UNSIGNED_HILO16, + * NVHS GL_SIGNED_HILO16. Rumours say that D3D computes a 3rd channel + * similarly to D3DFMT_CxV8U8 (So NVHS could be called D3DFMT_CxV16U16). ATI + * refused to support formats which can easily be emulated with pixel shaders, + * so applications have to deal with not having NVHS and NVHU. + * WINED3DFMT_NVHU + * WINED3DFMT_NVHS */ +static const struct wined3d_format_texture_info format_texture_info[] = +{ + /* format id internal srgb_internal rt_internal + format type conv_byte_count + caps + extension upload download */ + /* FourCC formats */ + /* GL_APPLE_ycbcr_422 claims that its '2YUV' format, which is supported via the UNSIGNED_SHORT_8_8_REV_APPLE type + * is equivalent to 'UYVY' format on Windows, and the 'YUVS' via UNSIGNED_SHORT_8_8_APPLE equates to 'YUY2'. The + * d3d9 test however shows that the opposite is true. Since the extension is from 2002, it predates the x86 based + * Macs, so probably the endianness differs. This could be tested as soon as we have a Windows and MacOS on a big + * endian machine + */ + {WINED3DFMT_UYVY, GL_RG8, GL_RG8, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_UYVY, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE8_ALPHA8, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_UYVY, GL_RGB_RAW_422_APPLE, GL_RGB_RAW_422_APPLE, 0, + GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0, + WINED3D_FORMAT_CAP_FILTERING, + APPLE_RGB_422, NULL}, + {WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0, + GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, + APPLE_YCBCR_422, NULL}, + {WINED3DFMT_YUY2, GL_RG8, GL_RG8, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_YUY2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE8_ALPHA8, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_YUY2, GL_RGB_RAW_422_APPLE, GL_RGB_RAW_422_APPLE, 0, + GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0, + WINED3D_FORMAT_CAP_FILTERING, + APPLE_RGB_422, NULL}, + {WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0, + GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, + APPLE_YCBCR_422, NULL}, + {WINED3DFMT_YV12, GL_R8, GL_R8, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_YV12, GL_ALPHA8, GL_ALPHA8, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_NV12, GL_R8, GL_R8, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_NV12, GL_ALPHA8, GL_ALPHA8, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_BC1_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_BC2_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_BC3_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + EXT_TEXTURE_COMPRESSION_S3TC, NULL}, + {WINED3DFMT_BC4_UNORM, GL_COMPRESSED_RED_RGTC1, GL_COMPRESSED_RED_RGTC1, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_BC4_SNORM, GL_COMPRESSED_SIGNED_RED_RGTC1, GL_COMPRESSED_SIGNED_RED_RGTC1, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_BC5_UNORM, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_BC5_SNORM, GL_COMPRESSED_SIGNED_RG_RGTC2, GL_COMPRESSED_SIGNED_RG_RGTC2, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_BC6H_UF16, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_BPTC, NULL}, + {WINED3DFMT_BC6H_SF16, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_BPTC, NULL}, + {WINED3DFMT_BC7_UNORM, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_BPTC, NULL}, + /* IEEE formats */ + {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, + GL_RED, GL_FLOAT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_FLOAT, NULL}, + {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0, + GL_RED, GL_FLOAT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, + GL_RGB, GL_FLOAT, 12, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_FLOAT, convert_r32g32_float}, + {WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0, + GL_RG, GL_FLOAT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R32G32B32_FLOAT, GL_RGB32F, GL_RGB32F, 0, + GL_RGB, GL_FLOAT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_FLOAT, NULL}, + {WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0, + GL_RGBA, GL_FLOAT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_FLOAT, NULL}, + /* Float */ + {WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, + GL_RED, GL_HALF_FLOAT_ARB, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_FLOAT, NULL}, + {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0, + GL_RED, GL_HALF_FLOAT_ARB, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, + GL_RGB, GL_HALF_FLOAT_ARB, 6, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_FLOAT, convert_r16g16}, + {WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0, + GL_RG, GL_HALF_FLOAT_ARB, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0, + GL_RGBA, GL_HALF_FLOAT_ARB, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_RENDERTARGET + | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_FLOAT, NULL}, + {WINED3DFMT_R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, 0, + GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_PACKED_FLOAT}, + /* Palettized formats */ + {WINED3DFMT_P8_UINT, GL_R8, GL_R8, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + 0, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_P8_UINT, GL_ALPHA8, GL_ALPHA8, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, 0, + 0, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + /* Standard ARGB formats */ + {WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0, + GL_BGR, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE + | WINED3D_FORMAT_CAP_VTF, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_SRGB8_EXT, GL_RGB8, + GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B5G6R5_UNORM, GL_RGB565, GL_SRGB8_EXT, GL_RGB8, + GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, + ARB_ES2_COMPATIBILITY, NULL}, + {WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5, 0, + GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0, + GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0, + GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0, + GL_RGB, GL_UNSIGNED_BYTE_3_3_2, 0, + WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R8_UNORM, GL_R8, GL_R8, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_A8_UNORM, GL_R8, GL_R8, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0, + GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGB10_A2UI, 0, + GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RGB10_A2UI, NULL}, + {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, + GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, + GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE + | WINED3D_FORMAT_CAP_VTF, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, 0, + GL_RGBA_INTEGER, GL_UNSIGNED_INT_8_8_8_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RGB10_A2UI, NULL}, + {WINED3DFMT_R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA8I, 0, + GL_RGBA_INTEGER, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_INTEGER, NULL}, + {WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0, + GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16, + GL_RGB, GL_UNSIGNED_SHORT, 6, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, convert_r16g16}, + {WINED3DFMT_R16G16_UNORM, GL_RG16, GL_RG16, 0, + GL_RG, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, + GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0, + GL_RGBA, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_R8G8_UNORM, GL_RG8, GL_RG8, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R8G8_UINT, GL_RG8UI, GL_RG8UI, 0, + GL_RG_INTEGER, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R8G8_SINT, GL_RG8I, GL_RG8I, 0, + GL_RG_INTEGER, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA16UI, 0, + GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_INTEGER, NULL}, + {WINED3DFMT_R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA16I, 0, + GL_RGBA_INTEGER, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_INTEGER, NULL}, + {WINED3DFMT_R32G32_UINT, GL_RG32UI, GL_RG32UI, 0, + GL_RG_INTEGER, GL_UNSIGNED_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R32G32_SINT, GL_RG32I, GL_RG32I, 0, + GL_RG_INTEGER, GL_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16G16_UINT, GL_RG16UI, GL_RG16UI, 0, + GL_RG_INTEGER, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16G16_SINT, GL_RG16I, GL_RG16I, 0, + GL_RG_INTEGER, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R32_UINT, GL_R32UI, GL_R32UI, 0, + GL_RED_INTEGER, GL_UNSIGNED_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R32_SINT, GL_R32I, GL_R32I, 0, + GL_RED_INTEGER, GL_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16_UNORM, GL_R16, GL_R16, 0, + GL_RED, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16_UINT, GL_R16UI, GL_R16UI, 0, + GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R16_SINT, GL_R16I, GL_R16I, 0, + GL_RED_INTEGER, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R8_UINT, GL_R8UI, GL_R8UI, 0, + GL_RED_INTEGER, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_R8_SINT, GL_R8I, GL_R8I, 0, + GL_RED_INTEGER, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + /* Luminance */ + {WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0, + GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_L8_UNORM, GL_R8, GL_R8, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_L8A8_UNORM, GL_RG8, GL_RG8, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + {WINED3DFMT_L4A4_UNORM, GL_RG8, GL_RG8, 0, + GL_RG, GL_UNSIGNED_BYTE, 2, + WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, convert_l4a4_unorm}, + {WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2, + WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_LEGACY_CONTEXT, convert_l4a4_unorm}, + {WINED3DFMT_L16_UNORM, GL_R16, GL_R16, 0, + GL_RED, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_RG, NULL}, + {WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0, + GL_LUMINANCE, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_LEGACY_CONTEXT, NULL}, + /* Bump mapping stuff */ + {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0, + GL_BGR, GL_UNSIGNED_BYTE, 3, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, convert_r8g8_snorm}, + {WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0, + GL_DSDT_NV, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + NV_TEXTURE_SHADER, NULL}, + {WINED3DFMT_R8G8_SNORM, GL_RG8_SNORM, GL_RG8_SNORM, 0, + GL_RG, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_SNORM, NULL}, + {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0, + GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, convert_r5g5_snorm_l6_unorm}, + {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0, + GL_DSDT_MAG_NV, GL_BYTE, 3, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + NV_TEXTURE_SHADER, convert_r5g5_snorm_l6_unorm_nv}, + {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB8_SNORM, GL_RGB8_SNORM, 0, + GL_RGBA, GL_BYTE, 4, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + EXT_TEXTURE_SNORM, convert_r5g5_snorm_l6_unorm_ext}, + {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, convert_r8g8_snorm_l8x8_unorm}, + {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0, + GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, 4, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + NV_TEXTURE_SHADER, convert_r8g8_snorm_l8x8_unorm_nv}, + {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0, + GL_BGRA, GL_UNSIGNED_BYTE, 4, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, convert_r8g8b8a8_snorm}, + {WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0, + GL_RGBA, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + NV_TEXTURE_SHADER, NULL}, + {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA8_SNORM, 0, + GL_RGBA, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_SNORM, NULL}, + {WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0, + GL_BGR, GL_UNSIGNED_SHORT, 6, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + WINED3D_GL_EXT_NONE, convert_r16g16_snorm}, + {WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0, + GL_HILO_NV, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + NV_TEXTURE_SHADER, NULL}, + {WINED3DFMT_R16G16_SNORM, GL_RG16_SNORM, GL_RG16_SNORM, 0, + GL_RG, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_SNORM, NULL}, + {WINED3DFMT_R16G16B16A16_SNORM, GL_RGBA16_SNORM, GL_RGBA16_SNORM, 0, + GL_RGBA, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_SNORM, NULL}, + {WINED3DFMT_R16_SNORM, GL_R16_SNORM, GL_R16_SNORM, 0, + GL_RED, GL_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_SNORM, NULL}, + {WINED3DFMT_R8_SNORM, GL_R8_SNORM, GL_R8_SNORM, 0, + GL_RED, GL_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_SNORM, NULL}, + /* Depth stencil formats */ + {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_DEPTH_STENCIL, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_TEXTURE, NULL}, + {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_TEXTURE, NULL}, + {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + EXT_PACKED_DEPTH_STENCIL, NULL}, + {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4, + WINED3D_FORMAT_CAP_DEPTH_STENCIL, + WINED3D_GL_EXT_NONE, x8_d24_unorm_upload, x8_d24_unorm_download}, + {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_TEXTURE, x8_d24_unorm_upload, x8_d24_unorm_download}, + {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_DEPTH_STENCIL, + WINED3D_GL_EXT_NONE, NULL}, + {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_TEXTURE, NULL}, + {WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0, + GL_DEPTH_COMPONENT, GL_FLOAT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_BUFFER_FLOAT, NULL}, + {WINED3DFMT_D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_BUFFER_FLOAT, NULL}, + {WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + ARB_DEPTH_BUFFER_FLOAT, convert_s8_uint_d24_float}, + {WINED3DFMT_R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA32UI, 0, + GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_INTEGER, NULL}, + {WINED3DFMT_R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA32I, 0, + GL_RGBA_INTEGER, GL_INT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + EXT_TEXTURE_INTEGER, NULL}, + /* Vendor-specific formats */ + {WINED3DFMT_ATI1N, GL_COMPRESSED_RED_RGTC1, GL_COMPRESSED_RED_RGTC1, 0, + GL_RED, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ATI_TEXTURE_COMPRESSION_3DC, NULL}, + {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + EXT_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, + GL_RG, GL_UNSIGNED_BYTE, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, + {WINED3DFMT_INTZ, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL, + EXT_PACKED_DEPTH_STENCIL, NULL}, + {WINED3DFMT_NULL, 0, 0, 0, + GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_FBO_ATTACHABLE, + ARB_FRAMEBUFFER_OBJECT, NULL}, + /* DirectX 10 HDR formats */ + {WINED3DFMT_R9G9B9E5_SHAREDEXP, GL_RGB9_E5_EXT, GL_RGB9_E5_EXT, 0, + GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV_EXT, 0, + WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + EXT_TEXTURE_SHARED_EXPONENT, NULL}, +}; + +static void query_format_cap(struct wined3d_gl_info *gl_info, struct wined3d_format_gl *format, + GLint internal, GLenum pname, unsigned int cap, const char *string) +{ + GLint value; + + for (enum wined3d_gl_resource_type type = 0; type < ARRAY_SIZE(format->f.caps); ++type) + { + gl_info->gl_ops.ext.p_glGetInternalformativ(wined3d_gl_type_to_enum(type), internal, pname, 1, &value); + if (value == GL_FULL_SUPPORT) + { + TRACE("Format %s supports %s, resource type %u.\n", debug_d3dformat(format->f.id), string, type); + format->f.caps[type] |= cap; + } + else + { + TRACE("Format %s doesn't support %s, resource type %u.\n", debug_d3dformat(format->f.id), string, type); + format->f.caps[type] &= ~cap; + } + } +} + +static GLenum lookup_gl_view_class(GLenum internal_format) +{ + static const struct + { + GLenum internal_format; + GLenum view_class; + } + view_classes[] = + { + /* 128-bit */ + {GL_RGBA32F, GL_VIEW_CLASS_128_BITS}, + {GL_RGBA32UI, GL_VIEW_CLASS_128_BITS}, + {GL_RGBA32I, GL_VIEW_CLASS_128_BITS}, + /* 96-bit */ + {GL_RGB32F, GL_VIEW_CLASS_96_BITS}, + {GL_RGB32UI, GL_VIEW_CLASS_96_BITS}, + {GL_RGB32I, GL_VIEW_CLASS_96_BITS}, + /* 64-bit */ + {GL_RGBA16F, GL_VIEW_CLASS_64_BITS}, + {GL_RG32F, GL_VIEW_CLASS_64_BITS}, + {GL_RGBA16UI, GL_VIEW_CLASS_64_BITS}, + {GL_RG32UI, GL_VIEW_CLASS_64_BITS}, + {GL_RGBA16I, GL_VIEW_CLASS_64_BITS}, + {GL_RG32I, GL_VIEW_CLASS_64_BITS}, + {GL_RGBA16, GL_VIEW_CLASS_64_BITS}, + {GL_RGBA16_SNORM, GL_VIEW_CLASS_64_BITS}, + /* 48-bit */ + {GL_RGB16, GL_VIEW_CLASS_48_BITS}, + {GL_RGB16_SNORM, GL_VIEW_CLASS_48_BITS}, + {GL_RGB16F, GL_VIEW_CLASS_48_BITS}, + {GL_RGB16UI, GL_VIEW_CLASS_48_BITS}, + {GL_RGB16I, GL_VIEW_CLASS_48_BITS}, + /* 32-bit */ + {GL_RG16F, GL_VIEW_CLASS_32_BITS}, + {GL_R11F_G11F_B10F, GL_VIEW_CLASS_32_BITS}, + {GL_R32F, GL_VIEW_CLASS_32_BITS}, + {GL_RGB10_A2UI, GL_VIEW_CLASS_32_BITS}, + {GL_RGBA8UI, GL_VIEW_CLASS_32_BITS}, + {GL_RG16UI, GL_VIEW_CLASS_32_BITS}, + {GL_R32UI, GL_VIEW_CLASS_32_BITS}, + {GL_RGBA8I, GL_VIEW_CLASS_32_BITS}, + {GL_RG16I, GL_VIEW_CLASS_32_BITS}, + {GL_R32I, GL_VIEW_CLASS_32_BITS}, + {GL_RGB10_A2, GL_VIEW_CLASS_32_BITS}, + {GL_RGBA8, GL_VIEW_CLASS_32_BITS}, + {GL_RG16, GL_VIEW_CLASS_32_BITS}, + {GL_RGBA8_SNORM, GL_VIEW_CLASS_32_BITS}, + {GL_RG16_SNORM, GL_VIEW_CLASS_32_BITS}, + {GL_SRGB8_ALPHA8, GL_VIEW_CLASS_32_BITS}, + {GL_RGB9_E5, GL_VIEW_CLASS_32_BITS}, + /* 24-bit */ + {GL_RGB8, GL_VIEW_CLASS_24_BITS}, + {GL_RGB8_SNORM, GL_VIEW_CLASS_24_BITS}, + {GL_SRGB8, GL_VIEW_CLASS_24_BITS}, + {GL_RGB8UI, GL_VIEW_CLASS_24_BITS}, + {GL_RGB8I, GL_VIEW_CLASS_24_BITS}, + /* 16-bit */ + {GL_R16F, GL_VIEW_CLASS_16_BITS}, + {GL_RG8UI, GL_VIEW_CLASS_16_BITS}, + {GL_R16UI, GL_VIEW_CLASS_16_BITS}, + {GL_RG8I, GL_VIEW_CLASS_16_BITS}, + {GL_R16I, GL_VIEW_CLASS_16_BITS}, + {GL_RG8, GL_VIEW_CLASS_16_BITS}, + {GL_R16, GL_VIEW_CLASS_16_BITS}, + {GL_RG8_SNORM, GL_VIEW_CLASS_16_BITS}, + {GL_R16_SNORM, GL_VIEW_CLASS_16_BITS}, + /* 8-bit */ + {GL_R8UI, GL_VIEW_CLASS_8_BITS}, + {GL_R8I, GL_VIEW_CLASS_8_BITS}, + {GL_R8, GL_VIEW_CLASS_8_BITS}, + {GL_R8_SNORM, GL_VIEW_CLASS_8_BITS}, + + /* RGTC1 */ + {GL_COMPRESSED_RED_RGTC1, GL_VIEW_CLASS_RGTC1_RED}, + {GL_COMPRESSED_SIGNED_RED_RGTC1, GL_VIEW_CLASS_RGTC1_RED}, + /* RGTC2 */ + {GL_COMPRESSED_RG_RGTC2, GL_VIEW_CLASS_RGTC2_RG}, + {GL_COMPRESSED_SIGNED_RG_RGTC2, GL_VIEW_CLASS_RGTC2_RG}, + + /* BPTC unorm */ + {GL_COMPRESSED_RGBA_BPTC_UNORM, GL_VIEW_CLASS_BPTC_UNORM}, + {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, GL_VIEW_CLASS_BPTC_UNORM}, + /* BPTC float */ + {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, GL_VIEW_CLASS_BPTC_FLOAT}, + {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, GL_VIEW_CLASS_BPTC_FLOAT}, + + /* DXT1 RGB */ + {GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGB}, + {GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGB}, + /* DXT1 RGBA */ + {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGBA}, + {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGBA}, + /* DXT3 */ + {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_VIEW_CLASS_S3TC_DXT3_RGBA}, + {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_VIEW_CLASS_S3TC_DXT3_RGBA}, + /* DXT5 */ + {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_VIEW_CLASS_S3TC_DXT5_RGBA}, + {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_VIEW_CLASS_S3TC_DXT5_RGBA}, + }; + + for (unsigned int i = 0; i < ARRAY_SIZE(view_classes); ++i) + { + if (view_classes[i].internal_format == internal_format) + return view_classes[i].view_class; + } + + return GL_NONE; +} + +static void query_view_class(struct wined3d_format_gl *format) +{ + GLenum internal_view_class, gamma_view_class, rt_view_class; + + internal_view_class = lookup_gl_view_class(format->internal); + gamma_view_class = lookup_gl_view_class(format->srgb_internal); + rt_view_class = lookup_gl_view_class(format->rt_internal); + + if (internal_view_class == gamma_view_class || gamma_view_class == rt_view_class) + { + format->view_class = internal_view_class; + TRACE("Format %s is member of GL view class %#x.\n", + debug_d3dformat(format->f.id), format->view_class); + } + else + { + format->view_class = GL_NONE; + } +} + +static void query_internal_format(struct wined3d_adapter *adapter, + struct wined3d_format_gl *format, const struct wined3d_format_texture_info *texture_info, + struct wined3d_gl_info *gl_info, bool srgb_write_supported, bool srgb_format) +{ + if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2]) + { + query_format_cap(gl_info, format, format->internal, GL_VERTEX_TEXTURE, + WINED3D_FORMAT_CAP_VTF, "vertex texture usage"); + query_format_cap(gl_info, format, format->internal, GL_FILTER, + WINED3D_FORMAT_CAP_FILTERING, "filtering"); + query_format_cap(gl_info, format, format->internal, GL_SHADER_IMAGE_STORE, + WINED3D_FORMAT_CAP_UNORDERED_ACCESS, "unordered access"); + + if (srgb_format || format->srgb_internal != format->internal) + { + query_format_cap(gl_info, format, format->srgb_internal, GL_SRGB_READ, + WINED3D_FORMAT_CAP_SRGB_READ, "sRGB read"); + + if (srgb_write_supported) + query_format_cap(gl_info, format, format->srgb_internal, GL_SRGB_WRITE, + WINED3D_FORMAT_CAP_SRGB_WRITE, "sRGB write"); + else + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_WRITE); + + if (!(format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] + & (WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE))) + format->srgb_internal = format->internal; + else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) + format->internal = format->srgb_internal; + } + } + else + { + if (!gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]) + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_VTF); + + if (!(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING)) + format_set_caps(&format->f, WINED3D_FORMAT_CAP_FILTERING); + else if (format->f.id != WINED3DFMT_R32G32B32A32_FLOAT && format->f.id != WINED3DFMT_R32_FLOAT) + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_VTF); + + if (srgb_format || format->srgb_internal != format->internal) + { + /* Filter sRGB capabilities if EXT_texture_sRGB is not supported. */ + if (!gl_info->supported[EXT_TEXTURE_SRGB]) + { + format->srgb_internal = format->internal; + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE); + } + else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) + { + format->internal = format->srgb_internal; + } + } + + if ((format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3D_FORMAT_CAP_SRGB_WRITE) && !srgb_write_supported) + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_WRITE); + } + + if ((!gl_info->supported[ARB_DEPTH_TEXTURE] || wined3d_settings.offscreen_rendering_mode != ORM_FBO) + && (format->f.depth_size || format->f.stencil_size)) + { + TRACE("Disabling texturing support for depth / stencil format %s.\n", debug_d3dformat(format->f.id)); + format->f.caps[WINED3D_GL_RES_TYPE_TEX_1D] &= ~WINED3D_FORMAT_CAP_TEXTURE; + format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] &= ~WINED3D_FORMAT_CAP_TEXTURE; + format->f.caps[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3D_FORMAT_CAP_TEXTURE; + format->f.caps[WINED3D_GL_RES_TYPE_TEX_CUBE] &= ~WINED3D_FORMAT_CAP_TEXTURE; + format->f.caps[WINED3D_GL_RES_TYPE_TEX_RECT] &= ~WINED3D_FORMAT_CAP_TEXTURE; + } + + query_view_class(format); + + if (format->internal && format->f.caps[WINED3D_GL_RES_TYPE_RB] + & (WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_DEPTH_STENCIL) + && (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] || gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE]) + && wined3d_settings.offscreen_rendering_mode == ORM_FBO) + { + if (gl_info->supported[ARB_INTERNALFORMAT_QUERY]) + { + GLenum target = gl_info->supported[ARB_TEXTURE_MULTISAMPLE] ? GL_TEXTURE_2D_MULTISAMPLE : GL_RENDERBUFFER; + GLint count = 0, multisample_types[8]; + + GL_EXTCALL(glGetInternalformativ(target, format->internal, GL_NUM_SAMPLE_COUNTS, 1, &count)); + if (count > ARRAY_SIZE(multisample_types)) + FIXME("Unexpectedly high number of multisample types %d.\n", count); + count = min(count, ARRAY_SIZE(multisample_types)); + GL_EXTCALL(glGetInternalformativ(target, format->internal, + GL_SAMPLES, count, multisample_types)); + checkGLcall("query sample counts"); + for (GLint i = 0; i < count; ++i) + { + if (multisample_types[i] > sizeof(format->f.multisample_types) * CHAR_BIT) + continue; + format->f.multisample_types |= 1u << (multisample_types[i] - 1); + } + } + else + { + unsigned int max_log2 = wined3d_log2i(min(gl_info->limits.samples, + sizeof(format->f.multisample_types) * CHAR_BIT)); + for (unsigned int i = 1; i <= max_log2; ++i) + format->f.multisample_types |= 1u << ((1u << i) - 1); + } + } +} + +bool adapter_gl_init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info) +{ + struct wined3d_format_gl *format, *srgb_format; + enum wined3d_format_id srgb_format_id; + struct fragment_caps fragment_caps; + struct shader_caps shader_caps; + bool srgb_write; + + adapter->fragment_pipe->get_caps(adapter, &fragment_caps); + adapter->shader_backend->shader_get_caps(adapter, &shader_caps); + srgb_write = fragment_caps.srgb_write && (shader_caps.wined3d_caps & WINED3D_SHADER_CAP_SRGB_WRITE); + + for (unsigned int i = 0; i < ARRAY_SIZE(format_texture_info); ++i) + { + const struct wined3d_format_texture_info *info = &format_texture_info[i]; + + if (!(format = get_format_gl_internal(adapter, info->id))) + return false; + + if (!gl_info->supported[info->extension]) + continue; + + /* ARB_texture_rg defines floating point formats, but only if + * ARB_texture_float is also supported. */ + if (!gl_info->supported[ARB_TEXTURE_FLOAT] + && (format->f.attrs & WINED3D_FORMAT_ATTR_FLOAT)) + continue; + + /* ARB_texture_rg defines integer formats if EXT_texture_integer is also supported. */ + if (!gl_info->supported[EXT_TEXTURE_INTEGER] + && (format->f.attrs & WINED3D_FORMAT_ATTR_INTEGER)) + continue; + + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO + && (format->f.id == WINED3DFMT_D16_LOCKABLE || format->f.id == WINED3DFMT_NULL)) + continue; + + format->internal = info->internal; + format->srgb_internal = info->srgb_internal; + 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; + + format->f.caps[WINED3D_GL_RES_TYPE_TEX_1D] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + format->f.caps[WINED3D_GL_RES_TYPE_BUFFER] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + + /* GL_ARB_depth_texture does not support 3D textures. It also says "cube textures are + * problematic", but doesn't explicitly mandate that an error is generated. */ + if (gl_info->supported[EXT_TEXTURE3D] && !(info->caps & WINED3D_FORMAT_CAP_DEPTH_STENCIL)) + format->f.caps[WINED3D_GL_RES_TYPE_TEX_3D] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + + if (gl_info->supported[ARB_TEXTURE_CUBE_MAP]) + format->f.caps[WINED3D_GL_RES_TYPE_TEX_CUBE] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + + if (gl_info->supported[ARB_TEXTURE_RECTANGLE]) + format->f.caps[WINED3D_GL_RES_TYPE_TEX_RECT] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + + format->f.caps[WINED3D_GL_RES_TYPE_RB] |= info->caps | WINED3D_FORMAT_CAP_BLIT; + format->f.caps[WINED3D_GL_RES_TYPE_RB] &= ~WINED3D_FORMAT_CAP_TEXTURE; + + if (format->srgb_internal != format->internal + && !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)) + { + format->srgb_internal = format->internal; + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE); + } + + if (!gl_info->supported[ARB_SHADOW] && (format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3D_FORMAT_CAP_SHADOW)) + format_clear_caps(&format->f, WINED3D_FORMAT_CAP_TEXTURE); + + query_internal_format(adapter, format, &format_texture_info[i], gl_info, srgb_write, false); + + /* Texture conversion stuff */ + format->f.conv_byte_count = info->conv_byte_count; + format->f.upload = info->upload; + format->f.download = info->download; + + srgb_format_id = wined3d_format_get_srgb_format(format->f.id); + if (srgb_format_id == WINED3DFMT_UNKNOWN) + continue; + if (!(srgb_format = get_format_gl_internal(adapter, srgb_format_id))) + return false; + + copy_format(adapter, &srgb_format->f, &format->f); + + if (gl_info->supported[EXT_TEXTURE_SRGB] + && !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)) + { + srgb_format->internal = info->srgb_internal; + srgb_format->srgb_internal = info->srgb_internal; + format_set_caps(&srgb_format->f, WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE); + query_internal_format(adapter, srgb_format, &format_texture_info[i], gl_info, srgb_write, true); + } + } + + return true; +} diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 07e2190db20..56763487495 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -749,427 +749,6 @@ static const struct wined3d_format_vertex_info format_vertex_info[] = {WINED3DFMT_R32G32B32A32_SINT, WINED3D_FFP_EMIT_INVALID, GL_INT}, };
-struct wined3d_format_texture_info -{ - enum wined3d_format_id id; - GLint gl_internal; - GLint gl_srgb_internal; - GLint gl_rt_internal; - GLint gl_format; - GLint gl_type; - unsigned int conv_byte_count; - unsigned int caps; - enum wined3d_gl_extension extension; - void (*upload)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); - void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); - void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); -}; - -static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not - * format+type combination to load it. Thus convert it to A8L8, then load it - * with A4L4 internal, but A8L8 format+type - */ - unsigned int x, y, z; - const unsigned char *Source; - unsigned char *Dest; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = src + z * src_slice_pitch + y * src_row_pitch; - Dest = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - unsigned char color = (*Source++); - /* A */ Dest[1] = (color & 0xf0u) << 0; - /* L */ Dest[0] = (color & 0x0fu) << 4; - Dest += 2; - } - } - } -} - -static void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - unsigned char r_in, g_in, l_in; - const unsigned short *texel_in; - unsigned short *texel_out; - - /* Emulating signed 5 bit values with unsigned 5 bit values has some precision problems by design: - * E.g. the signed input value 0 becomes 16. GL normalizes it to 16 / 31 = 0.516. We convert it - * back to a signed value by subtracting 0.5 and multiplying by 2.0. The resulting value is - * ((16 / 31) - 0.5) * 2.0 = 0.032, which is quite different from the intended result 0.000. */ - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - texel_out = (unsigned short *) (dst + z * dst_slice_pitch + y * dst_row_pitch); - texel_in = (const unsigned short *)(src + z * src_slice_pitch + y * src_row_pitch); - for (x = 0; x < width; x++ ) - { - l_in = (*texel_in & 0xfc00u) >> 10; - g_in = (*texel_in & 0x03e0u) >> 5; - r_in = *texel_in & 0x001fu; - - *texel_out = ((r_in + 16) << 11) | (l_in << 5) | (g_in + 16); - texel_out++; - texel_in++; - } - } - } -} - -static void convert_r5g5_snorm_l6_unorm_ext(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - unsigned char *texel_out, r_out, g_out, r_in, g_in, l_in; - const unsigned short *texel_in; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - texel_in = (const unsigned short *)(src + z * src_slice_pitch + y * src_row_pitch); - texel_out = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - l_in = (*texel_in & 0xfc00u) >> 10; - g_in = (*texel_in & 0x03e0u) >> 5; - r_in = *texel_in & 0x001fu; - - r_out = r_in << 3; - if (!(r_in & 0x10)) /* r > 0 */ - r_out |= r_in >> 1; - - g_out = g_in << 3; - if (!(g_in & 0x10)) /* g > 0 */ - g_out |= g_in >> 1; - - texel_out[0] = r_out; - texel_out[1] = g_out; - texel_out[2] = l_in << 1 | l_in >> 5; - texel_out[3] = 0; - - texel_out += 4; - texel_in++; - } - } - } -} - -static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - unsigned char *texel_out, ds_out, dt_out, r_in, g_in, l_in; - const unsigned short *texel_in; - - /* This makes the gl surface bigger(24 bit instead of 16), but it works with - * fixed function and shaders without further conversion once the surface is - * loaded. - * - * The difference between this function and convert_r5g5_snorm_l6_unorm_ext - * is that convert_r5g5_snorm_l6_unorm_ext creates a 32 bit XRGB texture and - * this function creates a 24 bit DSDT_MAG texture. Trying to load a DSDT_MAG - * internal with a 32 bit DSDT_MAG_INTENSITY or DSDT_MAG_VIB format fails. */ - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - texel_in = (const unsigned short *)(src + z * src_slice_pitch + y * src_row_pitch); - texel_out = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - l_in = (*texel_in & 0xfc00u) >> 10; - g_in = (*texel_in & 0x03e0u) >> 5; - r_in = *texel_in & 0x001fu; - - ds_out = r_in << 3; - if (!(r_in & 0x10)) /* r > 0 */ - ds_out |= r_in >> 1; - - dt_out = g_in << 3; - if (!(g_in & 0x10)) /* g > 0 */ - dt_out |= g_in >> 1; - - texel_out[0] = ds_out; - texel_out[1] = dt_out; - texel_out[2] = l_in << 1 | l_in >> 5; - - texel_out += 3; - texel_in++; - } - } - } -} - -static void convert_r8g8_snorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const short *Source; - unsigned char *Dest; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const short *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - const short color = (*Source++); - /* B */ Dest[0] = 0xff; - /* G */ Dest[1] = (color >> 8) + 128; /* V */ - /* R */ Dest[2] = (color & 0xff) + 128; /* U */ - Dest += 3; - } - } - } -} - -static void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const DWORD *Source; - unsigned char *Dest; - - /* Doesn't work correctly with the fixed function pipeline, but can work in - * shaders if the shader is adjusted. (There's no use for this format in gl's - * standard fixed function pipeline anyway). - */ - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - LONG color = (*Source++); - /* B */ Dest[0] = ((color >> 16) & 0xff); /* L */ - /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */ - /* R */ Dest[2] = (color & 0xff) + 128; /* U */ - Dest += 4; - } - } - } -} - -static void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const DWORD *Source; - unsigned char *Dest; - - /* This implementation works with the fixed function pipeline and shaders - * without further modification after converting the surface. - */ - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - LONG color = (*Source++); - /* L */ Dest[2] = ((color >> 16) & 0xff); /* L */ - /* V */ Dest[1] = ((color >> 8 ) & 0xff); /* V */ - /* U */ Dest[0] = (color & 0xff); /* U */ - /* I */ Dest[3] = 255; /* X */ - Dest += 4; - } - } - } -} - -static void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const DWORD *Source; - unsigned char *Dest; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = dst + z * dst_slice_pitch + y * dst_row_pitch; - for (x = 0; x < width; x++ ) - { - LONG color = (*Source++); - /* B */ Dest[0] = ((color >> 16) & 0xff) + 128; /* W */ - /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */ - /* R */ Dest[2] = (color & 0xff) + 128; /* U */ - /* A */ Dest[3] = ((color >> 24) & 0xff) + 128; /* Q */ - Dest += 4; - } - } - } -} - -static void convert_r16g16_snorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const DWORD *Source; - unsigned short *Dest; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = (unsigned short *) (dst + z * dst_slice_pitch + y * dst_row_pitch); - for (x = 0; x < width; x++ ) - { - const DWORD color = (*Source++); - /* B */ Dest[0] = 0xffff; - /* G */ Dest[1] = (color >> 16) + 32768; /* V */ - /* R */ Dest[2] = (color & 0xffff) + 32768; /* U */ - Dest += 3; - } - } - } -} - -static void convert_r16g16(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const WORD *Source; - WORD *Dest; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const WORD *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = (WORD *) (dst + z * dst_slice_pitch + y * dst_row_pitch); - for (x = 0; x < width; x++ ) - { - WORD green = (*Source++); - WORD red = (*Source++); - Dest[0] = green; - Dest[1] = red; - /* Strictly speaking not correct for R16G16F, but it doesn't matter because the - * shader overwrites it anyway */ - Dest[2] = 0xffff; - Dest += 3; - } - } - } -} - -static void convert_r32g32_float(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - const float *Source; - float *Dest; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y++) - { - Source = (const float *)(src + z * src_slice_pitch + y * src_row_pitch); - Dest = (float *) (dst + z * dst_slice_pitch + y * dst_row_pitch); - for (x = 0; x < width; x++ ) - { - float green = (*Source++); - float red = (*Source++); - Dest[0] = green; - Dest[1] = red; - Dest[2] = 1.0f; - Dest += 3; - } - } - } -} - -static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch, - UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth) -{ - unsigned int x, y, z; - - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; ++y) - { - const DWORD *source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - float *dest_f = (float *)(dst + z * dst_slice_pitch + y * dst_row_pitch); - DWORD *dest_s = (DWORD *)dest_f; - - for (x = 0; x < width; ++x) - { - dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00u) >> 8); - dest_s[x * 2 + 1] = source[x] & 0xff; - } - } - } -} - -static void x8_d24_unorm_upload(const BYTE *src, BYTE *dst, - unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth) -{ - unsigned int x, y, z; - - for (z = 0; z < depth; ++z) - { - for (y = 0; y < height; ++y) - { - const DWORD *source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - DWORD *dest = (DWORD *)(dst + z * dst_slice_pitch + y * dst_row_pitch); - - for (x = 0; x < width; ++x) - { - dest[x] = source[x] << 8 | ((source[x] >> 16) & 0xff); - } - } - } -} - -static void x8_d24_unorm_download(const BYTE *src, BYTE *dst, - unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth) -{ - unsigned int x, y, z; - - for (z = 0; z < depth; ++z) - { - for (y = 0; y < height; ++y) - { - const DWORD *source = (const DWORD *)(src + z * src_slice_pitch + y * src_row_pitch); - DWORD *dest = (DWORD *)(dst + z * dst_slice_pitch + y * dst_row_pitch); - - for (x = 0; x < width; ++x) - { - dest[x] = source[x] >> 8; - } - } - } -} - static BOOL color_in_range(const struct wined3d_color_key *color_key, DWORD color) { /* FIXME: Is this really how color keys are supposed to work? I think it @@ -1324,594 +903,6 @@ const struct wined3d_color_key_conversion * wined3d_format_get_color_key_convers return NULL; }
-/* We intentionally don't support WINED3DFMT_D32_UNORM. No hardware driver - * supports it, and applications get confused when we do. - * - * The following formats explicitly don't have WINED3D_FORMAT_CAP_TEXTURE set: - * - * These are never supported on native. - * WINED3DFMT_B8G8R8_UNORM - * WINED3DFMT_B2G3R3_UNORM - * WINED3DFMT_L4A4_UNORM - * WINED3DFMT_S1_UINT_D15_UNORM - * WINED3DFMT_S4X4_UINT_D24_UNORM - * - * Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of ddraw. - * Since it is not widely available, don't offer it. Further no Windows driver - * offers WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either. - * WINED3DFMT_P8_UINT - * WINED3DFMT_P8_UINT_A8_UNORM - * - * These formats seem to be similar to the HILO formats in - * GL_NV_texture_shader. NVHU is said to be GL_UNSIGNED_HILO16, - * NVHS GL_SIGNED_HILO16. Rumours say that D3D computes a 3rd channel - * similarly to D3DFMT_CxV8U8 (So NVHS could be called D3DFMT_CxV16U16). ATI - * refused to support formats which can easily be emulated with pixel shaders, - * so applications have to deal with not having NVHS and NVHU. - * WINED3DFMT_NVHU - * WINED3DFMT_NVHS */ -static const struct wined3d_format_texture_info format_texture_info[] = -{ - /* format id gl_internal gl_srgb_internal gl_rt_internal - gl_format gl_type conv_byte_count - caps - extension upload download */ - /* FourCC formats */ - /* GL_APPLE_ycbcr_422 claims that its '2YUV' format, which is supported via the UNSIGNED_SHORT_8_8_REV_APPLE type - * is equivalent to 'UYVY' format on Windows, and the 'YUVS' via UNSIGNED_SHORT_8_8_APPLE equates to 'YUY2'. The - * d3d9 test however shows that the opposite is true. Since the extension is from 2002, it predates the x86 based - * Macs, so probably the endianness differs. This could be tested as soon as we have a Windows and MacOS on a big - * endian machine - */ - {WINED3DFMT_UYVY, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_UYVY, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE8_ALPHA8, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_UYVY, GL_RGB_RAW_422_APPLE, GL_RGB_RAW_422_APPLE, 0, - GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0, - WINED3D_FORMAT_CAP_FILTERING, - APPLE_RGB_422, NULL}, - {WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0, - GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, - APPLE_YCBCR_422, NULL}, - {WINED3DFMT_YUY2, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_YUY2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE8_ALPHA8, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_YUY2, GL_RGB_RAW_422_APPLE, GL_RGB_RAW_422_APPLE, 0, - GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0, - WINED3D_FORMAT_CAP_FILTERING, - APPLE_RGB_422, NULL}, - {WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0, - GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, - APPLE_YCBCR_422, NULL}, - {WINED3DFMT_YV12, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_YV12, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_NV12, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_NV12, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC1_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC2_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC3_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC4_UNORM, GL_COMPRESSED_RED_RGTC1, GL_COMPRESSED_RED_RGTC1, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC4_SNORM, GL_COMPRESSED_SIGNED_RED_RGTC1, GL_COMPRESSED_SIGNED_RED_RGTC1, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC5_UNORM, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC5_SNORM, GL_COMPRESSED_SIGNED_RG_RGTC2, GL_COMPRESSED_SIGNED_RG_RGTC2, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC6H_UF16, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, 0, - GL_RGB, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_BPTC, NULL}, - {WINED3DFMT_BC6H_SF16, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, 0, - GL_RGB, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_BPTC, NULL}, - {WINED3DFMT_BC7_UNORM, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_BPTC, NULL}, - /* IEEE formats */ - {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, - GL_RED, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0, - GL_RED, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, - GL_RGB, GL_FLOAT, 12, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, convert_r32g32_float}, - {WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0, - GL_RG, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32G32B32_FLOAT, GL_RGB32F, GL_RGB32F, 0, - GL_RGB, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0, - GL_RGBA, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - /* Float */ - {WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, - GL_RED, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0, - GL_RED, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, - GL_RGB, GL_HALF_FLOAT_ARB, 6, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, convert_r16g16}, - {WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0, - GL_RG, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0, - GL_RGBA, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_RENDERTARGET - | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, 0, - GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_PACKED_FLOAT}, - /* Palettized formats */ - {WINED3DFMT_P8_UINT, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - 0, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_P8_UINT, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - 0, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - /* Standard ARGB formats */ - {WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0, - GL_BGR, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE - | WINED3D_FORMAT_CAP_VTF, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_SRGB8_EXT, GL_RGB8, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B5G6R5_UNORM, GL_RGB565, GL_SRGB8_EXT, GL_RGB8, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, - ARB_ES2_COMPATIBILITY, NULL}, - {WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5, 0, - GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0, - GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0, - GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0, - GL_RGB, GL_UNSIGNED_BYTE_3_3_2, 0, - WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8_UNORM, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_A8_UNORM, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0, - GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGB10_A2UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RGB10_A2UI, NULL}, - {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, - GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE - | WINED3D_FORMAT_CAP_VTF, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RGB10_A2UI, NULL}, - {WINED3DFMT_R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA8I, 0, - GL_RGBA_INTEGER, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16, - GL_RGB, GL_UNSIGNED_SHORT, 6, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r16g16}, - {WINED3DFMT_R16G16_UNORM, GL_RG16, GL_RG16, 0, - GL_RG, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, - GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0, - GL_RGBA, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8G8_UNORM, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8G8_UINT, GL_RG8UI, GL_RG8UI, 0, - GL_RG_INTEGER, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8G8_SINT, GL_RG8I, GL_RG8I, 0, - GL_RG_INTEGER, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA16UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA16I, 0, - GL_RGBA_INTEGER, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R32G32_UINT, GL_RG32UI, GL_RG32UI, 0, - GL_RG_INTEGER, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32G32_SINT, GL_RG32I, GL_RG32I, 0, - GL_RG_INTEGER, GL_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16_UINT, GL_RG16UI, GL_RG16UI, 0, - GL_RG_INTEGER, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16_SINT, GL_RG16I, GL_RG16I, 0, - GL_RG_INTEGER, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32_UINT, GL_R32UI, GL_R32UI, 0, - GL_RED_INTEGER, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32_SINT, GL_R32I, GL_R32I, 0, - GL_RED_INTEGER, GL_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16_UNORM, GL_R16, GL_R16, 0, - GL_RED, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16_UINT, GL_R16UI, GL_R16UI, 0, - GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16_SINT, GL_R16I, GL_R16I, 0, - GL_RED_INTEGER, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8_UINT, GL_R8UI, GL_R8UI, 0, - GL_RED_INTEGER, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8_SINT, GL_R8I, GL_R8I, 0, - GL_RED_INTEGER, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - /* Luminance */ - {WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_L8_UNORM, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_L8A8_UNORM, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_L4A4_UNORM, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 2, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, convert_l4a4_unorm}, - {WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, convert_l4a4_unorm}, - {WINED3DFMT_L16_UNORM, GL_R16, GL_R16, 0, - GL_RED, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0, - GL_LUMINANCE, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - /* Bump mapping stuff */ - {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0, - GL_BGR, GL_UNSIGNED_BYTE, 3, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r8g8_snorm}, - {WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0, - GL_DSDT_NV, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, NULL}, - {WINED3DFMT_R8G8_SNORM, GL_RG8_SNORM, GL_RG8_SNORM, 0, - GL_RG, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r5g5_snorm_l6_unorm}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0, - GL_DSDT_MAG_NV, GL_BYTE, 3, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, convert_r5g5_snorm_l6_unorm_nv}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB8_SNORM, GL_RGB8_SNORM, 0, - GL_RGBA, GL_BYTE, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_SNORM, convert_r5g5_snorm_l6_unorm_ext}, - {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r8g8_snorm_l8x8_unorm}, - {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0, - GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, convert_r8g8_snorm_l8x8_unorm_nv}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0, - GL_BGRA, GL_UNSIGNED_BYTE, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r8g8b8a8_snorm}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0, - GL_RGBA, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, NULL}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA8_SNORM, 0, - GL_RGBA, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0, - GL_BGR, GL_UNSIGNED_SHORT, 6, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r16g16_snorm}, - {WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0, - GL_HILO_NV, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, NULL}, - {WINED3DFMT_R16G16_SNORM, GL_RG16_SNORM, GL_RG16_SNORM, 0, - GL_RG, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R16G16B16A16_SNORM, GL_RGBA16_SNORM, GL_RGBA16_SNORM, 0, - GL_RGBA, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R16_SNORM, GL_R16_SNORM, GL_R16_SNORM, 0, - GL_RED, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R8_SNORM, GL_R8_SNORM, GL_R8_SNORM, 0, - GL_RED, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - /* Depth stencil formats */ - {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_DEPTH_STENCIL, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, NULL}, - {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, NULL}, - {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - EXT_PACKED_DEPTH_STENCIL, NULL}, - {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4, - WINED3D_FORMAT_CAP_DEPTH_STENCIL, - WINED3D_GL_EXT_NONE, x8_d24_unorm_upload, x8_d24_unorm_download}, - {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, x8_d24_unorm_upload, x8_d24_unorm_download}, - {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_DEPTH_STENCIL, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, NULL}, - {WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0, - GL_DEPTH_COMPONENT, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_BUFFER_FLOAT, NULL}, - {WINED3DFMT_D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_BUFFER_FLOAT, NULL}, - {WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_BUFFER_FLOAT, convert_s8_uint_d24_float}, - {WINED3DFMT_R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA32UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA32I, 0, - GL_RGBA_INTEGER, GL_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - /* Vendor-specific formats */ - {WINED3DFMT_ATI1N, GL_COMPRESSED_RED_RGTC1, GL_COMPRESSED_RED_RGTC1, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ATI_TEXTURE_COMPRESSION_3DC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_INTZ, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL, - EXT_PACKED_DEPTH_STENCIL, NULL}, - {WINED3DFMT_NULL, 0, 0, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_FBO_ATTACHABLE, - ARB_FRAMEBUFFER_OBJECT, NULL}, - /* DirectX 10 HDR formats */ - {WINED3DFMT_R9G9B9E5_SHAREDEXP, GL_RGB9_E5_EXT, GL_RGB9_E5_EXT, 0, - GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV_EXT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_SHARED_EXPONENT, NULL}, -}; - struct wined3d_format_srgb_info { enum wined3d_format_id srgb_format_id; @@ -1929,7 +920,7 @@ static const struct wined3d_format_srgb_info format_srgb_info[] = {WINED3DFMT_BC7_UNORM_SRGB, WINED3DFMT_BC7_UNORM}, };
-static enum wined3d_format_id wined3d_format_get_srgb_format(enum wined3d_format_id id) +enum wined3d_format_id wined3d_format_get_srgb_format(enum wined3d_format_id id) { for (unsigned int i = 0; i < ARRAY_SIZE(format_srgb_info); ++i) { @@ -1990,7 +981,7 @@ static struct wined3d_format *get_format_internal(const struct wined3d_adapter * return get_format_by_idx(adapter, fmt_idx); }
-static struct wined3d_format_gl *get_format_gl_internal(const struct wined3d_adapter *adapter, +struct wined3d_format_gl *get_format_gl_internal(const struct wined3d_adapter *adapter, enum wined3d_format_id format_id) { struct wined3d_format *format; @@ -2234,7 +1225,7 @@ static BOOL init_srgb_formats(struct wined3d_adapter *adapter) return TRUE; }
-static GLenum wined3d_gl_type_to_enum(enum wined3d_gl_resource_type type) +GLenum wined3d_gl_type_to_enum(enum wined3d_gl_resource_type type) { switch (type) { @@ -2778,28 +1769,6 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for } }
-static void query_format_cap(struct wined3d_gl_info *gl_info, struct wined3d_format_gl *format, - GLint internal, GLenum pname, unsigned int cap, const char *string) -{ - GLint value; - enum wined3d_gl_resource_type type; - - for (type = 0; type < ARRAY_SIZE(format->f.caps); ++type) - { - gl_info->gl_ops.ext.p_glGetInternalformativ(wined3d_gl_type_to_enum(type), internal, pname, 1, &value); - if (value == GL_FULL_SUPPORT) - { - TRACE("Format %s supports %s, resource type %u.\n", debug_d3dformat(format->f.id), string, type); - format->f.caps[type] |= cap; - } - else - { - TRACE("Format %s doesn't support %s, resource type %u.\n", debug_d3dformat(format->f.id), string, type); - format->f.caps[type] &= ~cap; - } - } -} - /* Context activation is done by the caller. */ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx) @@ -2953,348 +1922,6 @@ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter, gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo); }
-static GLenum lookup_gl_view_class(GLenum internal_format) -{ - static const struct - { - GLenum internal_format; - GLenum view_class; - } - view_classes[] = - { - /* 128-bit */ - {GL_RGBA32F, GL_VIEW_CLASS_128_BITS}, - {GL_RGBA32UI, GL_VIEW_CLASS_128_BITS}, - {GL_RGBA32I, GL_VIEW_CLASS_128_BITS}, - /* 96-bit */ - {GL_RGB32F, GL_VIEW_CLASS_96_BITS}, - {GL_RGB32UI, GL_VIEW_CLASS_96_BITS}, - {GL_RGB32I, GL_VIEW_CLASS_96_BITS}, - /* 64-bit */ - {GL_RGBA16F, GL_VIEW_CLASS_64_BITS}, - {GL_RG32F, GL_VIEW_CLASS_64_BITS}, - {GL_RGBA16UI, GL_VIEW_CLASS_64_BITS}, - {GL_RG32UI, GL_VIEW_CLASS_64_BITS}, - {GL_RGBA16I, GL_VIEW_CLASS_64_BITS}, - {GL_RG32I, GL_VIEW_CLASS_64_BITS}, - {GL_RGBA16, GL_VIEW_CLASS_64_BITS}, - {GL_RGBA16_SNORM, GL_VIEW_CLASS_64_BITS}, - /* 48-bit */ - {GL_RGB16, GL_VIEW_CLASS_48_BITS}, - {GL_RGB16_SNORM, GL_VIEW_CLASS_48_BITS}, - {GL_RGB16F, GL_VIEW_CLASS_48_BITS}, - {GL_RGB16UI, GL_VIEW_CLASS_48_BITS}, - {GL_RGB16I, GL_VIEW_CLASS_48_BITS}, - /* 32-bit */ - {GL_RG16F, GL_VIEW_CLASS_32_BITS}, - {GL_R11F_G11F_B10F, GL_VIEW_CLASS_32_BITS}, - {GL_R32F, GL_VIEW_CLASS_32_BITS}, - {GL_RGB10_A2UI, GL_VIEW_CLASS_32_BITS}, - {GL_RGBA8UI, GL_VIEW_CLASS_32_BITS}, - {GL_RG16UI, GL_VIEW_CLASS_32_BITS}, - {GL_R32UI, GL_VIEW_CLASS_32_BITS}, - {GL_RGBA8I, GL_VIEW_CLASS_32_BITS}, - {GL_RG16I, GL_VIEW_CLASS_32_BITS}, - {GL_R32I, GL_VIEW_CLASS_32_BITS}, - {GL_RGB10_A2, GL_VIEW_CLASS_32_BITS}, - {GL_RGBA8, GL_VIEW_CLASS_32_BITS}, - {GL_RG16, GL_VIEW_CLASS_32_BITS}, - {GL_RGBA8_SNORM, GL_VIEW_CLASS_32_BITS}, - {GL_RG16_SNORM, GL_VIEW_CLASS_32_BITS}, - {GL_SRGB8_ALPHA8, GL_VIEW_CLASS_32_BITS}, - {GL_RGB9_E5, GL_VIEW_CLASS_32_BITS}, - /* 24-bit */ - {GL_RGB8, GL_VIEW_CLASS_24_BITS}, - {GL_RGB8_SNORM, GL_VIEW_CLASS_24_BITS}, - {GL_SRGB8, GL_VIEW_CLASS_24_BITS}, - {GL_RGB8UI, GL_VIEW_CLASS_24_BITS}, - {GL_RGB8I, GL_VIEW_CLASS_24_BITS}, - /* 16-bit */ - {GL_R16F, GL_VIEW_CLASS_16_BITS}, - {GL_RG8UI, GL_VIEW_CLASS_16_BITS}, - {GL_R16UI, GL_VIEW_CLASS_16_BITS}, - {GL_RG8I, GL_VIEW_CLASS_16_BITS}, - {GL_R16I, GL_VIEW_CLASS_16_BITS}, - {GL_RG8, GL_VIEW_CLASS_16_BITS}, - {GL_R16, GL_VIEW_CLASS_16_BITS}, - {GL_RG8_SNORM, GL_VIEW_CLASS_16_BITS}, - {GL_R16_SNORM, GL_VIEW_CLASS_16_BITS}, - /* 8-bit */ - {GL_R8UI, GL_VIEW_CLASS_8_BITS}, - {GL_R8I, GL_VIEW_CLASS_8_BITS}, - {GL_R8, GL_VIEW_CLASS_8_BITS}, - {GL_R8_SNORM, GL_VIEW_CLASS_8_BITS}, - - /* RGTC1 */ - {GL_COMPRESSED_RED_RGTC1, GL_VIEW_CLASS_RGTC1_RED}, - {GL_COMPRESSED_SIGNED_RED_RGTC1, GL_VIEW_CLASS_RGTC1_RED}, - /* RGTC2 */ - {GL_COMPRESSED_RG_RGTC2, GL_VIEW_CLASS_RGTC2_RG}, - {GL_COMPRESSED_SIGNED_RG_RGTC2, GL_VIEW_CLASS_RGTC2_RG}, - - /* BPTC unorm */ - {GL_COMPRESSED_RGBA_BPTC_UNORM, GL_VIEW_CLASS_BPTC_UNORM}, - {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, GL_VIEW_CLASS_BPTC_UNORM}, - /* BPTC float */ - {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, GL_VIEW_CLASS_BPTC_FLOAT}, - {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, GL_VIEW_CLASS_BPTC_FLOAT}, - - /* DXT1 RGB */ - {GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGB}, - {GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGB}, - /* DXT1 RGBA */ - {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGBA}, - {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_VIEW_CLASS_S3TC_DXT1_RGBA}, - /* DXT3 */ - {GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_VIEW_CLASS_S3TC_DXT3_RGBA}, - {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_VIEW_CLASS_S3TC_DXT3_RGBA}, - /* DXT5 */ - {GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_VIEW_CLASS_S3TC_DXT5_RGBA}, - {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_VIEW_CLASS_S3TC_DXT5_RGBA}, - }; - - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(view_classes); ++i) - { - if (view_classes[i].internal_format == internal_format) - return view_classes[i].view_class; - } - - return GL_NONE; -} - -static void query_view_class(struct wined3d_format_gl *format) -{ - GLenum internal_view_class, gamma_view_class, rt_view_class; - - internal_view_class = lookup_gl_view_class(format->internal); - gamma_view_class = lookup_gl_view_class(format->srgb_internal); - rt_view_class = lookup_gl_view_class(format->rt_internal); - - if (internal_view_class == gamma_view_class || gamma_view_class == rt_view_class) - { - format->view_class = internal_view_class; - TRACE("Format %s is member of GL view class %#x.\n", - debug_d3dformat(format->f.id), format->view_class); - } - else - { - format->view_class = GL_NONE; - } -} - -static void query_internal_format(struct wined3d_adapter *adapter, - struct wined3d_format_gl *format, const struct wined3d_format_texture_info *texture_info, - struct wined3d_gl_info *gl_info, BOOL srgb_write_supported, BOOL srgb_format) -{ - GLint count, multisample_types[8]; - unsigned int i, max_log2; - GLenum target; - - if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2]) - { - query_format_cap(gl_info, format, format->internal, GL_VERTEX_TEXTURE, - WINED3D_FORMAT_CAP_VTF, "vertex texture usage"); - query_format_cap(gl_info, format, format->internal, GL_FILTER, - WINED3D_FORMAT_CAP_FILTERING, "filtering"); - query_format_cap(gl_info, format, format->internal, GL_SHADER_IMAGE_STORE, - WINED3D_FORMAT_CAP_UNORDERED_ACCESS, "unordered access"); - - if (srgb_format || format->srgb_internal != format->internal) - { - query_format_cap(gl_info, format, format->srgb_internal, GL_SRGB_READ, - WINED3D_FORMAT_CAP_SRGB_READ, "sRGB read"); - - if (srgb_write_supported) - query_format_cap(gl_info, format, format->srgb_internal, GL_SRGB_WRITE, - WINED3D_FORMAT_CAP_SRGB_WRITE, "sRGB write"); - else - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_WRITE); - - if (!(format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] - & (WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE))) - format->srgb_internal = format->internal; - else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) - format->internal = format->srgb_internal; - } - } - else - { - if (!gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]) - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_VTF); - - if (!(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING)) - format_set_caps(&format->f, WINED3D_FORMAT_CAP_FILTERING); - else if (format->f.id != WINED3DFMT_R32G32B32A32_FLOAT && format->f.id != WINED3DFMT_R32_FLOAT) - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_VTF); - - if (srgb_format || format->srgb_internal != format->internal) - { - /* Filter sRGB capabilities if EXT_texture_sRGB is not supported. */ - if (!gl_info->supported[EXT_TEXTURE_SRGB]) - { - format->srgb_internal = format->internal; - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE); - } - else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) - { - format->internal = format->srgb_internal; - } - } - - if ((format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3D_FORMAT_CAP_SRGB_WRITE) && !srgb_write_supported) - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_WRITE); - } - - if ((!gl_info->supported[ARB_DEPTH_TEXTURE] || wined3d_settings.offscreen_rendering_mode != ORM_FBO) - && (format->f.depth_size || format->f.stencil_size)) - { - TRACE("Disabling texturing support for depth / stencil format %s.\n", debug_d3dformat(format->f.id)); - format->f.caps[WINED3D_GL_RES_TYPE_TEX_1D] &= ~WINED3D_FORMAT_CAP_TEXTURE; - format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] &= ~WINED3D_FORMAT_CAP_TEXTURE; - format->f.caps[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3D_FORMAT_CAP_TEXTURE; - format->f.caps[WINED3D_GL_RES_TYPE_TEX_CUBE] &= ~WINED3D_FORMAT_CAP_TEXTURE; - format->f.caps[WINED3D_GL_RES_TYPE_TEX_RECT] &= ~WINED3D_FORMAT_CAP_TEXTURE; - } - - query_view_class(format); - - if (format->internal && format->f.caps[WINED3D_GL_RES_TYPE_RB] - & (WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_DEPTH_STENCIL) - && (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] || gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE]) - && wined3d_settings.offscreen_rendering_mode == ORM_FBO) - { - if (gl_info->supported[ARB_INTERNALFORMAT_QUERY]) - { - target = gl_info->supported[ARB_TEXTURE_MULTISAMPLE] ? GL_TEXTURE_2D_MULTISAMPLE : GL_RENDERBUFFER; - count = 0; - GL_EXTCALL(glGetInternalformativ(target, format->internal, - GL_NUM_SAMPLE_COUNTS, 1, &count)); - if (count > ARRAY_SIZE(multisample_types)) - FIXME("Unexpectedly high number of multisample types %d.\n", count); - count = min(count, ARRAY_SIZE(multisample_types)); - GL_EXTCALL(glGetInternalformativ(target, format->internal, - GL_SAMPLES, count, multisample_types)); - checkGLcall("query sample counts"); - for (i = 0; i < count; ++i) - { - if (multisample_types[i] > sizeof(format->f.multisample_types) * CHAR_BIT) - continue; - format->f.multisample_types |= 1u << (multisample_types[i] - 1); - } - } - else - { - max_log2 = wined3d_log2i(min(gl_info->limits.samples, - sizeof(format->f.multisample_types) * CHAR_BIT)); - for (i = 1; i <= max_log2; ++i) - format->f.multisample_types |= 1u << ((1u << i) - 1); - } - } -} - -static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info) -{ - struct wined3d_format_gl *format, *srgb_format; - enum wined3d_format_id srgb_format_id; - struct fragment_caps fragment_caps; - struct shader_caps shader_caps; - unsigned int i, j; - BOOL srgb_write; - - adapter->fragment_pipe->get_caps(adapter, &fragment_caps); - adapter->shader_backend->shader_get_caps(adapter, &shader_caps); - srgb_write = fragment_caps.srgb_write && (shader_caps.wined3d_caps & WINED3D_SHADER_CAP_SRGB_WRITE); - - for (i = 0; i < ARRAY_SIZE(format_texture_info); ++i) - { - if (!(format = get_format_gl_internal(adapter, format_texture_info[i].id))) - return FALSE; - - if (!gl_info->supported[format_texture_info[i].extension]) - continue; - - /* ARB_texture_rg defines floating point formats, but only if - * ARB_texture_float is also supported. */ - if (!gl_info->supported[ARB_TEXTURE_FLOAT] - && (format->f.attrs & WINED3D_FORMAT_ATTR_FLOAT)) - continue; - - /* ARB_texture_rg defines integer formats if EXT_texture_integer is also supported. */ - if (!gl_info->supported[EXT_TEXTURE_INTEGER] - && (format->f.attrs & WINED3D_FORMAT_ATTR_INTEGER)) - continue; - - if (wined3d_settings.offscreen_rendering_mode != ORM_FBO - && (format->f.id == WINED3DFMT_D16_LOCKABLE || format->f.id == WINED3DFMT_NULL)) - continue; - - format->internal = format_texture_info[i].gl_internal; - format->srgb_internal = format_texture_info[i].gl_srgb_internal; - format->rt_internal = format_texture_info[i].gl_rt_internal; - format->format = format_texture_info[i].gl_format; - format->type = format_texture_info[i].gl_type; - format->f.color_fixup = COLOR_FIXUP_IDENTITY; - format->f.height_scale.numerator = 1; - format->f.height_scale.denominator = 1; - - format->f.caps[WINED3D_GL_RES_TYPE_TEX_1D] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - format->f.caps[WINED3D_GL_RES_TYPE_BUFFER] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - - /* GL_ARB_depth_texture does not support 3D textures. It also says "cube textures are - * problematic", but doesn't explicitly mandate that an error is generated. */ - if (gl_info->supported[EXT_TEXTURE3D] && !(format_texture_info[i].caps & WINED3D_FORMAT_CAP_DEPTH_STENCIL)) - format->f.caps[WINED3D_GL_RES_TYPE_TEX_3D] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - - if (gl_info->supported[ARB_TEXTURE_CUBE_MAP]) - format->f.caps[WINED3D_GL_RES_TYPE_TEX_CUBE] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - - if (gl_info->supported[ARB_TEXTURE_RECTANGLE]) - format->f.caps[WINED3D_GL_RES_TYPE_TEX_RECT] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - - format->f.caps[WINED3D_GL_RES_TYPE_RB] |= format_texture_info[i].caps | WINED3D_FORMAT_CAP_BLIT; - format->f.caps[WINED3D_GL_RES_TYPE_RB] &= ~WINED3D_FORMAT_CAP_TEXTURE; - - if (format->srgb_internal != format->internal - && !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)) - { - format->srgb_internal = format->internal; - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE); - } - - if (!gl_info->supported[ARB_SHADOW] && (format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3D_FORMAT_CAP_SHADOW)) - format_clear_caps(&format->f, WINED3D_FORMAT_CAP_TEXTURE); - - query_internal_format(adapter, format, &format_texture_info[i], gl_info, srgb_write, FALSE); - - /* Texture conversion stuff */ - format->f.conv_byte_count = format_texture_info[i].conv_byte_count; - format->f.upload = format_texture_info[i].upload; - format->f.download = format_texture_info[i].download; - - srgb_format_id = wined3d_format_get_srgb_format(format->f.id); - if (srgb_format_id == WINED3DFMT_UNKNOWN) - continue; - if (!(srgb_format = get_format_gl_internal(adapter, srgb_format_id))) - return FALSE; - - copy_format(adapter, &srgb_format->f, &format->f); - - if (gl_info->supported[EXT_TEXTURE_SRGB] - && !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)) - { - srgb_format->internal = format_texture_info[i].gl_srgb_internal; - srgb_format->srgb_internal = format_texture_info[i].gl_srgb_internal; - format_set_caps(&srgb_format->f, WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE); - query_internal_format(adapter, srgb_format, &format_texture_info[i], gl_info, srgb_write, TRUE); - } - } - - return TRUE; -} - static BOOL compare_uint(unsigned int x, unsigned int y, unsigned int max_diff) { unsigned int diff = x > y ? x - y : y - x; @@ -4228,7 +2855,7 @@ BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct if (!wined3d_adapter_init_format_info(adapter, sizeof(struct wined3d_format_gl))) return FALSE;
- if (!init_format_texture_info(adapter, gl_info)) goto fail; + if (!adapter_gl_init_format_texture_info(adapter, gl_info)) goto fail; if (!init_format_vertex_info(adapter, gl_info)) goto fail;
apply_format_fixups(adapter, gl_info); diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index b31ddddf726..67b8f4a7b2b 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -374,6 +374,7 @@ void texture_activate_dimensions(struct wined3d_texture *texture, const struct w GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info, uint32_t bind_flags); void wined3d_check_gl_call(const struct wined3d_gl_info *gl_info, const char *file, unsigned int line, const char *name); +GLenum wined3d_gl_type_to_enum(enum wined3d_gl_resource_type type);
struct min_lookup { @@ -831,7 +832,11 @@ static inline const struct wined3d_adapter_gl *wined3d_adapter_gl_const(const st return CONTAINING_RECORD(adapter, struct wined3d_adapter_gl, a); }
-BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx); +bool adapter_gl_init_format_texture_info(struct wined3d_adapter *adapter, + struct wined3d_gl_info *gl_info); + +BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, + struct wined3d_caps_gl_ctx *ctx);
struct wined3d_allocator_chunk_gl { @@ -1189,4 +1194,7 @@ static inline GLuint wined3d_gl_get_internal_format(struct wined3d_resource *res return format_gl->internal; }
+struct wined3d_format_gl *get_format_gl_internal(const struct wined3d_adapter *adapter, + enum wined3d_format_id format_id); + #endif /* __WINE_WINED3D_GL */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 238456e78d8..a34b3595366 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4585,6 +4585,7 @@ void wined3d_format_copy_data(const struct wined3d_format *format, const uint8_t unsigned int dst_slice_pitch, unsigned int w, unsigned int h, unsigned int d); void wined3d_format_get_float_color_key(const struct wined3d_format *format, const struct wined3d_color_key *key, struct wined3d_color *float_colors); +enum wined3d_format_id wined3d_format_get_srgb_format(enum wined3d_format_id id); BOOL wined3d_format_is_depth_view(enum wined3d_format_id resource_format_id, enum wined3d_format_id view_format_id); const struct wined3d_color_key_conversion * wined3d_format_get_color_key_conversion(
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/format_gl.c | 38 ++++++++++++++-------------------- dlls/wined3d/texture.c | 2 +- dlls/wined3d/wined3d_private.h | 15 ++++++-------- 3 files changed, 22 insertions(+), 33 deletions(-)
diff --git a/dlls/wined3d/format_gl.c b/dlls/wined3d/format_gl.c index b899b2913fc..d9818513e2f 100644 --- a/dlls/wined3d/format_gl.c +++ b/dlls/wined3d/format_gl.c @@ -60,18 +60,10 @@ struct wined3d_format_texture_info unsigned int conv_byte_count; unsigned int caps; enum wined3d_gl_extension extension; - void (*upload)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); - void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); - void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned int dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); + wined3d_format_conversion_func upload, download, decompress; };
-static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, +static void convert_l4a4_unorm(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -98,7 +90,7 @@ static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, } }
-static void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, +static void convert_r5g5_snorm_l6_unorm(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -130,7 +122,7 @@ static void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, } }
-static void convert_r5g5_snorm_l6_unorm_ext(const BYTE *src, BYTE *dst, +static void convert_r5g5_snorm_l6_unorm_ext(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -169,7 +161,7 @@ static void convert_r5g5_snorm_l6_unorm_ext(const BYTE *src, BYTE *dst, } }
-static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, +static void convert_r5g5_snorm_l6_unorm_nv(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -216,7 +208,7 @@ static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, } }
-static void convert_r8g8_snorm(const BYTE *src, BYTE *dst, +static void convert_r8g8_snorm(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -241,7 +233,7 @@ static void convert_r8g8_snorm(const BYTE *src, BYTE *dst, } }
-static void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, +static void convert_r8g8_snorm_l8x8_unorm(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -269,7 +261,7 @@ static void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, } }
-static void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, +static void convert_r8g8_snorm_l8x8_unorm_nv(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -297,7 +289,7 @@ static void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, } }
-static void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, +static void convert_r8g8b8a8_snorm(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -323,7 +315,7 @@ static void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, } }
-static void convert_r16g16_snorm(const BYTE *src, BYTE *dst, +static void convert_r16g16_snorm(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -348,7 +340,7 @@ static void convert_r16g16_snorm(const BYTE *src, BYTE *dst, } }
-static void convert_r16g16(const BYTE *src, BYTE *dst, +static void convert_r16g16(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -376,7 +368,7 @@ static void convert_r16g16(const BYTE *src, BYTE *dst, } }
-static void convert_r32g32_float(const BYTE *src, BYTE *dst, +static void convert_r32g32_float(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -402,7 +394,7 @@ static void convert_r32g32_float(const BYTE *src, BYTE *dst, } }
-static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, +static void convert_s8_uint_d24_float(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -424,7 +416,7 @@ static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, } }
-static void x8_d24_unorm_upload(const BYTE *src, BYTE *dst, +static void x8_d24_unorm_upload(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) @@ -442,7 +434,7 @@ static void x8_d24_unorm_upload(const BYTE *src, BYTE *dst, } }
-static void x8_d24_unorm_download(const BYTE *src, BYTE *dst, +static void x8_d24_unorm_download(const uint8_t *src, uint8_t *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, unsigned int dst_row_pitch, unsigned int dst_slice_pitch, unsigned int width, unsigned int height, unsigned int depth) diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 8a7f9455bb0..0d89d036f2f 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -2485,8 +2485,8 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context, unsigned int dst_row_pitch, dst_slice_pitch; struct wined3d_format_gl f; void *converted_mem; + uint8_t *src_mem; unsigned int z; - BYTE *src_mem;
if (decompress) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index a34b3595366..c9c62ab657e 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4526,6 +4526,11 @@ enum wined3d_channel_type WINED3D_CHANNEL_TYPE_UNUSED, };
+typedef void (*wined3d_format_conversion_func)(const uint8_t *src, uint8_t *dst, + unsigned int src_row_pitch, unsigned int src_slice_pitch, + unsigned int dst_row_pitch, unsigned int dst_slice_pitch, + unsigned int width, unsigned int height, unsigned int depth); + struct wined3d_format { enum wined3d_format_id id; @@ -4557,15 +4562,7 @@ struct wined3d_format float depth_bias_scale; struct wined3d_rational height_scale; struct color_fixup_desc color_fixup; - void (*upload)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); - void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); - void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch, - unsigned int dst_row_pitch, unsigned dst_slice_pitch, - unsigned int width, unsigned int height, unsigned int depth); + wined3d_format_conversion_func upload, download, decompress;
enum wined3d_format_id typeless_id; };
From: Zebediah Figura zfigura@codeweavers.com
Tables with aligned entries are intended to be nicely readable, and at its inception (351874716) this table was. Unfortunately, this breaks down when an entry spans multiple rows, and I find this table to be decidedly unreadable now.
This new format is not the prettiest, and it certainly takes up much more space, but I find it is much easier to tell which field is which. It also avoids the need to write zeros for fields which are not relevant to a given format, which in turn makes it easier to add more fields to the table. --- dlls/wined3d/format_gl.c | 1612 +++++++++++++++++++++++++------------- 1 file changed, 1073 insertions(+), 539 deletions(-)
diff --git a/dlls/wined3d/format_gl.c b/dlls/wined3d/format_gl.c index d9818513e2f..76bc702479e 100644 --- a/dlls/wined3d/format_gl.c +++ b/dlls/wined3d/format_gl.c @@ -484,6 +484,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = format type conv_byte_count caps extension upload download */ + /* FourCC formats */ /* GL_APPLE_ycbcr_422 claims that its '2YUV' format, which is supported via the UNSIGNED_SHORT_8_8_REV_APPLE type * is equivalent to 'UYVY' format on Windows, and the 'YUVS' via UNSIGNED_SHORT_8_8_APPLE equates to 'YUY2'. The @@ -491,553 +492,1085 @@ static const struct wined3d_format_texture_info format_texture_info[] = * Macs, so probably the endianness differs. This could be tested as soon as we have a Windows and MacOS on a big * endian machine */ - {WINED3DFMT_UYVY, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_UYVY, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE8_ALPHA8, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_UYVY, GL_RGB_RAW_422_APPLE, GL_RGB_RAW_422_APPLE, 0, - GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0, - WINED3D_FORMAT_CAP_FILTERING, - APPLE_RGB_422, NULL}, - {WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0, - GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, - APPLE_YCBCR_422, NULL}, - {WINED3DFMT_YUY2, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_YUY2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE8_ALPHA8, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_YUY2, GL_RGB_RAW_422_APPLE, GL_RGB_RAW_422_APPLE, 0, - GL_RGB_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0, - WINED3D_FORMAT_CAP_FILTERING, - APPLE_RGB_422, NULL}, - {WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0, - GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, - APPLE_YCBCR_422, NULL}, - {WINED3DFMT_YV12, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_YV12, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_NV12, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_NV12, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC1_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC2_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC3_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_S3TC, NULL}, - {WINED3DFMT_BC4_UNORM, GL_COMPRESSED_RED_RGTC1, GL_COMPRESSED_RED_RGTC1, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC4_SNORM, GL_COMPRESSED_SIGNED_RED_RGTC1, GL_COMPRESSED_SIGNED_RED_RGTC1, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC5_UNORM, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC5_SNORM, GL_COMPRESSED_SIGNED_RG_RGTC2, GL_COMPRESSED_SIGNED_RG_RGTC2, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_BC6H_UF16, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, 0, - GL_RGB, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_BPTC, NULL}, - {WINED3DFMT_BC6H_SF16, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, 0, - GL_RGB, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_BPTC, NULL}, - {WINED3DFMT_BC7_UNORM, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB, 0, - GL_RGBA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_BPTC, NULL}, + { + .id = WINED3DFMT_UYVY, + .internal = GL_RG8, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_UYVY, + .internal = GL_LUMINANCE8_ALPHA8, + .format = GL_LUMINANCE_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_UYVY, + .internal = GL_RGB_RAW_422_APPLE, + .format = GL_RGB_422_APPLE, + .type = GL_UNSIGNED_SHORT_8_8_APPLE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = APPLE_RGB_422, + }, + { + .id = WINED3DFMT_UYVY, + .internal = GL_RGB, + .format = GL_YCBCR_422_APPLE, + .type = GL_UNSIGNED_SHORT_8_8_APPLE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, + .extension = APPLE_YCBCR_422, + }, + { + .id = WINED3DFMT_YUY2, + .internal = GL_RG8, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_YUY2, + .internal = GL_LUMINANCE8_ALPHA8, + .format = GL_LUMINANCE_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_YUY2, + .internal = GL_RGB_RAW_422_APPLE, + .format = GL_RGB_422_APPLE, + .type = GL_UNSIGNED_SHORT_8_8_REV_APPLE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = APPLE_RGB_422, + }, + { + .id = WINED3DFMT_YUY2, + .internal = GL_RGB, + .format = GL_YCBCR_422_APPLE, + .type = GL_UNSIGNED_SHORT_8_8_REV_APPLE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_FILTERING, + .extension = APPLE_YCBCR_422, + }, + { + .id = WINED3DFMT_YV12, + .internal = GL_R8, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_YV12, + .internal = GL_ALPHA8, + .format = GL_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_NV12, + .internal = GL_R8, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_NV12, + .internal = GL_ALPHA8, + .format = GL_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_DXT1, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_DXT2, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_DXT3, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_DXT4, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_DXT5, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_BC1_UNORM, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_BC2_UNORM, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_BC3_UNORM, + .internal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = EXT_TEXTURE_COMPRESSION_S3TC, + }, + { + .id = WINED3DFMT_BC4_UNORM, + .internal = GL_COMPRESSED_RED_RGTC1, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_RGTC, + }, + { + .id = WINED3DFMT_BC4_SNORM, + .internal = GL_COMPRESSED_SIGNED_RED_RGTC1, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_RGTC, + }, + { + .id = WINED3DFMT_BC5_UNORM, + .internal = GL_COMPRESSED_RG_RGTC2, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_RGTC, + }, + { + .id = WINED3DFMT_BC5_SNORM, + .internal = GL_COMPRESSED_SIGNED_RG_RGTC2, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_RGTC, + }, + { + .id = WINED3DFMT_BC6H_UF16, + .internal = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, + .format = GL_RGB, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_BPTC, + }, + { + .id = WINED3DFMT_BC6H_SF16, + .internal = GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, + .format = GL_RGB, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_BPTC, + }, + { + .id = WINED3DFMT_BC7_UNORM, + .internal = GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, + .srgb_internal = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB, + .format = GL_RGBA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_BPTC, + }, /* IEEE formats */ - {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, - GL_RED, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0, - GL_RED, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, - GL_RGB, GL_FLOAT, 12, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, convert_r32g32_float}, - {WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0, - GL_RG, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32G32B32_FLOAT, GL_RGB32F, GL_RGB32F, 0, - GL_RGB, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0, - GL_RGBA, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, + { + .id = WINED3DFMT_R32_FLOAT, + .internal = GL_RGB32F_ARB, + .format = GL_RED, + .type = GL_FLOAT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_FLOAT, + }, + { + .id = WINED3DFMT_R32_FLOAT, + .internal = GL_R32F, + .format = GL_RED, + .type = GL_FLOAT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R32G32_FLOAT, + .internal = GL_RGB32F_ARB, + .format = GL_RGB, + .type = GL_FLOAT, + .conv_byte_count = 12, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_FLOAT, + .upload = convert_r32g32_float, + }, + { + .id = WINED3DFMT_R32G32_FLOAT, + .internal = GL_RG32F, + .format = GL_RG, + .type = GL_FLOAT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R32G32B32_FLOAT, + .internal = GL_RGB32F, + .format = GL_RGB, + .type = GL_FLOAT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_FLOAT, + }, + { + .id = WINED3DFMT_R32G32B32A32_FLOAT, + .internal = GL_RGBA32F_ARB, + .format = GL_RGBA, + .type = GL_FLOAT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_FLOAT, + }, /* Float */ - {WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, - GL_RED, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0, - GL_RED, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, - GL_RGB, GL_HALF_FLOAT_ARB, 6, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, convert_r16g16}, - {WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0, - GL_RG, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0, - GL_RGBA, GL_HALF_FLOAT_ARB, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_RENDERTARGET - | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_FLOAT, NULL}, - {WINED3DFMT_R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_R11F_G11F_B10F, 0, - GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_PACKED_FLOAT}, + { + .id = WINED3DFMT_R16_FLOAT, + .internal = GL_RGB16F_ARB, + .format = GL_RED, + .type = GL_HALF_FLOAT_ARB, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_FLOAT, + }, + { + .id = WINED3DFMT_R16_FLOAT, + .internal = GL_R16F, + .format = GL_RED, + .type = GL_HALF_FLOAT_ARB, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16G16_FLOAT, + .internal = GL_RGB16F_ARB, + .format = GL_RGB, + .type = GL_HALF_FLOAT_ARB, + .conv_byte_count = 6, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_FLOAT, + .upload = convert_r16g16, + }, + { + .id = WINED3DFMT_R16G16_FLOAT, + .internal = GL_RG16F, + .format = GL_RG, + .type = GL_HALF_FLOAT_ARB, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16G16B16A16_FLOAT, + .internal = GL_RGBA16F_ARB, + .format = GL_RGBA, + .type = GL_HALF_FLOAT_ARB, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING + | WINED3D_FORMAT_CAP_RENDERTARGET + | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_FLOAT, + }, + { + .id = WINED3DFMT_R11G11B10_FLOAT, + .internal = GL_R11F_G11F_B10F, + .format = GL_RGB, + .type = GL_UNSIGNED_INT_10F_11F_11F_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_PACKED_FLOAT, + }, /* Palettized formats */ - {WINED3DFMT_P8_UINT, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - 0, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_P8_UINT, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - 0, - WINED3D_GL_LEGACY_CONTEXT, NULL}, + { + .id = WINED3DFMT_P8_UINT, + .internal = GL_R8, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_P8_UINT, + .internal = GL_ALPHA8, + .format = GL_ALPHA, + .type = GL_UNSIGNED_BYTE, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, /* Standard ARGB formats */ - {WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0, - GL_BGR, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE - | WINED3D_FORMAT_CAP_VTF, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_SRGB8_EXT, GL_RGB8, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B5G6R5_UNORM, GL_RGB565, GL_SRGB8_EXT, GL_RGB8, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, - ARB_ES2_COMPATIBILITY, NULL}, - {WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5, 0, - GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0, - GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0, - GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0, - GL_RGB, GL_UNSIGNED_BYTE_3_3_2, 0, - WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8_UNORM, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_A8_UNORM, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0, - GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGB10_A2UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RGB10_A2UI, NULL}, - {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, - GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE - | WINED3D_FORMAT_CAP_VTF, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RGB10_A2UI, NULL}, - {WINED3DFMT_R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA8I, 0, - GL_RGBA_INTEGER, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16, - GL_RGB, GL_UNSIGNED_SHORT, 6, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r16g16}, - {WINED3DFMT_R16G16_UNORM, GL_RG16, GL_RG16, 0, - GL_RG, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, - GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0, - GL_RGBA, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_R8G8_UNORM, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8G8_UINT, GL_RG8UI, GL_RG8UI, 0, - GL_RG_INTEGER, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8G8_SINT, GL_RG8I, GL_RG8I, 0, - GL_RG_INTEGER, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA16UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA16I, 0, - GL_RGBA_INTEGER, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R32G32_UINT, GL_RG32UI, GL_RG32UI, 0, - GL_RG_INTEGER, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32G32_SINT, GL_RG32I, GL_RG32I, 0, - GL_RG_INTEGER, GL_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16_UINT, GL_RG16UI, GL_RG16UI, 0, - GL_RG_INTEGER, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16G16_SINT, GL_RG16I, GL_RG16I, 0, - GL_RG_INTEGER, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32_UINT, GL_R32UI, GL_R32UI, 0, - GL_RED_INTEGER, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R32_SINT, GL_R32I, GL_R32I, 0, - GL_RED_INTEGER, GL_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16_UNORM, GL_R16, GL_R16, 0, - GL_RED, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16_UINT, GL_R16UI, GL_R16UI, 0, - GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R16_SINT, GL_R16I, GL_R16I, 0, - GL_RED_INTEGER, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8_UINT, GL_R8UI, GL_R8UI, 0, - GL_RED_INTEGER, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_R8_SINT, GL_R8I, GL_R8I, 0, - GL_RED_INTEGER, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, + { + .id = WINED3DFMT_B8G8R8_UNORM, + .internal = GL_RGB8, + .format = GL_BGR, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + }, + { + .id = WINED3DFMT_B8G8R8A8_UNORM, + .internal = GL_RGBA8, + .srgb_internal = GL_SRGB8_ALPHA8_EXT, + .format = GL_BGRA, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE + | WINED3D_FORMAT_CAP_VTF, + }, + { + .id = WINED3DFMT_B8G8R8X8_UNORM, + .internal = GL_RGB8, + .srgb_internal = GL_SRGB8_EXT, + .format = GL_BGRA, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE, + }, + { + .id = WINED3DFMT_B5G6R5_UNORM, + .internal = GL_RGB5, + .srgb_internal = GL_SRGB8_EXT, + .rt_internal = GL_RGB8, + .format = GL_RGB, + .type = GL_UNSIGNED_SHORT_5_6_5, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, + }, + { + .id = WINED3DFMT_B5G6R5_UNORM, + .internal = GL_RGB565, + .srgb_internal = GL_SRGB8_EXT, + .rt_internal = GL_RGB8, + .format = GL_RGB, + .type = GL_UNSIGNED_SHORT_5_6_5, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = ARB_ES2_COMPATIBILITY, + }, + { + .id = WINED3DFMT_B5G5R5X1_UNORM, + .internal = GL_RGB5, + .format = GL_BGRA, + .type = GL_UNSIGNED_SHORT_1_5_5_5_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + }, + { + .id = WINED3DFMT_B5G5R5A1_UNORM, + .internal = GL_RGB5_A1, + .format = GL_BGRA, + .type = GL_UNSIGNED_SHORT_1_5_5_5_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + }, + { + .id = WINED3DFMT_B4G4R4A4_UNORM, + .internal = GL_RGBA4, + .srgb_internal = GL_SRGB8_ALPHA8_EXT, + .format = GL_BGRA, + .type = GL_UNSIGNED_SHORT_4_4_4_4_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + }, + { + .id = WINED3DFMT_B2G3R3_UNORM, + .internal = GL_R3_G3_B2, + .format = GL_RGB, + .type = GL_UNSIGNED_BYTE_3_3_2, + .caps = WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + }, + { + .id = WINED3DFMT_R8_UNORM, + .internal = GL_R8, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_VTF, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_A8_UNORM, + .internal = GL_R8, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_A8_UNORM, + .internal = GL_ALPHA8, + .format = GL_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_B4G4R4X4_UNORM, + .internal = GL_RGB4, + .format = GL_BGRA, + .type = GL_UNSIGNED_SHORT_4_4_4_4_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + }, + { + .id = WINED3DFMT_R10G10B10A2_UINT, + .internal = GL_RGB10_A2UI, + .format = GL_RGBA_INTEGER, + .type = GL_UNSIGNED_INT_2_10_10_10_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RGB10_A2UI, + }, + { + .id = WINED3DFMT_R10G10B10A2_UNORM, + .internal = GL_RGB10_A2, + .format = GL_RGBA, + .type = GL_UNSIGNED_INT_2_10_10_10_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + }, + { + .id = WINED3DFMT_R8G8B8A8_UNORM, + .internal = GL_RGBA8, + .srgb_internal = GL_SRGB8_ALPHA8_EXT, + .format = GL_RGBA, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE + | WINED3D_FORMAT_CAP_VTF, + }, + { + .id = WINED3DFMT_R8G8B8A8_UINT, + .internal = GL_RGBA8UI, + .format = GL_RGBA_INTEGER, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RGB10_A2UI, + }, + { + .id = WINED3DFMT_R8G8B8A8_SINT, + .internal = GL_RGBA8I, + .format = GL_RGBA_INTEGER, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_INTEGER, + }, + { + .id = WINED3DFMT_R8G8B8X8_UNORM, + .internal = GL_RGB8, + .format = GL_RGBA, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + }, + { + .id = WINED3DFMT_R16G16_UNORM, + .internal = GL_RGB16, + .rt_internal = GL_RGBA16, + .format = GL_RGB, + .type = GL_UNSIGNED_SHORT, + .conv_byte_count = 6, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .upload = convert_r16g16, + }, + { + .id = WINED3DFMT_R16G16_UNORM, + .internal = GL_RG16, + .format = GL_RG, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_B10G10R10A2_UNORM, + .internal = GL_RGB10_A2, + .format = GL_BGRA, + .type = GL_UNSIGNED_INT_2_10_10_10_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + }, + { + .id = WINED3DFMT_R16G16B16A16_UNORM, + .internal = GL_RGBA16, + .format = GL_RGBA, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + }, + { + .id = WINED3DFMT_R8G8_UNORM, + .internal = GL_RG8, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R8G8_UINT, + .internal = GL_RG8UI, + .format = GL_RG_INTEGER, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R8G8_SINT, + .internal = GL_RG8I, + .format = GL_RG_INTEGER, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16G16B16A16_UINT, + .internal = GL_RGBA16UI, + .format = GL_RGBA_INTEGER, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_INTEGER, + }, + { + .id = WINED3DFMT_R16G16B16A16_SINT, + .internal = GL_RGBA16I, + .format = GL_RGBA_INTEGER, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_INTEGER, + }, + { + .id = WINED3DFMT_R32G32_UINT, + .internal = GL_RG32UI, + .format = GL_RG_INTEGER, + .type = GL_UNSIGNED_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R32G32_SINT, + .internal = GL_RG32I, + .format = GL_RG_INTEGER, + .type = GL_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16G16_UINT, + .internal = GL_RG16UI, + .format = GL_RG_INTEGER, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16G16_SINT, + .internal = GL_RG16I, + .format = GL_RG_INTEGER, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R32_UINT, + .internal = GL_R32UI, + .format = GL_RED_INTEGER, + .type = GL_UNSIGNED_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R32_SINT, + .internal = GL_R32I, + .format = GL_RED_INTEGER, + .type = GL_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16_UNORM, + .internal = GL_R16, + .format = GL_RED, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16_UINT, + .internal = GL_R16UI, + .format = GL_RED_INTEGER, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R16_SINT, + .internal = GL_R16I, + .format = GL_RED_INTEGER, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R8_UINT, + .internal = GL_R8UI, + .format = GL_RED_INTEGER, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_R8_SINT, + .internal = GL_R8I, + .format = GL_RED_INTEGER, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, /* Luminance */ - {WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_L8_UNORM, GL_R8, GL_R8, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_L8A8_UNORM, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_SRGB_READ, - WINED3D_GL_LEGACY_CONTEXT, NULL}, - {WINED3DFMT_L4A4_UNORM, GL_RG8, GL_RG8, 0, - GL_RG, GL_UNSIGNED_BYTE, 2, - WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, convert_l4a4_unorm}, - {WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2, - WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, convert_l4a4_unorm}, - {WINED3DFMT_L16_UNORM, GL_R16, GL_R16, 0, - GL_RED, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_RG, NULL}, - {WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0, - GL_LUMINANCE, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_LEGACY_CONTEXT, NULL}, + { + .id = WINED3DFMT_L8_UNORM, + .internal = GL_LUMINANCE8, + .srgb_internal = GL_SLUMINANCE8_EXT, + .format = GL_LUMINANCE, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_L8_UNORM, + .internal = GL_R8, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_L8A8_UNORM, + .internal = GL_RG8, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_L8A8_UNORM, + .internal = GL_LUMINANCE8_ALPHA8, + .srgb_internal = GL_SLUMINANCE8_ALPHA8_EXT, + .format = GL_LUMINANCE_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_SRGB_READ, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, + { + .id = WINED3DFMT_L4A4_UNORM, + .internal = GL_RG8, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .conv_byte_count = 2, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + .upload = convert_l4a4_unorm, + }, + { + .id = WINED3DFMT_L4A4_UNORM, + .internal = GL_LUMINANCE4_ALPHA4, + .format = GL_LUMINANCE_ALPHA, + .type = GL_UNSIGNED_BYTE, + .conv_byte_count = 2, + .caps = WINED3D_FORMAT_CAP_FILTERING, + .extension = WINED3D_GL_LEGACY_CONTEXT, + .upload = convert_l4a4_unorm, + }, + { + .id = WINED3DFMT_L16_UNORM, + .internal = GL_R16, + .format = GL_RED, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_RG, + }, + { + .id = WINED3DFMT_L16_UNORM, + .internal = GL_LUMINANCE16, + .format = GL_LUMINANCE, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = WINED3D_GL_LEGACY_CONTEXT, + }, /* Bump mapping stuff */ - {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0, - GL_BGR, GL_UNSIGNED_BYTE, 3, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r8g8_snorm}, - {WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0, - GL_DSDT_NV, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, NULL}, - {WINED3DFMT_R8G8_SNORM, GL_RG8_SNORM, GL_RG8_SNORM, 0, - GL_RG, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r5g5_snorm_l6_unorm}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0, - GL_DSDT_MAG_NV, GL_BYTE, 3, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, convert_r5g5_snorm_l6_unorm_nv}, - {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB8_SNORM, GL_RGB8_SNORM, 0, - GL_RGBA, GL_BYTE, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_SNORM, convert_r5g5_snorm_l6_unorm_ext}, - {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r8g8_snorm_l8x8_unorm}, - {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0, - GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, convert_r8g8_snorm_l8x8_unorm_nv}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0, - GL_BGRA, GL_UNSIGNED_BYTE, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r8g8b8a8_snorm}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0, - GL_RGBA, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, NULL}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA8_SNORM, 0, - GL_RGBA, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0, - GL_BGR, GL_UNSIGNED_SHORT, 6, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - WINED3D_GL_EXT_NONE, convert_r16g16_snorm}, - {WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0, - GL_HILO_NV, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - NV_TEXTURE_SHADER, NULL}, - {WINED3DFMT_R16G16_SNORM, GL_RG16_SNORM, GL_RG16_SNORM, 0, - GL_RG, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R16G16B16A16_SNORM, GL_RGBA16_SNORM, GL_RGBA16_SNORM, 0, - GL_RGBA, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R16_SNORM, GL_R16_SNORM, GL_R16_SNORM, 0, - GL_RED, GL_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, - {WINED3DFMT_R8_SNORM, GL_R8_SNORM, GL_R8_SNORM, 0, - GL_RED, GL_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_SNORM, NULL}, + { + .id = WINED3DFMT_R8G8_SNORM, + .internal = GL_RGB8, + .format = GL_BGR, + .type = GL_UNSIGNED_BYTE, + .conv_byte_count = 3, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .upload = convert_r8g8_snorm, + }, + { + .id = WINED3DFMT_R8G8_SNORM, + .internal = GL_DSDT8_NV, + .format = GL_DSDT_NV, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = NV_TEXTURE_SHADER, + }, + { + .id = WINED3DFMT_R8G8_SNORM, + .internal = GL_RG8_SNORM, + .format = GL_RG, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_SNORM, + }, + { + .id = WINED3DFMT_R5G5_SNORM_L6_UNORM, + .internal = GL_RGB5, + .format = GL_RGB, + .type = GL_UNSIGNED_SHORT_5_6_5, + .conv_byte_count = 2, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .upload = convert_r5g5_snorm_l6_unorm, + }, + { + .id = WINED3DFMT_R5G5_SNORM_L6_UNORM, + .internal = GL_DSDT8_MAG8_NV, + .format = GL_DSDT_MAG_NV, + .type = GL_BYTE, + .conv_byte_count = 3, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = NV_TEXTURE_SHADER, + .upload = convert_r5g5_snorm_l6_unorm_nv, + }, + { + .id = WINED3DFMT_R5G5_SNORM_L6_UNORM, + .internal = GL_RGB8_SNORM, + .format = GL_RGBA, + .type = GL_BYTE, + .conv_byte_count = 4, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = EXT_TEXTURE_SNORM, + .upload = convert_r5g5_snorm_l6_unorm_ext, + }, + { + .id = WINED3DFMT_R8G8_SNORM_L8X8_UNORM, + .internal = GL_RGB8, + .format = GL_BGRA, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .conv_byte_count = 4, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .upload = convert_r8g8_snorm_l8x8_unorm, + }, + { + .id = WINED3DFMT_R8G8_SNORM_L8X8_UNORM, + .internal = GL_DSDT8_MAG8_INTENSITY8_NV, + .format = GL_DSDT_MAG_VIB_NV, + .type = GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, + .conv_byte_count = 4, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = NV_TEXTURE_SHADER, + .upload = convert_r8g8_snorm_l8x8_unorm_nv, + }, + { + .id = WINED3DFMT_R8G8B8A8_SNORM, + .internal = GL_RGBA8, + .format = GL_BGRA, + .type = GL_UNSIGNED_BYTE, + .conv_byte_count = 4, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .upload = convert_r8g8b8a8_snorm, + }, + { + .id = WINED3DFMT_R8G8B8A8_SNORM, + .internal = GL_SIGNED_RGBA8_NV, + .format = GL_RGBA, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = NV_TEXTURE_SHADER, + }, + { + .id = WINED3DFMT_R8G8B8A8_SNORM, + .internal = GL_RGBA8_SNORM, + .format = GL_RGBA, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_SNORM, + }, + { + .id = WINED3DFMT_R16G16_SNORM, + .internal = GL_RGB16, + .format = GL_BGR, + .type = GL_UNSIGNED_SHORT, + .conv_byte_count = 6, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .upload = convert_r16g16_snorm, + }, + { + .id = WINED3DFMT_R16G16_SNORM, + .internal = GL_SIGNED_HILO16_NV, + .format = GL_HILO_NV, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = NV_TEXTURE_SHADER, + }, + { + .id = WINED3DFMT_R16G16_SNORM, + .internal = GL_RG16_SNORM, + .format = GL_RG, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_SNORM, + }, + { + .id = WINED3DFMT_R16G16B16A16_SNORM, + .internal = GL_RGBA16_SNORM, + .format = GL_RGBA, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_SNORM, + }, + { + .id = WINED3DFMT_R16_SNORM, + .internal = GL_R16_SNORM, + .format = GL_RED, + .type = GL_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_SNORM, + }, + { + .id = WINED3DFMT_R8_SNORM, + .internal = GL_R8_SNORM, + .format = GL_RED, + .type = GL_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_SNORM, + }, /* Depth stencil formats */ - {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_DEPTH_STENCIL, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, NULL}, - {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, NULL}, - {WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - EXT_PACKED_DEPTH_STENCIL, NULL}, - {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4, - WINED3D_FORMAT_CAP_DEPTH_STENCIL, - WINED3D_GL_EXT_NONE, x8_d24_unorm_upload, x8_d24_unorm_download}, - {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 4, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, x8_d24_unorm_upload, x8_d24_unorm_download}, - {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_DEPTH_STENCIL, - WINED3D_GL_EXT_NONE, NULL}, - {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_TEXTURE, NULL}, - {WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0, - GL_DEPTH_COMPONENT, GL_FLOAT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_BUFFER_FLOAT, NULL}, - {WINED3DFMT_D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_BUFFER_FLOAT, NULL}, - {WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, - ARB_DEPTH_BUFFER_FLOAT, convert_s8_uint_d24_float}, - {WINED3DFMT_R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA32UI, 0, - GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, - {WINED3DFMT_R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA32I, 0, - GL_RGBA_INTEGER, GL_INT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, - EXT_TEXTURE_INTEGER, NULL}, + { + .id = WINED3DFMT_D16_LOCKABLE, + .internal = GL_DEPTH_COMPONENT, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_DEPTH_STENCIL, + }, + { + .id = WINED3DFMT_D16_LOCKABLE, + .internal = GL_DEPTH_COMPONENT16, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_TEXTURE, + }, + { + .id = WINED3DFMT_D24_UNORM_S8_UINT, + .internal = GL_DEPTH_COMPONENT24_ARB, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_TEXTURE, + }, + { + .id = WINED3DFMT_D24_UNORM_S8_UINT, + .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 | WINED3D_FORMAT_CAP_SHADOW, + .extension = EXT_PACKED_DEPTH_STENCIL, + }, + { + .id = WINED3DFMT_X8D24_UNORM, + .internal = GL_DEPTH_COMPONENT, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_INT, + .conv_byte_count = 4, + .caps = WINED3D_FORMAT_CAP_DEPTH_STENCIL, + .upload = x8_d24_unorm_upload, + .download = x8_d24_unorm_download, + }, + { + .id = WINED3DFMT_X8D24_UNORM, + .internal = GL_DEPTH_COMPONENT24_ARB, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_INT, + .conv_byte_count = 4, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_TEXTURE, + .upload = x8_d24_unorm_upload, + .download = x8_d24_unorm_download, + }, + { + .id = WINED3DFMT_D16_UNORM, + .internal = GL_DEPTH_COMPONENT, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_DEPTH_STENCIL, + }, + { + .id = WINED3DFMT_D16_UNORM, + .internal = GL_DEPTH_COMPONENT16, + .format = GL_DEPTH_COMPONENT, + .type = GL_UNSIGNED_SHORT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING + | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_TEXTURE, + }, + { + .id = WINED3DFMT_D32_FLOAT, + .internal = GL_DEPTH_COMPONENT32F, + .format = GL_DEPTH_COMPONENT, + .type = GL_FLOAT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_BUFFER_FLOAT, + }, + { + .id = WINED3DFMT_D32_FLOAT_S8X24_UINT, + .internal = GL_DEPTH32F_STENCIL8, + .format = GL_DEPTH_STENCIL, + .type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_BUFFER_FLOAT, + }, + { + .id = WINED3DFMT_S8_UINT_D24_FLOAT, + .internal = GL_DEPTH32F_STENCIL8, + .format = GL_DEPTH_STENCIL, + .type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV, + .conv_byte_count = 8, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_DEPTH_STENCIL | WINED3D_FORMAT_CAP_SHADOW, + .extension = ARB_DEPTH_BUFFER_FLOAT, + .upload = convert_s8_uint_d24_float, + }, + { + .id = WINED3DFMT_R32G32B32A32_UINT, + .internal = GL_RGBA32UI, + .format = GL_RGBA_INTEGER, + .type = GL_UNSIGNED_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_INTEGER, + }, + { + .id = WINED3DFMT_R32G32B32A32_SINT, + .internal = GL_RGBA32I, + .format = GL_RGBA_INTEGER, + .type = GL_INT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET, + .extension = EXT_TEXTURE_INTEGER, + }, /* Vendor-specific formats */ - {WINED3DFMT_ATI1N, GL_COMPRESSED_RED_RGTC1, GL_COMPRESSED_RED_RGTC1, 0, - GL_RED, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ATI_TEXTURE_COMPRESSION_3DC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_RG_RGTC2, GL_COMPRESSED_RG_RGTC2, 0, - GL_RG, GL_UNSIGNED_BYTE, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - ARB_TEXTURE_COMPRESSION_RGTC, NULL}, - {WINED3DFMT_INTZ, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, - GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_DEPTH_STENCIL, - EXT_PACKED_DEPTH_STENCIL, NULL}, - {WINED3DFMT_NULL, 0, 0, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_FBO_ATTACHABLE, - ARB_FRAMEBUFFER_OBJECT, NULL}, + { + .id = WINED3DFMT_ATI1N, + .internal = GL_COMPRESSED_RED_RGTC1, + .format = GL_RED, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_RGTC, + }, + { + .id = WINED3DFMT_ATI2N, + .internal = GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, + .format = GL_LUMINANCE_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ATI_TEXTURE_COMPRESSION_3DC, + }, + { + .id = WINED3DFMT_ATI2N, + .internal = GL_COMPRESSED_RG_RGTC2, + .format = GL_LUMINANCE_ALPHA, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = EXT_TEXTURE_COMPRESSION_RGTC, + }, + { + .id = WINED3DFMT_ATI2N, + .internal = GL_COMPRESSED_RG_RGTC2, + .format = GL_RG, + .type = GL_UNSIGNED_BYTE, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = ARB_TEXTURE_COMPRESSION_RGTC, + }, + { + .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 = EXT_PACKED_DEPTH_STENCIL, + }, + { + .id = WINED3DFMT_NULL, + .internal = 0, + .format = GL_RGBA, + .type = GL_UNSIGNED_INT_8_8_8_8_REV, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_FBO_ATTACHABLE, + .extension = ARB_FRAMEBUFFER_OBJECT, + }, /* DirectX 10 HDR formats */ - {WINED3DFMT_R9G9B9E5_SHAREDEXP, GL_RGB9_E5_EXT, GL_RGB9_E5_EXT, 0, - GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV_EXT, 0, - WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, - EXT_TEXTURE_SHARED_EXPONENT, NULL}, + { + .id = WINED3DFMT_R9G9B9E5_SHAREDEXP, + .internal = GL_RGB9_E5_EXT, + .format = GL_RGB, + .type = GL_UNSIGNED_INT_5_9_9_9_REV_EXT, + .caps = WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING, + .extension = EXT_TEXTURE_SHARED_EXPONENT, + }, };
static void query_format_cap(struct wined3d_gl_info *gl_info, struct wined3d_format_gl *format, @@ -1334,7 +1867,8 @@ bool adapter_gl_init_format_texture_info(struct wined3d_adapter *adapter, struct continue;
format->internal = info->internal; - format->srgb_internal = info->srgb_internal; + if (!(format->srgb_internal = info->srgb_internal)) + format->srgb_internal = format->internal; format->rt_internal = info->rt_internal; format->format = info->format; format->type = info->type;
From: Zebediah Figura zfigura@codeweavers.com
This is useful in tables like format_texture_info.
The specific idea here is that we want to move color_fixup to the format_texture_info table. In order to do this, we need two separate entries for INTZ: one for core contexts, which uses an XXXX fixup, and one for legacy contexts, which uses no fixup (because we can use GL_DEPTH_TEXTURE_MODE_ARB) but still requires EXT_packed_depth_stencil. This works because core contexts imply GL 3.0 which in turn implies EXT_packed_depth_stencil, but it cannot work with just WINED3D_GL_LEGACY_CONTEXT, so we need to invert the meaning and create WINED3D_GL_CORE_CONTEXT. --- dlls/wined3d/adapter_gl.c | 6 ++++++ dlls/wined3d/wined3d_gl.h | 1 + 2 files changed, 7 insertions(+)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index de4729a56fc..1594e23f0ab 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -3447,10 +3447,16 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter_gl *adapter_gl, gl_info->gl_ops.gl.p_glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &context_profile); checkGLcall("Querying context profile"); } + if (context_profile & GL_CONTEXT_CORE_PROFILE_BIT) + { TRACE("Got a core profile context.\n"); + gl_info->supported[WINED3D_GL_CORE_CONTEXT] = TRUE; + } else + { gl_info->supported[WINED3D_GL_LEGACY_CONTEXT] = TRUE; + }
TRACE("GL extensions reported:\n"); if (gl_info->supported[WINED3D_GL_LEGACY_CONTEXT]) diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index 67b8f4a7b2b..7a20d45d75d 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -229,6 +229,7 @@ enum wined3d_gl_extension WGL_WINE_QUERY_RENDERER, /* Internally used */ WINED3D_GL_BLEND_EQUATION, + WINED3D_GL_CORE_CONTEXT, WINED3D_GL_LEGACY_CONTEXT, WINED3D_GL_NORMALIZED_TEXRECT, WINED3D_GL_PRIMITIVE_QUERY,
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;
The upload/download/decompression functions aren't all that specific to GL; I imagine we'll eventually need them for Vulkan as well.
I don't care much for "wined3d_format_conversion_func", but *shrug*.
I don't care much for the reformatting of format_texture_info[] either. It's true that the table is perhaps a bit unwieldy in its current form, but I don't think this MR makes it better. The direction we had been moving in was to simply store optional information in separate tables, e.g. format_srgb_info[], format_decompress_info[], format_block_info[], and so on. The upload/download callbacks are in that category, as are "gl_srgb_internal" and "gl_rt_internal". The (default) format flags could probably either be stored in a more compact format or be moved to a separate table as well, at which point we'd essentially be left with "gl_internal", "gl_format", and "gl_type". We could conceivably even derive "gl_format" and "gl_type" from the channel info, although it's not clear to me that it would be worth it.
The upload/download/decompression functions aren't all that specific to GL; I imagine we'll eventually need them for Vulkan as well.
Good point.
I don't care much for "wined3d_format_conversion_func", but *shrug*.
Any specific reason? I know that typedefs in general are unnecessary and reduce clarity, but function pointers are usually harder to read when embedded places. Or is it the name you dislike?
I don't care strongly about this, though, at least not for this patch which touches only a couple lines (not counting the incidental change to stdint types.)
I don't care much for the reformatting of format_texture_info[] either. It's true that the table is perhaps a bit unwieldy in its current form, but I don't think this MR makes it better. The direction we had been moving in was to simply store optional information in separate tables, e.g. format_srgb_info[], format_decompress_info[], format_block_info[], and so on. The upload/download callbacks are in that category, as are "gl_srgb_internal" and "gl_rt_internal".
What bothers me about this is that the information in format_texture_info[], and the information I was going to move there over the course of this series, doesn't seem orthogonal to me. The table fundamentally decides what GL internal format to use for a given D3D format. gl_format and gl_type are (IIUC) derived directly from the internal format. upload, download, decompress, conv_byte_count, and fixups relate both conceptually and practically to the choice of a given internal format (or none) for a given d3d format. I guess gl_rt_internal / gl_srgb_internal *could* be orthogonal, but I don't see the others as being orthogonal.
Of course, it's tradeoffs, and if we want format_texture_info[] to be maximally tight and readable at the cost of not putting everything in the same place, then I understand that. I don't particularly like it, though; I'd rather have the code make maximal *sense* to a new developer, and I feel like format_texture_info[] is readable enough regardless. But I won't argue about it either.
FWIW, I think color fixups are the only thing I ended up moving to format_texture_info[]. The others mentioned, i.e. format_srgb_info[], format_decompress_info[], format_block_info[], really are orthogonal, and moreover they're inherent properties of the d3d format, not tied to a backend at all.
(I don't know what to do about the "caps" flags; they're kind of an awkward combination of backend-specific and non-backend-specific information.)
I don't care much for "wined3d_format_conversion_func", but *shrug*.
Any specific reason? I know that typedefs in general are unnecessary and reduce clarity, but function pointers are usually harder to read when embedded places. Or is it the name you dislike?
Essentially what you said: it doesn't seem terribly necessary here, and it makes it slightly harder to find e.g. the required prototype for these functions.
I don't care much for the reformatting of format_texture_info[] either. It's true that the table is perhaps a bit unwieldy in its current form, but I don't think this MR makes it better. The direction we had been moving in was to simply store optional information in separate tables, e.g. format_srgb_info[], format_decompress_info[], format_block_info[], and so on. The upload/download callbacks are in that category, as are "gl_srgb_internal" and "gl_rt_internal".
What bothers me about this is that the information in format_texture_info[], and the information I was going to move there over the course of this series, doesn't seem orthogonal to me. The table fundamentally decides what GL internal format to use for a given D3D format. gl_format and gl_type are (IIUC) derived directly from the internal format. upload, download, decompress, conv_byte_count, and fixups relate both conceptually and practically to the choice of a given internal format (or none) for a given d3d format. I guess gl_rt_internal / gl_srgb_internal *could* be orthogonal, but I don't see the others as being orthogonal.
I think that's a bit of a misunderstanding. gl_format and gl_type describe the "external" format. I.e., the format of the data that we pass to e.g. glTexSubImage2D(). Ideally that matches both the D3D format and the GL internal format because in that case we (as well as GL) can simply copy the data without any format conversion, but it doesn't have to. In particular, if gl_format and gl_type match the D3D format but not the GL internal format, OpenGL will do the conversion for us.
The point though, is that most of the formats in the table simply don't need those extra fields. Most of them don't have different gl_rt_internal or gl_srgb_internal formats, and most of them don't need upload/download conversion functions. I.e., most of the entries could look like this: ```c {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, ARB_TEXTURE_FLOAT}, [...] {WINED3DFMT_R16G16B16A16_UINT, GL_RGBA16UI, EXT_TEXTURE_INTEGER}, [...]
``` and then we'd need only a relatively modest number of entries for the more complicated formats.
(I don't know what to do about the "caps" flags; they're kind of an awkward combination of backend-specific and non-backend-specific information.)
Well, there's format_base_flags[]. Note also that with modern OpenGL we can largely use the same strategy we use for Vulkan, and test format capabilities with ARB_internalformat_query2. For older GL, the format being supported at all generally implies it supports texturing, filtering, and so on. WINED3D_QUIRK_BROKEN_RGBA16 is a notable exception.
In any case, just my two cents; Jan is the person you'll need to convince, not me. :D
The point though, is that most of the formats in the table simply don't need those extra fields. Most of them don't have different gl_rt_internal or gl_srgb_internal formats, and most of them don't need upload/download conversion functions. I.e., most of the entries could look like this:
{WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, ARB_TEXTURE_FLOAT}, [...] {WINED3DFMT_R16G16B16A16_UINT, GL_RGBA16UI, EXT_TEXTURE_INTEGER}, [...]
and then we'd need only a relatively modest number of entries for the more complicated formats.
Hmm, that's more workable. We could probably do a lot already by reordering the fields so all the optional ones are at the end.
I might try adjusting the table a bit. But I might also just drop this series and work on upstreaming more important things for now.
(I don't know what to do about the "caps" flags; they're kind of an awkward combination of backend-specific and non-backend-specific information.)
Well, there's format_base_flags[]. Note also that with modern OpenGL we can largely use the same strategy we use for Vulkan, and test format capabilities with ARB_internalformat_query2. For older GL, the format being supported at all generally implies it supports texturing, filtering, and so on. WINED3D_QUIRK_BROKEN_RGBA16 is a notable exception.
Yeah, but there's also a lot of hardcoded lists in extensions, which is irritating. And then there's cases where we intentionally omit flags because they confuse applications, which really shouldn't be in format_texture_info, but probably deserves its own table.
In any case, just my two cents; Jan is the person you'll need to convince, not me. :D
I'll take my cues as often as I can from someone who's maintained this area for a decade before I even started working on the project ;-)
This merge request was closed by Zebediah Figura.
Dropping this for now.