diff --git a/android/filament-android/src/main/cpp/Texture.cpp b/android/filament-android/src/main/cpp/Texture.cpp
index f33a44de01..cac8d94d87 100644
--- a/android/filament-android/src/main/cpp/Texture.cpp
+++ b/android/filament-android/src/main/cpp/Texture.cpp
@@ -68,6 +68,16 @@ Java_com_google_android_filament_Texture_nIsTextureSwizzleSupported(JNIEnv*, jcl
return (jboolean) Texture::isTextureSwizzleSupported(*engine);
}
+extern "C" JNIEXPORT jboolean JNICALL
+Java_com_google_android_filament_Texture_nValidatePixelFormatAndType(JNIEnv*, jclass,
+ jint internalFormat, jint pixelDataFormat, jint pixelDataType) {
+ return (jboolean) Texture::validatePixelFormatAndType(
+ (Texture::InternalFormat) internalFormat,
+ (Texture::Format) pixelDataFormat,
+ (Texture::Type) pixelDataType
+ );
+}
+
// Texture::Builder...
extern "C" JNIEXPORT jlong JNICALL
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 525ebd423b..ce6ea537d3 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
@@ -677,6 +677,20 @@ public class Texture {
return nIsTextureSwizzleSupported(engine.getNativeObject());
}
+ /**
+ * Checks whether a given combination of texture format, pixel data and type is valid.
+ *
+ * @param internalFormat texture format
+ * @param pixelDataFormat pixel data format
+ * @param pixelDataType pixel data type
+ * @return true if the combination is valid
+ */
+ public static boolean validatePixelFormatAndType(@NonNull InternalFormat internalFormat,
+ @NonNull Format pixelDataFormat, @NonNull Type pixelDataType) {
+ return nValidatePixelFormatAndType(internalFormat.ordinal(), pixelDataFormat.ordinal(),
+ pixelDataType.ordinal());
+ }
+
/**
* Use Builder to construct a Texture object instance.
*/
@@ -1276,6 +1290,9 @@ public class Texture {
private static native boolean nIsTextureFormatMipmappable(long nativeEngine, int internalFormat);
private static native boolean nIsTextureSwizzleSupported(long nativeEngine);
+ private static native boolean nValidatePixelFormatAndType(long internalFormat, long pixelDataFormat,
+ long pixelDataType);
+
private static native long nCreateBuilder();
private static native void nDestroyBuilder(long nativeBuilder);
diff --git a/filament/include/filament/Texture.h b/filament/include/filament/Texture.h
index a4a5e5fb81..caac008472 100644
--- a/filament/include/filament/Texture.h
+++ b/filament/include/filament/Texture.h
@@ -103,6 +103,8 @@ public:
static size_t computeTextureDataSize(Format format, Type type,
size_t stride, size_t height, size_t alignment) noexcept;
+ /** @return Whether a combination of texture format, pixel format and type is valid. */
+ static bool validatePixelFormatAndType(InternalFormat internalFormat, Format format, Type type) noexcept;
/**
* Options for environment prefiltering into reflection map
diff --git a/filament/src/Texture.cpp b/filament/src/Texture.cpp
index 29d417349e..02086855a6 100644
--- a/filament/src/Texture.cpp
+++ b/filament/src/Texture.cpp
@@ -104,4 +104,8 @@ void Texture::generatePrefilterMipmap(Engine& engine, PixelBufferDescriptor&& bu
downcast(this)->generatePrefilterMipmap(downcast(engine), std::move(buffer), faceOffsets, options);
}
+bool Texture::validatePixelFormatAndType(InternalFormat internalFormat, Format format, Type type) noexcept {
+ return FTexture::validatePixelFormatAndType(internalFormat, format, type);
+}
+
} // namespace filament
diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp
index 9601df46dd..aa6e6d890a 100644
--- a/web/filament-js/jsbindings.cpp
+++ b/web/filament-js/jsbindings.cpp
@@ -1454,6 +1454,7 @@ class_("TextureSampler")
class_("Texture")
.class_function("Builder", (TexBuilder (*)()) [] { return TexBuilder(); })
.class_function("isTextureFormatMipmappable", &Texture::isTextureFormatMipmappable)
+ .class_function("validatePixelFormatAndType", &Texture::validatePixelFormatAndType)
.function("generateMipmaps", &Texture::generateMipmaps)
.function("_setImage", EMBIND_LAMBDA(void, (Texture* self,
Engine* engine, uint8_t level, PixelBufferDescriptor pbd), {