From 1fda6e7d516398dfd45f8316c9acca685701e95a Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 17 Jan 2021 13:11:30 +0100 Subject: [PATCH] texture: Add missing integer texture formats --- panda/src/gles2gsg/gles2gsg.h | 24 +++ .../glstuff/glGraphicsStateGuardian_src.cxx | 140 ++++++++++++++++-- panda/src/gobj/texture.cxx | 138 +++++++++++++++-- panda/src/gobj/texture.h | 10 +- panda/src/gobj/texturePeeker.cxx | 14 +- 5 files changed, 297 insertions(+), 29 deletions(-) diff --git a/panda/src/gles2gsg/gles2gsg.h b/panda/src/gles2gsg/gles2gsg.h index 729ee6e589..c328c99ac4 100644 --- a/panda/src/gles2gsg/gles2gsg.h +++ b/panda/src/gles2gsg/gles2gsg.h @@ -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 diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 38f6ccb24f..2ee90887c7 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -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: diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index a5658c8146..8d4756fee4 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -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; } diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index af96f49d1d..86ca58fe02 100644 --- a/panda/src/gobj/texture.h +++ b/panda/src/gobj/texture.h @@ -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. diff --git a/panda/src/gobj/texturePeeker.cxx b/panda/src/gobj/texturePeeker.cxx index ece87f36a5..03d9bff39d 100644 --- a/panda/src/gobj/texturePeeker.cxx +++ b/panda/src/gobj/texturePeeker.cxx @@ -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;