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(