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