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), {