texture: Add missing integer texture formats

This commit is contained in:
rdb 2021-01-17 13:11:30 +01:00
parent 3479c6eee2
commit 1fda6e7d51
5 changed files with 297 additions and 29 deletions

View File

@ -156,6 +156,18 @@ typedef char GLchar;
#define GL_TEXTURE_MAX_LEVEL 0x813D
#define GL_NUM_EXTENSIONS 0x821D
#define GL_RG_INTEGER 0x8228
#define GL_R8I 0x8231
#define GL_R8UI 0x8232
#define GL_R16I 0x8233
#define GL_R16UI 0x8234
#define GL_R32I 0x8235
#define GL_R32UI 0x8236
#define GL_RG8I 0x8237
#define GL_RG8UI 0x8238
#define GL_RG16I 0x8239
#define GL_RG16UI 0x823A
#define GL_RG32I 0x823B
#define GL_RG32UI 0x823C
#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
#define GL_PROGRAM_BINARY_LENGTH 0x8741
#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
@ -196,6 +208,18 @@ typedef char GLchar;
#define GL_SRGB8 0x8C41
#define GL_SRGB8_ALPHA8 0x8C43
#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
#define GL_RGBA32UI 0x8D70
#define GL_RGB32UI 0x8D71
#define GL_RGBA16UI 0x8D76
#define GL_RGB16UI 0x8D77
#define GL_RGBA8UI 0x8D7C
#define GL_RGB8UI 0x8D7D
#define GL_RGBA32I 0x8D82
#define GL_RGB32I 0x8D83
#define GL_RGBA16I 0x8D88
#define GL_RGB16I 0x8D89
#define GL_RGBA8I 0x8D8E
#define GL_RGB8I 0x8D8F
#define GL_RED_INTEGER 0x8D94
#define GL_RGB_INTEGER 0x8D98
#define GL_RGBA_INTEGER 0x8D99

View File

@ -9320,6 +9320,8 @@ get_external_image_format(Texture *tex) const {
case Texture::F_rgba16:
case Texture::F_rgba32:
case Texture::F_rgba8i:
case Texture::F_rgba16i:
case Texture::F_rgba32i:
case Texture::F_rgb10_a2:
return GL_COMPRESSED_RGBA;
@ -9331,7 +9333,9 @@ get_external_image_format(Texture *tex) const {
case Texture::F_rgb12:
case Texture::F_rgb332:
case Texture::F_rgb16:
case Texture::F_rgb16i:
case Texture::F_rgb32:
case Texture::F_rgb32i:
return GL_COMPRESSED_RGB;
case Texture::F_alpha:
@ -9350,7 +9354,9 @@ get_external_image_format(Texture *tex) const {
case Texture::F_rg:
case Texture::F_rg8i:
case Texture::F_rg16:
case Texture::F_rg16i:
case Texture::F_rg32:
case Texture::F_rg32i:
return GL_COMPRESSED_RG;
case Texture::F_luminance:
@ -9605,10 +9611,16 @@ get_external_image_format(Texture *tex) const {
case Texture::F_r32i:
return GL_RED_INTEGER;
case Texture::F_rg8i:
case Texture::F_rg16i:
case Texture::F_rg32i:
return GL_RG_INTEGER;
case Texture::F_rgb8i:
case Texture::F_rgb16i:
case Texture::F_rgb32i:
return GL_RGB_INTEGER;
case Texture::F_rgba8i:
case Texture::F_rgba16i:
case Texture::F_rgba32i:
return GL_RGBA_INTEGER;
#endif
@ -9660,7 +9672,13 @@ get_internal_image_format(Texture *tex, bool force_sized) const {
case Texture::F_rgb8i:
case Texture::F_rgba8i:
case Texture::F_r16i:
case Texture::F_rg16i:
case Texture::F_rgb16i:
case Texture::F_rgba16i:
case Texture::F_r32i:
case Texture::F_rg32i:
case Texture::F_rgb32i:
case Texture::F_rgba32i:
case Texture::F_r11_g11_b10:
case Texture::F_rgb9_e5:
// Unsupported; fall through to below.
@ -10211,12 +10229,6 @@ get_internal_image_format(Texture *tex, bool force_sized) const {
} else {
return GL_R16_SNORM;
}
case Texture::F_r16i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_R16UI;
} else {
return GL_R16I;
}
case Texture::F_rg16:
if (tex->get_component_type() == Texture::T_float) {
return GL_RG16F;
@ -10225,6 +10237,30 @@ get_internal_image_format(Texture *tex, bool force_sized) const {
} else {
return GL_RG16_SNORM;
}
case Texture::F_r16i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_R16UI;
} else {
return GL_R16I;
}
case Texture::F_rg16i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_RG16UI;
} else {
return GL_RG16I;
}
case Texture::F_rgb16i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_RGB16UI;
} else {
return GL_RGB16I;
}
case Texture::F_rgba16i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_RGBA16UI;
} else {
return GL_RGBA16I;
}
#endif
#ifndef OPENGLES_1
@ -10337,9 +10373,31 @@ get_internal_image_format(Texture *tex, bool force_sized) const {
return _core_profile ? GL_SRGB8_ALPHA8 : GL_SLUMINANCE8_ALPHA8;
#endif
#ifndef OPENGLES
#ifndef OPENGLES_1
case Texture::F_r32i:
return GL_R32I;
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_R32UI;
} else {
return GL_R32I;
}
case Texture::F_rg32i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_RG32UI;
} else {
return GL_RG32I;
}
case Texture::F_rgb32i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_RGB32UI;
} else {
return GL_RGB32I;
}
case Texture::F_rgba32i:
if (Texture::is_unsigned(tex->get_component_type())) {
return GL_RGBA32UI;
} else {
return GL_RGBA32I;
}
#endif
#ifndef OPENGLES_1
@ -13972,7 +14030,9 @@ do_extract_texture_data(CLP(TextureContext) *gtc) {
case GL_R3_G3_B2:
format = Texture::F_rgb332;
break;
#endif
#ifndef OPENGLES_1
case GL_R8I:
type = Texture::T_byte;
format = Texture::F_r8i;
@ -14011,11 +14071,69 @@ do_extract_texture_data(CLP(TextureContext) *gtc) {
type = Texture::T_short;
format = Texture::F_r16i;
break;
case GL_RG16I:
type = Texture::T_short;
format = Texture::F_rg16i;
break;
case GL_RGB16I:
type = Texture::T_short;
format = Texture::F_rgb16i;
break;
case GL_RGBA16I:
type = Texture::T_short;
format = Texture::F_rgba16i;
break;
case GL_R16UI:
type = Texture::T_unsigned_short;
format = Texture::F_r16i;
break;
case GL_RG16UI:
type = Texture::T_unsigned_short;
format = Texture::F_rg16i;
break;
case GL_RGB16UI:
type = Texture::T_unsigned_short;
format = Texture::F_rgb16i;
break;
case GL_RGBA16UI:
type = Texture::T_unsigned_short;
format = Texture::F_rgba16i;
break;
case GL_R32I:
type = Texture::T_int;
format = Texture::F_r32i;
break;
case GL_RG32I:
type = Texture::T_int;
format = Texture::F_rg32i;
break;
case GL_RGB32I:
type = Texture::T_int;
format = Texture::F_rgb32i;
break;
case GL_RGBA32I:
type = Texture::T_int;
format = Texture::F_rgba32i;
break;
case GL_R32UI:
type = Texture::T_unsigned_int;
format = Texture::F_r32i;
break;
case GL_RG32UI:
type = Texture::T_unsigned_int;
format = Texture::F_rg32i;
break;
case GL_RGB32UI:
type = Texture::T_unsigned_int;
format = Texture::F_rgb32i;
break;
case GL_RGBA32UI:
type = Texture::T_unsigned_int;
format = Texture::F_rgba32i;
break;
#endif
#ifndef OPENGLES_1
@ -14104,12 +14222,6 @@ do_extract_texture_data(CLP(TextureContext) *gtc) {
format = Texture::F_red;
break;
#endif
#ifndef OPENGLES
case GL_R32I:
type = Texture::T_int;
format = Texture::F_r32i;
break;
#endif
#ifndef OPENGLES
case GL_RED:

View File

@ -676,7 +676,7 @@ estimate_texture_memory() const {
CDReader cdata(_cycler);
size_t pixels = cdata->_x_size * cdata->_y_size * cdata->_z_size;
size_t bpp = 4;
size_t bpp = 0;
switch (cdata->_format) {
case Texture::F_rgb332:
bpp = 1;
@ -739,10 +739,8 @@ estimate_texture_memory() const {
bpp = 8;
break;
case Texture::F_rgba16:
bpp = 8;
break;
case Texture::F_rgba32:
case Texture::F_rgba32i:
bpp = 16;
break;
@ -752,9 +750,13 @@ estimate_texture_memory() const {
bpp = 2;
break;
case Texture::F_rg16:
case Texture::F_rg16i:
bpp = 4;
break;
case Texture::F_rgb16:
case Texture::F_rgb16i:
case Texture::F_rgba16:
case Texture::F_rgba16i:
bpp = 8;
break;
@ -764,10 +766,12 @@ estimate_texture_memory() const {
break;
case Texture::F_rg32:
case Texture::F_rg32i:
bpp = 8;
break;
case Texture::F_rgb32:
case Texture::F_rgb32i:
bpp = 16;
break;
@ -776,11 +780,12 @@ estimate_texture_memory() const {
case Texture::F_rgb10_a2:
bpp = 4;
break;
}
default:
if (bpp == 0) {
bpp = 4;
gobj_cat.warning() << "Unhandled format in estimate_texture_memory(): "
<< cdata->_format << "\n";
break;
}
size_t bytes = pixels * bpp;
@ -1789,10 +1794,6 @@ write(ostream &out, int indent_level) const {
case F_r16:
out << "r16";
break;
case F_r16i:
out << "r16i";
break;
case F_rg16:
out << "rg16";
break;
@ -1852,6 +1853,29 @@ write(ostream &out, int indent_level) const {
case F_rg:
out << "rg";
break;
case F_r16i:
out << "r16i";
break;
case F_rg16i:
out << "rg16i";
break;
case F_rgb16i:
out << "rgb16i";
break;
case F_rgba16i:
out << "rgba16i";
break;
case F_rg32i:
out << "rg32i";
break;
case F_rgb32i:
out << "rgb32i";
break;
case F_rgba32i:
out << "rgba32i";
break;
}
if (cdata->_compression != CM_default) {
@ -2217,8 +2241,6 @@ format_format(Format format) {
return "rgba32";
case F_r16:
return "r16";
case F_r16i:
return "r16i";
case F_rg16:
return "rg16";
case F_rgb16:
@ -2255,6 +2277,20 @@ format_format(Format format) {
return "rgb10_a2";
case F_rg:
return "rg";
case F_r16i:
return "r16i";
case F_rg16i:
return "rg16i";
case F_rgb16i:
return "rgb16i";
case F_rgba16i:
return "rgba16i";
case F_rg32i:
return "rg32i";
case F_rgb32i:
return "rgb32i";
case F_rgba32i:
return "rgba32i";
}
return "**invalid**";
}
@ -2340,6 +2376,14 @@ string_format(const string &str) {
return F_rg32;
} else if (cmp_nocase(str, "rgb32") == 0 || cmp_nocase(str, "r32g32b32") == 0) {
return F_rgb32;
} else if (cmp_nocase_uh(str, "r8i") == 0) {
return F_r8i;
} else if (cmp_nocase_uh(str, "rg8i") == 0 || cmp_nocase_uh(str, "r8g8i") == 0) {
return F_rg8i;
} else if (cmp_nocase_uh(str, "rgb8i") == 0 || cmp_nocase_uh(str, "r8g8b8i") == 0) {
return F_rgb8i;
} else if (cmp_nocase_uh(str, "rgba8i") == 0 || cmp_nocase_uh(str, "r8g8b8a8i") == 0) {
return F_rgba8i;
} else if (cmp_nocase(str, "r11g11b10") == 0) {
return F_r11_g11_b10;
} else if (cmp_nocase(str, "rgb9_e5") == 0) {
@ -2348,6 +2392,20 @@ string_format(const string &str) {
return F_rgb10_a2;
} else if (cmp_nocase_uh(str, "rg") == 0) {
return F_rg;
} else if (cmp_nocase_uh(str, "r16i") == 0) {
return F_r16i;
} else if (cmp_nocase_uh(str, "rg16i") == 0 || cmp_nocase_uh(str, "r16g16i") == 0) {
return F_rg16i;
} else if (cmp_nocase_uh(str, "rgb16i") == 0 || cmp_nocase_uh(str, "r16g16b16i") == 0) {
return F_rgb16i;
} else if (cmp_nocase_uh(str, "rgba16i") == 0 || cmp_nocase_uh(str, "r16g16b16a16i") == 0) {
return F_rgba16i;
} else if (cmp_nocase_uh(str, "rg32i") == 0 || cmp_nocase_uh(str, "r32g32i") == 0) {
return F_rg32i;
} else if (cmp_nocase_uh(str, "rgb32i") == 0 || cmp_nocase_uh(str, "r32g32b32i") == 0) {
return F_rgb32i;
} else if (cmp_nocase_uh(str, "rgba32i") == 0 || cmp_nocase_uh(str, "r32g32b32a32i") == 0) {
return F_rgba32i;
}
gobj_cat->error()
@ -2588,6 +2646,8 @@ has_alpha(Format format) {
case F_sluminance_alpha:
case F_rgba8i:
case F_rgb10_a2:
case F_rgba16i:
case F_rgba32i:
return true;
default:
@ -2640,6 +2700,12 @@ is_integer(Format format) {
case F_rgb8i:
case F_rgba8i:
case F_r16i:
case F_rg16i:
case F_rgb16i:
case F_rgba16i:
case F_rg32i:
case F_rgb32i:
case F_rgba32i:
return true;
default:
@ -3693,11 +3759,31 @@ do_read_dds(CData *cdata, istream &in, const string &filename, bool header_only)
component_type = T_unsigned_short;
func = read_dds_level_abgr16;
break;
case 12: // DXGI_FORMAT_R16G16B16A16_UINT
format = F_rgba16i;
component_type = T_unsigned_short;
func = read_dds_level_abgr16;
break;
case 14: // DXGI_FORMAT_R16G16B16A16_SINT
format = F_rgba16i;
component_type = T_short;
func = read_dds_level_abgr16;
break;
case 16: // DXGI_FORMAT_R32G32_FLOAT
format = F_rg32;
component_type = T_float;
func = read_dds_level_raw;
break;
case 17: // DXGI_FORMAT_R32G32_UINT
format = F_rg32i;
component_type = T_unsigned_int;
func = read_dds_level_raw;
break;
case 18: // DXGI_FORMAT_R32G32_SINT
format = F_rg32i;
component_type = T_int;
func = read_dds_level_raw;
break;
case 27: // DXGI_FORMAT_R8G8B8A8_TYPELESS
case 28: // DXGI_FORMAT_R8G8B8A8_UNORM
format = F_rgba8;
@ -3731,11 +3817,21 @@ do_read_dds(CData *cdata, istream &in, const string &filename, bool header_only)
component_type = T_unsigned_short;
func = read_dds_level_raw;
break;
case 36: // DXGI_FORMAT_R16G16_UINT:
format = F_rg16i;
component_type = T_unsigned_short;
func = read_dds_level_raw;
break;
case 37: // DXGI_FORMAT_R16G16_SNORM:
format = F_rg16;
component_type = T_short;
func = read_dds_level_raw;
break;
case 38: // DXGI_FORMAT_R16G16_SINT:
format = F_rg16i;
component_type = T_short;
func = read_dds_level_raw;
break;
case 40: // DXGI_FORMAT_D32_FLOAT
format = F_depth_component32;
component_type = T_float;
@ -4630,8 +4726,12 @@ do_read_ktx(CData *cdata, istream &in, const string &filename, bool header_only)
break;
case KTX_RG16I:
case KTX_RG16UI:
format = F_rg16i;
break;
case KTX_RG32I:
case KTX_RG32UI:
format = F_rg32i;
break;
default:
gobj_cat.error()
<< filename << " has unsupported RG integer format " << internal_format << "\n";
@ -4695,8 +4795,12 @@ do_read_ktx(CData *cdata, istream &in, const string &filename, bool header_only)
break;
case KTX_RGB16I:
case KTX_RGB16UI:
format = F_rgb16i;
break;
case KTX_RGB32I:
case KTX_RGB32UI:
format = F_rgb32i;
break;
default:
gobj_cat.error()
<< filename << " has unsupported RGB integer format " << internal_format << "\n";
@ -4758,8 +4862,12 @@ do_read_ktx(CData *cdata, istream &in, const string &filename, bool header_only)
break;
case KTX_RGBA16I:
case KTX_RGBA16UI:
format = F_rgba16i;
break;
case KTX_RGBA32I:
case KTX_RGBA32UI:
format = F_rgba32i;
break;
default:
gobj_cat.error()
<< filename << " has unsupported RGBA integer format " << internal_format << "\n";
@ -6896,6 +7004,8 @@ do_set_format(CData *cdata, Texture::Format format) {
case F_rg32:
case F_rg8i:
case F_rg:
case F_rg16i:
case F_rg32i:
cdata->_num_components = 2;
break;
@ -6910,6 +7020,8 @@ do_set_format(CData *cdata, Texture::Format format) {
case F_rgb8i:
case F_r11_g11_b10:
case F_rgb9_e5:
case F_rgb16i:
case F_rgb32i:
cdata->_num_components = 3;
break;
@ -6924,6 +7036,8 @@ do_set_format(CData *cdata, Texture::Format format) {
case F_srgb_alpha:
case F_rgba8i:
case F_rgb10_a2:
case F_rgba16i:
case F_rgba32i:
cdata->_num_components = 4;
break;
}

View File

@ -161,7 +161,15 @@ PUBLISHED:
F_rgb10_a2,
F_rg,
F_r16i
F_r16i,
F_rg16i,
F_rgb16i, // not recommended
F_rgba16i,
F_rg32i,
F_rgb32i,
F_rgba32i,
};
// Deprecated. See SamplerState.FilterType.

View File

@ -114,6 +114,7 @@ TexturePeeker(Texture *tex, Texture::CData *cdata) {
case Texture::F_r16:
case Texture::F_r32:
case Texture::F_r32i:
case Texture::F_r16i:
_get_texel = get_texel_r;
break;
@ -140,21 +141,27 @@ TexturePeeker(Texture *tex, Texture::CData *cdata) {
_get_texel = get_texel_la;
break;
case Texture::F_rg16:
case Texture::F_rg32:
case Texture::F_rg:
case Texture::F_rg8i:
case Texture::F_rg16:
case Texture::F_rg16i:
case Texture::F_rg32:
case Texture::F_rg32i:
_get_texel = get_texel_rg;
break;
case Texture::F_rgb:
case Texture::F_rgb5:
case Texture::F_rgb8:
case Texture::F_rgb8i:
case Texture::F_rgb12:
case Texture::F_rgb16:
case Texture::F_rgb16i:
case Texture::F_rgb332:
case Texture::F_r11_g11_b10:
case Texture::F_rgb9_e5:
case Texture::F_rgb32:
case Texture::F_rgb32i:
_get_texel = get_texel_rgb;
break;
@ -163,9 +170,12 @@ TexturePeeker(Texture *tex, Texture::CData *cdata) {
case Texture::F_rgba4:
case Texture::F_rgba5:
case Texture::F_rgba8:
case Texture::F_rgba8i:
case Texture::F_rgba12:
case Texture::F_rgba16:
case Texture::F_rgba16i:
case Texture::F_rgba32:
case Texture::F_rgba32i:
case Texture::F_rgb10_a2:
_get_texel = get_texel_rgba;
break;