diff --git a/android/filament-android/src/main/cpp/Texture.cpp b/android/filament-android/src/main/cpp/Texture.cpp index ff3fd36d26..f33a44de01 100644 --- a/android/filament-android/src/main/cpp/Texture.cpp +++ b/android/filament-android/src/main/cpp/Texture.cpp @@ -53,6 +53,14 @@ Java_com_google_android_filament_Texture_nIsTextureFormatSupported(JNIEnv*, jcla (Texture::InternalFormat) internalFormat); } +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Texture_nIsTextureFormatMipmappable(JNIEnv*, jclass, + jlong nativeEngine, jint internalFormat) { + Engine *engine = (Engine *) nativeEngine; + return (jboolean) Texture::isTextureFormatMipmappable(*engine, + (Texture::InternalFormat) internalFormat); +} + extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_Texture_nIsTextureSwizzleSupported(JNIEnv*, jclass, jlong nativeEngine) { diff --git a/android/filament-android/src/main/java/com/google/android/filament/Texture.java b/android/filament-android/src/main/java/com/google/android/filament/Texture.java index eaf81adc3c..525ebd423b 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Texture.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Texture.java @@ -653,6 +653,19 @@ public class Texture { return nIsTextureFormatSupported(engine.getNativeObject(), format.ordinal()); } + /** + * Checks whether a given texture format is supported for mipmapping in this {@link Engine}. + * This depends on the selected backend. + * + * @param engine {@link Engine} to test the {@link InternalFormat InternalFormat} against + * @param format format to check + * @return true if this format is supported for texturing. + */ + public static boolean isTextureFormatMipmappable(@NonNull Engine engine, + @NonNull InternalFormat format) { + return nIsTextureFormatMipmappable(engine.getNativeObject(), format.ordinal()); + } + /** * Checks whether texture swizzling is supported in this {@link Engine}. * This depends on the selected backend. @@ -1260,6 +1273,7 @@ public class Texture { } private static native boolean nIsTextureFormatSupported(long nativeEngine, int internalFormat); + private static native boolean nIsTextureFormatMipmappable(long nativeEngine, int internalFormat); private static native boolean nIsTextureSwizzleSupported(long nativeEngine); private static native long nCreateBuilder(); diff --git a/filament/include/filament/Texture.h b/filament/include/filament/Texture.h index 62ab509435..a4a5e5fb81 100644 --- a/filament/include/filament/Texture.h +++ b/filament/include/filament/Texture.h @@ -91,6 +91,9 @@ public: /** @return Whether a backend supports a particular format. */ static bool isTextureFormatSupported(Engine& engine, InternalFormat format) noexcept; + /** @return Whether a backend supports mipmapping of a particular format. */ + static bool isTextureFormatMipmappable(Engine& engine, InternalFormat format) noexcept; + /** @return Whether this backend supports protected textures. */ static bool isProtectedTexturesSupported(Engine& engine) noexcept; diff --git a/filament/src/Texture.cpp b/filament/src/Texture.cpp index d3f53e8ea9..29d417349e 100644 --- a/filament/src/Texture.cpp +++ b/filament/src/Texture.cpp @@ -82,6 +82,10 @@ bool Texture::isTextureFormatSupported(Engine& engine, InternalFormat const form return FTexture::isTextureFormatSupported(downcast(engine), format); } +bool Texture::isTextureFormatMipmappable(Engine& engine, InternalFormat const format) noexcept { + return FTexture::isTextureFormatMipmappable(downcast(engine), format); +} + bool Texture::isProtectedTexturesSupported(Engine& engine) noexcept { return FTexture::isProtectedTexturesSupported(downcast(engine)); } diff --git a/filament/src/details/Texture.cpp b/filament/src/details/Texture.cpp index 4d2675dace..d018f3800f 100644 --- a/filament/src/details/Texture.cpp +++ b/filament/src/details/Texture.cpp @@ -658,6 +658,10 @@ bool FTexture::isTextureFormatSupported(FEngine& engine, InternalFormat const fo return engine.getDriverApi().isTextureFormatSupported(format); } +bool FTexture::isTextureFormatMipmappable(FEngine& engine, InternalFormat const format) noexcept { + return engine.getDriverApi().isTextureFormatMipmappable(format); +} + bool FTexture::isProtectedTexturesSupported(FEngine& engine) noexcept { return engine.getDriverApi().isProtectedTexturesSupported(); } diff --git a/filament/src/details/Texture.h b/filament/src/details/Texture.h index ad0064b52c..7e463e7834 100644 --- a/filament/src/details/Texture.h +++ b/filament/src/details/Texture.h @@ -89,6 +89,9 @@ public: // Synchronous call to the backend. Returns whether a backend supports a particular format. static bool isTextureFormatSupported(FEngine& engine, InternalFormat format) noexcept; + // Synchronous call to the backend. Returns whether a backend supports mipmapping of a particular format. + static bool isTextureFormatMipmappable(FEngine& engine, InternalFormat format) noexcept; + // Synchronous call to the backend. Returns whether a backend supports protected textures. static bool isProtectedTexturesSupported(FEngine& engine) noexcept; diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 26138d7a7a..9601df46dd 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -1453,6 +1453,7 @@ class_("TextureSampler") /// Texture ::core class:: 2D image or cubemap that can be sampled by the GPU, possibly mipmapped. class_("Texture") .class_function("Builder", (TexBuilder (*)()) [] { return TexBuilder(); }) + .class_function("isTextureFormatMipmappable", &Texture::isTextureFormatMipmappable) .function("generateMipmaps", &Texture::generateMipmaps) .function("_setImage", EMBIND_LAMBDA(void, (Texture* self, Engine* engine, uint8_t level, PixelBufferDescriptor pbd), {