diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index b552d1dec7..f1fafe212a 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/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: diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index 37bdce45c9..5ae858a926 100644 --- a/panda/src/gobj/texture.cxx +++ b/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; diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index 729f3671ec..adfc8258bd 100644 --- a/panda/src/gobj/texture.h +++ b/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.