diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 6a3b49cc53..86a0a3672a 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -7327,12 +7327,14 @@ get_external_image_format(Texture *tex) const { case Texture::F_rgba12: case Texture::F_rgba16: case Texture::F_rgba32: + case Texture::F_rgba8i: return GL_COMPRESSED_RGBA; case Texture::F_rgb: case Texture::F_rgb5: case Texture::F_rgba5: case Texture::F_rgb8: + case Texture::F_rgb8i: case Texture::F_rgb12: case Texture::F_rgb332: case Texture::F_rgb16: @@ -7345,11 +7347,13 @@ get_external_image_format(Texture *tex) const { case Texture::F_red: case Texture::F_green: case Texture::F_blue: + case Texture::F_r8i: case Texture::F_r16: case Texture::F_r32: case Texture::F_r32i: return GL_COMPRESSED_RED; + case Texture::F_rg8i: case Texture::F_rg16: case Texture::F_rg32: return GL_COMPRESSED_RG; @@ -7517,8 +7521,16 @@ get_external_image_format(Texture *tex) const { return GL_LUMINANCE_ALPHA; #ifndef OPENGLES + case Texture::F_r8i: case Texture::F_r32i: return GL_RED_INTEGER; + case Texture::F_rg8i: + return GL_RG_INTEGER; + case Texture::F_rgb8i: + return GL_RGB_INTEGER; + case Texture::F_rgba8i: + return GL_RGBA_INTEGER; + #endif } GLCAT.error() @@ -7565,6 +7577,10 @@ get_internal_image_format(Texture *tex, bool force_sized) const { case Texture::F_depth_component24: case Texture::F_depth_component32: case Texture::F_depth_stencil: + case Texture::F_r8i: + case Texture::F_rg8i: + case Texture::F_rgb8i: + case Texture::F_rgba8i: case Texture::F_r32i: // Unsupported; fall through to below. break; @@ -7840,6 +7856,30 @@ get_internal_image_format(Texture *tex, bool force_sized) const { #else case Texture::F_rgba8: return GL_RGBA8; + case Texture::F_r8i: + if (tex->get_component_type() == Texture::T_unsigned_byte) { + return GL_R8UI; + } else { + return GL_R8I; + } + case Texture::F_rg8i: + if (tex->get_component_type() == Texture::T_unsigned_byte) { + return GL_RG8UI; + } else { + return GL_RG8I; + } + case Texture::F_rgb8i: + if (tex->get_component_type() == Texture::T_unsigned_byte) { + return GL_RGB8UI; + } else { + return GL_RGB8I; + } + case Texture::F_rgba8i: + if (tex->get_component_type() == Texture::T_unsigned_byte) { + return GL_RGBA8UI; + } else { + return GL_RGBA8I; + } case Texture::F_rgba12: return GL_RGBA12; #endif // OPENGLES @@ -11261,6 +11301,36 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { case GL_R3_G3_B2: format = Texture::F_rgb332; break; + + case GL_R8I: + format = Texture::F_r8i; + break; + case GL_RG8I: + format = Texture::F_rg8i; + break; + case GL_RGB8I: + format = Texture::F_rgb8i; + break; + case GL_RGBA8I: + format = Texture::F_rgba8i; + break; + + case GL_R8UI: + type = Texture::T_unsigned_byte; + format = Texture::F_r8i; + break; + case GL_RG8UI: + type = Texture::T_unsigned_byte; + format = Texture::F_rg8i; + break; + case GL_RGB8UI: + type = Texture::T_unsigned_byte; + format = Texture::F_rgb8i; + break; + case GL_RGBA8UI: + type = Texture::T_unsigned_byte; + format = Texture::F_rgba8i; + break; #endif #ifndef OPENGLES_1 diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index b06d255993..b67fb9eae8 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -562,6 +562,8 @@ estimate_texture_memory() const { case Texture::F_rgb8: case Texture::F_rgba8: case Texture::F_srgb_alpha: + case Texture::F_rgb8i: + case Texture::F_rgba8i: bpp = 4; break; @@ -583,6 +585,8 @@ estimate_texture_memory() const { break; case Texture::F_r16: + case Texture::F_r8i: + case Texture::F_rg8i: bpp = 2; break; case Texture::F_rg16: diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index 22287f6330..c8e0571aea 100644 --- a/panda/src/gobj/texture.h +++ b/panda/src/gobj/texture.h @@ -146,6 +146,11 @@ PUBLISHED: F_r32, F_rg32, F_rgb32, + + F_r8i, // 8 integer bits per R channel + 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 }; // Deprecated. See SamplerState.FilterType.