From 4e6ae2b71412e4412470631ef96f7e70cc0778f5 Mon Sep 17 00:00:00 2001 From: Sungun Park Date: Wed, 14 Feb 2024 04:40:30 +0000 Subject: [PATCH] Add stereoscopic type to Engine::Config (#7574) * Add stereoscopic type to Engine::Config This new type value will determine the algorithm used when stereoscopic rendering is enabled. --- .../filament-android/src/main/cpp/Engine.cpp | 3 +- .../com/google/android/filament/Engine.java | 28 +++++++++++++++++-- .../backend/include/backend/DriverEnums.h | 8 ++++++ filament/include/filament/Engine.h | 14 ++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) 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).