The open source OpenXR runtime

a/android: Add supported display refresh rates in xrt_android_display_metrics

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/1786>

authored by

Zhongwang Zhang and committed by
Rylie Pavlik
40292330 bb2b9e64

+57
+6
src/xrt/auxiliary/android/android_custom_surface.cpp
··· 218 218 U_LOG_W("Could not get refresh rate, returning 60hz"); 219 219 displayRefreshRate = 60.0f; 220 220 } 221 + std::vector<float> supported_refresh_rates = 222 + MonadoView::getSupportedRefreshRates(Context((jobject)context)); 221 223 222 224 struct xrt_android_display_metrics metrics = { 223 225 .width_pixels = displayMetrics.get<int>("widthPixels"), ··· 228 230 .xdpi = displayMetrics.get<float>("density"), 229 231 .ydpi = displayMetrics.get<float>("scaledDensity"), 230 232 .refresh_rate = displayRefreshRate, 233 + .refresh_rate_count = (uint32_t)supported_refresh_rates.size(), 231 234 }; 235 + for (int i = 0; i < (int)metrics.refresh_rate_count; ++i) { 236 + metrics.refresh_rates[i] = supported_refresh_rates[i]; 237 + } 232 238 233 239 *out_metrics = metrics; 234 240
+3
src/xrt/auxiliary/android/android_custom_surface.h
··· 11 11 #pragma once 12 12 13 13 #include <xrt/xrt_config_os.h> 14 + #include <xrt/xrt_limits.h> 14 15 15 16 #ifdef XRT_OS_ANDROID 16 17 ··· 33 34 float xdpi; 34 35 float ydpi; 35 36 float refresh_rate; 37 + float refresh_rates[XRT_MAX_SUPPORTED_REFRESH_RATES]; 38 + uint32_t refresh_rate_count; 36 39 }; 37 40 38 41 /*!
+2
src/xrt/auxiliary/android/org.freedesktop.monado.auxiliary.cpp
··· 24 24 "(Landroid/content/Context;)Landroid/util/DisplayMetrics;")), 25 25 getDisplayRefreshRate( 26 26 classRef().getStaticMethod("getDisplayRefreshRate", "(Landroid/content/Context;)F")), 27 + getSupportedRefreshRates( 28 + classRef().getStaticMethod("getSupportedRefreshRates", "(Landroid/content/Context;)[F")), 27 29 getNativePointer(classRef().getMethod("getNativePointer", "()J")), 28 30 markAsDiscardedByNative(classRef().getMethod("markAsDiscardedByNative", "()V")), 29 31 waitGetSurfaceHolder(classRef().getMethod("waitGetSurfaceHolder", "(I)Landroid/view/SurfaceHolder;")),
+13
src/xrt/auxiliary/android/org.freedesktop.monado.auxiliary.hpp
··· 138 138 int32_t displayModeId); 139 139 140 140 /*! 141 + * Wrapper for the getSupportedRefreshRates static method 142 + * 143 + * Java prototype: 144 + * `public static float[] getSupportedRefreshRates(android.content.Context);` 145 + * 146 + * JNI signature: (Landroid/content/Context;)[F; 147 + * 148 + */ 149 + static std::vector<float> 150 + getSupportedRefreshRates(android::content::Context const &context); 151 + 152 + /*! 141 153 * Wrapper for the getNativePointer method 142 154 * 143 155 * Java prototype: ··· 192 204 jni::method_t removeFromWindow; 193 205 jni::method_t getDisplayMetrics; 194 206 jni::method_t getDisplayRefreshRate; 207 + jni::method_t getSupportedRefreshRates; 195 208 jni::method_t getNativePointer; 196 209 jni::method_t markAsDiscardedByNative; 197 210 jni::method_t waitGetSurfaceHolder;
+16
src/xrt/auxiliary/android/org.freedesktop.monado.auxiliary.impl.hpp
··· 13 13 #include "wrap/android.app.h" 14 14 #include "wrap/android.content.h" 15 15 #include "wrap/android.view.h" 16 + #include <vector> 16 17 17 18 18 19 namespace wrap { ··· 61 62 { 62 63 return Meta::data().clazz().call<int32_t>(Meta::data().getDisplayModeIdHeight, displayContext.object(), 63 64 displayId, displayModeId); 65 + } 66 + 67 + inline std::vector<float> 68 + MonadoView::getSupportedRefreshRates(android::content::Context const &context) 69 + { 70 + jni::Object refreshRateArray = 71 + Meta::data().clazz().call<jni::Object>(Meta::data().getSupportedRefreshRates, context.object()); 72 + jfloat *refreshRates = 73 + (jfloat *)jni::env()->GetFloatArrayElements((jfloatArray)refreshRateArray.getHandle(), 0); 74 + jsize length = jni::env()->GetArrayLength((jfloatArray)refreshRateArray.getHandle()); 75 + std::vector<float> refreshRateVector; 76 + for (int i = 0; i < length; i++) { 77 + refreshRateVector.push_back(refreshRates[i]); 78 + } 79 + return refreshRateVector; 64 80 } 65 81 66 82 inline void *
+17
src/xrt/auxiliary/android/src/main/java/org/freedesktop/monado/auxiliary/MonadoView.java
··· 25 25 import androidx.annotation.Keep; 26 26 import androidx.annotation.NonNull; 27 27 import androidx.annotation.Nullable; 28 + import java.util.TreeSet; 28 29 29 30 @Keep 30 31 public class MonadoView extends SurfaceView ··· 192 193 return modes[displayModeId].getPhysicalHeight(); 193 194 } 194 195 return 0; 196 + } 197 + 198 + @Keep 199 + public static float[] getSupportedRefreshRates(@NonNull Context context) { 200 + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 201 + TreeSet<Float> rateSet = new TreeSet<>(); 202 + Display.Mode[] modes = wm.getDefaultDisplay().getSupportedModes(); 203 + for (Display.Mode mode : modes) { 204 + rateSet.add(mode.getRefreshRate()); 205 + } 206 + float[] rates = new float[rateSet.size()]; 207 + int i = 0; 208 + for (Float f : rateSet) { 209 + rates[i++] = f; 210 + } 211 + return rates; 195 212 } 196 213 197 214 @Keep