Browse Source

Add Texture::F_r11_g11_b10

tobspr 10 years ago
parent
commit
9868d87196

+ 15 - 0
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -7763,6 +7763,7 @@ get_external_image_format(Texture *tex) const {
       case Texture::F_depth_component24:
       case Texture::F_depth_component32:
       case Texture::F_depth_stencil:
+      case Texture::F_r11_g11_b10:
         // This shouldn't be possible.
         nassertr(false, GL_RGB);
         break;
@@ -7946,6 +7947,7 @@ get_external_image_format(Texture *tex) const {
   case Texture::F_rgb16:
   case Texture::F_rgb32:
   case Texture::F_srgb:
+  case Texture::F_r11_g11_b10:
 #ifdef OPENGLES
     return GL_RGB;
 #else
@@ -8044,6 +8046,7 @@ get_internal_image_format(Texture *tex, bool force_sized) const {
       case Texture::F_rgb8i:
       case Texture::F_rgba8i:
       case Texture::F_r32i:
+      case Texture::F_r11_g11_b10:
         // Unsupported; fall through to below.
         break;
 
@@ -8536,6 +8539,11 @@ get_internal_image_format(Texture *tex, bool force_sized) const {
     return GL_R32I;
 #endif
 
+#ifndef OPENGLES
+  case Texture::F_r11_g11_b10:
+    return GL_R11F_G11F_B10F;
+#endif
+
   default:
     GLCAT.error()
       << "Invalid image format in get_internal_image_format(): "
@@ -12105,6 +12113,13 @@ do_extract_texture_data(CLP(TextureContext) *gtc) {
     break;
 #endif
 
+#ifndef OPENGLES
+  case GL_R11F_G11F_B10F:
+    type = Texture::T_float;
+    format = Texture::F_r11_g11_b10;
+    break;
+#endif
+
 #ifdef OPENGLES_2
   case GL_RED_EXT:
   case GL_R8_EXT:

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

@@ -577,6 +577,10 @@ estimate_texture_memory() const {
     bpp = 12;
     break;
 
+  case Texture::F_r11_g11_b10:
+    bpp = 4;
+    break;
+
   default:
     break;
   }
@@ -1701,6 +1705,9 @@ write(ostream &out, int indent_level) const {
   case F_rgba8i:
     out << "rgba8i";
     break;
+  case F_r11_g11_b10:
+    out << "r11_g11_b10";
+    break;
   }
 
   if (cdata->_compression != CM_default) {
@@ -2115,6 +2122,8 @@ format_format(Format format) {
     return "rgb8i";
   case F_rgba8i:
     return "rgba8i";
+  case F_r11_g11_b10:
+    return "r11g11b10";
   }
   return "**invalid**";
 }
@@ -2201,6 +2210,8 @@ 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(str, "r11g11b10") == 0) {
+    return F_r11_g11_b10;
   }
 
   gobj_cat->error()
@@ -5181,6 +5192,7 @@ do_set_format(CData *cdata, Texture::Format format) {
   case F_srgb:
   case F_rgb32:
   case F_rgb8i:
+  case F_r11_g11_b10:
     cdata->_num_components = 3;
     break;
 

+ 3 - 0
panda/src/gobj/texture.h

@@ -156,6 +156,9 @@ PUBLISHED:
     F_rg8i, // 8 integer bits per R,G channel
     F_rgb8i, // 8 integer bits per R,G,B channel
     F_rgba8i, // 8 integer bits per R,G,B,A channel
+
+    F_r11_g11_b10, // unsigned floating-point, 11 Red, 11 Green, 10 Blue Bits
+
   };
 
   // Deprecated.  See SamplerState.FilterType.