diff --git a/android/filament-android/src/main/cpp/Engine.cpp b/android/filament-android/src/main/cpp/Engine.cpp
index 05893cbd5b..9a2180e022 100644
--- a/android/filament-android/src/main/cpp/Engine.cpp
+++ b/android/filament-android/src/main/cpp/Engine.cpp
@@ -484,7 +484,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBu
extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBuilderConfig(JNIEnv*,
jclass, jlong nativeBuilder, jlong commandBufferSizeMB, jlong perRenderPassArenaSizeMB,
jlong driverHandleArenaSizeMB, jlong minCommandBufferSizeMB, jlong perFrameCommandsSizeMB,
- jlong jobSystemThreadCount, jlong stereoscopicEyeCount,
+ jlong jobSystemThreadCount, jint stereoscopicType, jlong stereoscopicEyeCount,
jlong resourceAllocatorCacheSizeMB, jlong resourceAllocatorCacheMaxAge) {
Engine::Builder* builder = (Engine::Builder*) nativeBuilder;
Engine::Config config = {
@@ -494,6 +494,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBu
.minCommandBufferSizeMB = (uint32_t) minCommandBufferSizeMB,
.perFrameCommandsSizeMB = (uint32_t) perFrameCommandsSizeMB,
.jobSystemThreadCount = (uint32_t) jobSystemThreadCount,
+ .stereoscopicType = (Engine::StereoscopicType) stereoscopicType,
.stereoscopicEyeCount = (uint8_t) stereoscopicEyeCount,
.resourceAllocatorCacheSizeMB = (uint32_t) resourceAllocatorCacheSizeMB,
.resourceAllocatorCacheMaxAge = (uint8_t) resourceAllocatorCacheMaxAge,
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 6b4647e2ac..393b711ac9 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
@@ -158,6 +158,16 @@ public class Engine {
FEATURE_LEVEL_3,
};
+ /**
+ * The type of technique for stereoscopic rendering
+ */
+ public enum StereoscopicType {
+ /** Stereoscopic rendering is performed using instanced rendering technique. */
+ INSTANCED,
+ /** Stereoscopic rendering is performed using the multiview feature from the graphics backend. */
+ MULTIVIEW,
+ };
+
/**
* Constructs Engine objects using a builder pattern.
*/
@@ -211,7 +221,8 @@ public class Engine {
nSetBuilderConfig(mNativeBuilder, config.commandBufferSizeMB,
config.perRenderPassArenaSizeMB, config.driverHandleArenaSizeMB,
config.minCommandBufferSizeMB, config.perFrameCommandsSizeMB,
- config.jobSystemThreadCount, config.stereoscopicEyeCount,
+ config.jobSystemThreadCount,
+ config.stereoscopicType.ordinal(), config.stereoscopicEyeCount,
config.resourceAllocatorCacheSizeMB, config.resourceAllocatorCacheMaxAge);
return this;
}
@@ -349,6 +360,19 @@ public class Engine {
*/
public long jobSystemThreadCount = 0;
+ /**
+ * The type of technique for stereoscopic rendering.
+ *
+ * This setting determines the algorithm used when stereoscopic rendering is enabled. This
+ * decision applies to the entire Engine for the lifetime of the Engine. E.g., multiple
+ * Views created from the Engine must use the same stereoscopic type.
+ *
+ * Each view can enable stereoscopic rendering via the StereoscopicOptions::enable flag.
+ *
+ * @see View#setStereoscopicOptions
+ */
+ public StereoscopicType stereoscopicType = StereoscopicType.INSTANCED;
+
/**
* The number of eyes to render when stereoscopic rendering is enabled. Supported values are
* between 1 and Engine#getMaxStereoscopicEyes() (inclusive).
@@ -1240,7 +1264,7 @@ public class Engine {
private static native void nSetBuilderConfig(long nativeBuilder, long commandBufferSizeMB,
long perRenderPassArenaSizeMB, long driverHandleArenaSizeMB,
long minCommandBufferSizeMB, long perFrameCommandsSizeMB, long jobSystemThreadCount,
- long stereoscopicEyeCount,
+ int stereoscopicType, long stereoscopicEyeCount,
long resourceAllocatorCacheSizeMB, long resourceAllocatorCacheMaxAge);
private static native void nSetBuilderFeatureLevel(long nativeBuilder, int ordinal);
private static native void nSetBuilderSharedContext(long nativeBuilder, long sharedContext);
diff --git a/filament/backend/include/backend/DriverEnums.h b/filament/backend/include/backend/DriverEnums.h
index aba2b40414..c41d1b8304 100644
--- a/filament/backend/include/backend/DriverEnums.h
+++ b/filament/backend/include/backend/DriverEnums.h
@@ -1212,6 +1212,14 @@ enum class Workaround : uint16_t {
DISABLE_THREAD_AFFINITY
};
+//! The type of technique for stereoscopic rendering
+enum class StereoscopicType : uint8_t {
+ // Stereoscopic rendering is performed using instanced rendering technique.
+ INSTANCED,
+ // Stereoscopic rendering is performed using the multiview feature from the graphics backend.
+ MULTIVIEW,
+};
+
} // namespace filament::backend
template<> struct utils::EnableBitMaskOperators
diff --git a/filament/include/filament/Engine.h b/filament/include/filament/Engine.h
index 904cbda4a3..90cff6283d 100644
--- a/filament/include/filament/Engine.h
+++ b/filament/include/filament/Engine.h
@@ -178,6 +178,7 @@ public:
using Backend = backend::Backend;
using DriverConfig = backend::Platform::DriverConfig;
using FeatureLevel = backend::FeatureLevel;
+ using StereoscopicType = backend::StereoscopicType;
/**
* Config is used to define the memory footprint used by the engine, such as the
@@ -297,6 +298,19 @@ public:
*/
size_t textureUseAfterFreePoolSize = 0;
+ /*
+ * The type of technique for stereoscopic rendering.
+ *
+ * This setting determines the algorithm used when stereoscopic rendering is enabled. This
+ * decision applies to the entire Engine for the lifetime of the Engine. E.g., multiple
+ * Views created from the Engine must use the same stereoscopic type.
+ *
+ * Each view can enable stereoscopic rendering via the StereoscopicOptions::enable flag.
+ *
+ * @see View::setStereoscopicOptions
+ */
+ StereoscopicType stereoscopicType = StereoscopicType::INSTANCED;
+
/*
* The number of eyes to render when stereoscopic rendering is enabled. Supported values are
* between 1 and Engine::getMaxStereoscopicEyes() (inclusive).