diff --git a/android/filament-android/src/main/cpp/Engine.cpp b/android/filament-android/src/main/cpp/Engine.cpp index e508e4a614..a895e989f0 100644 --- a/android/filament-android/src/main/cpp/Engine.cpp +++ b/android/filament-android/src/main/cpp/Engine.cpp @@ -44,6 +44,13 @@ extern "C" { extern void *getNativeWindow(JNIEnv *env, jclass, jobject surface); } +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_Engine_nGetBackend(JNIEnv* env, + jclass klass, jlong nativeEngine) { + Engine* engine = (Engine*) nativeEngine; + return (jlong) engine->getBackend(); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_Engine_nCreateSwapChain(JNIEnv* env, jclass klass, jlong nativeEngine, jobject surface, jlong flags) { diff --git a/android/filament-android/src/main/java/com/google/android/filament/Engine.java b/android/filament-android/src/main/java/com/google/android/filament/Engine.java index a04e92c4d8..ff603f1ede 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Engine.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Engine.java @@ -77,6 +77,10 @@ public class Engine { clearNativeObject(); } + public Backend getBackend() { + return Backend.values()[(int) nGetBackend(getNativeObject())]; + } + // SwapChain /** @@ -279,6 +283,7 @@ public class Engine { private static native long nCreateEngine(long backend, long sharedContext); private static native void nDestroyEngine(long nativeEngine); + private static native long nGetBackend(long nativeEngine); private static native long nCreateSwapChain(long nativeEngine, Object nativeWindow, long flags); private static native long nCreateSwapChainFromRawPointer(long nativeEngine, long pointer, long flags); private static native void nDestroySwapChain(long nativeEngine, long nativeSwapChain); diff --git a/filament/include/filament/Engine.h b/filament/include/filament/Engine.h index f2f097f9ba..f662e1d861 100644 --- a/filament/include/filament/Engine.h +++ b/filament/include/filament/Engine.h @@ -321,6 +321,10 @@ public: */ const Material* getDefaultMaterial() const noexcept; + /** + * Returns the resolved backend. + */ + Backend getBackend() const noexcept; /** * Allocate a small amount of memory directly in the command stream. The allocated memory is diff --git a/filament/src/Engine.cpp b/filament/src/Engine.cpp index ad27b32866..a075fc505f 100644 --- a/filament/src/Engine.cpp +++ b/filament/src/Engine.cpp @@ -817,6 +817,10 @@ const Material* Engine::getDefaultMaterial() const noexcept { return upcast(this)->getDefaultMaterial(); } +Backend Engine::getBackend() const noexcept { + return upcast(this)->getBackend(); +} + Renderer* Engine::createRenderer() noexcept { return upcast(this)->createRenderer(); } diff --git a/libs/gltfio/src/MaterialGenerator.cpp b/libs/gltfio/src/MaterialGenerator.cpp index c111763f91..1813014a87 100644 --- a/libs/gltfio/src/MaterialGenerator.cpp +++ b/libs/gltfio/src/MaterialGenerator.cpp @@ -171,6 +171,21 @@ static Material* createMaterial(Engine* engine, const MaterialKey& config, const .material(shader.c_str()) .doubleSided(config.doubleSided); + switch (engine->getBackend()) { + case Engine::Backend::OPENGL: + builder.targetApi(MaterialBuilder::TargetApi::OPENGL); + break; + case Engine::Backend::VULKAN: + builder.targetApi(MaterialBuilder::TargetApi::VULKAN); + break; + case Engine::Backend::METAL: + builder.targetApi(MaterialBuilder::TargetApi::METAL); + break; + default: + slog.e << "Unresolved backend, unable to use filamat." << io::endl; + return nullptr; + } + static_assert(std::tuple_size::value == 8, "Badly sized uvset."); int numTextures = std::max({ uvmap[0], uvmap[1], uvmap[2], uvmap[3],