Browse Source

texture: Add missing integer texture formats

rdb 4 years ago
parent
commit
1fda6e7d51

+ 24 - 0
panda/src/gles2gsg/gles2gsg.h

@@ -156,6 +156,18 @@ typedef char GLchar;
 #define GL_TEXTURE_MAX_LEVEL 0x813D
 #define GL_TEXTURE_MAX_LEVEL 0x813D
 #define GL_NUM_EXTENSIONS 0x821D
 #define GL_NUM_EXTENSIONS 0x821D
 #define GL_RG_INTEGER 0x8228
 #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_RETRIEVABLE_HINT 0x8257
 #define GL_PROGRAM_BINARY_LENGTH 0x8741
 #define GL_PROGRAM_BINARY_LENGTH 0x8741
 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
@@ -196,6 +208,18 @@ typedef char GLchar;
 #define GL_SRGB8 0x8C41
 #define GL_SRGB8 0x8C41
 #define GL_SRGB8_ALPHA8 0x8C43
 #define GL_SRGB8_ALPHA8 0x8C43
 #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
 #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_RED_INTEGER 0x8D94
 #define GL_RGB_INTEGER 0x8D98
 #define GL_RGB_INTEGER 0x8D98
 #define GL_RGBA_INTEGER 0x8D99
 #define GL_RGBA_INTEGER 0x8D99

+ 126 - 14
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

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

+ 126 - 12
panda/src/gobj/texture.cxx

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

+ 9 - 1
panda/src/gobj/texture.h

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

+ 11 - 1
panda/src/gobj/texturePeeker.cxx

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