Repository: godotengine/godot (language: cpp)

Issue:
Android rotating screen more than once causes a crash
### Tested versions

Reproducible in:  4.4.dev4, 4.4.dev5, 4.4.beta, 4.4.rc1
Not reproducible in: 4.4.dev3, 4.4.dev1, 4.3.stable
Regression starting in 4.4.dev4 and still present in current 4.4.rc1

### System information

Android 14, Rendering: Forward Mobile Vulkan 1.1.128, GPU:Qualcomm Adreno 619, Hardware: Motorola One 5G Ace

### Issue description

Rotating the phone screen more than once causes the exported game/app to crash on Android. Expected to be able to rotate the screen more than once in any direction without crashing.


### Steps to reproduce

Create a new empty project, Set Project>Project Settings>Display>Window>Handheld>Orientation>Sensor.
Export the project to Android and run.
Rotate the screen once than rotate it again (crash).

### Minimal reproduction project (MRP)

N/A. Reproducible in a new project with Display Orientation set to Sensor on Android.


Discussion / hints:
CC @godotengine/android 

From the 4.4-dev4 changelog, #98709 sounds related, but I didn't bisect or test a local revert to confirm.
I could not reproduce it: [OrientationTest.zip](https://github.com/user-attachments/files/18972336/OrientationTest.zip)

```
Godot Engine v4.4.beta4.official.93d270693 - https://godotengine.org
Vulkan 1.1.128 - Forward Mobile - Using Device #0: Qualcomm - Adreno (TM) 650
```

@brycehenley Is my test project working for you?
I also can't reproduce this issue.

Godot v4.4.rc (394508d26) - Android - Single-window, 1 monitor - OpenGL ES 3 (Compatibility) - Adreno (TM) 613
@Alex2782 I can reproduce the issue in your test project. It crashes on the second rotation for both using the sensor and selecting an orientation while using the Forward Mobile Vulkan rendering. Setting it to Compatibility OpenGL ES 3 it rotates as normal without crashing.
I tested it on a much older handset Android 8.0 LG V20 GPU:Qualcomm Adreno 530 Forward Mobile Vulkan 1.0.61 and it rotates without crashing on that device.
`adb logcat > logs.txt` _(Zip the file and upload it here)_

Perhaps we can identify the cause in the logcat protocols. But for this you would have to activate developer mode on your smartphone and connect it with a USB cable. _(Then you could also start the apps directly with Godot Editor via remote debug.)_ 

Are you already familiar with this?
[logs.zip](https://github.com/user-attachments/files/18973258/logs.zip)

Yes I am familiar with it. Here is the adb logcat dump. Let me know if you need anything else.
The following error message looks suspicious in the init process, but I'm not sure if it has anything to do with it.
`ERROR: A queue family with the requested bits could not be found.`

<details><summary>Logcat at start/init</summary>

```java
02-25 15:08:01.131 23756 23818 I godot   : Vulkan 1.1.128 - Forward Mobile - Using Device #0: Qualcomm - Adreno (TM) 619
02-25 15:08:01.132 23756 23818 E godot   : ERROR: A queue family with the requested bits could not be found.
02-25 15:08:01.132 23756 23818 E godot   :    at: command_queue_family_get (drivers/vulkan/rendering_device_driver_vulkan.cpp:2395)
02-25 15:08:01.133 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x38
02-25 15:08:01.133 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:01.133 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:01.133 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:01.133 23756 23818 E Gralloc4: isSupported(1, 1, 56, 1, ...) failed with 1
...
02-25 15:08:01.134 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1
02-25 15:08:01.134 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:01.134 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:01.134 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:01.134 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:01.134 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:01.134 23756 23818 E Gralloc4: isSupported(1, 1, 59, 1, ...) failed with 1
...
02-25 15:08:01.134 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1
02-25 15:08:01.134 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:01.134 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:01.134 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:01.134 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:01.134 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:01.134 23756 23818 E Gralloc4: isSupported(1, 1, 59, 1, ...) failed with 1
...
02-25 15:08:01.137 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1
02-25 15:08:01.137 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:01.137 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:01.137 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:01.137 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:01.137 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:01.137 23756 23818 E Gralloc4: isSupported(1, 1, 59, 1, ...) failed with 1
...
02-25 15:08:01.137 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1
02-25 15:08:01.137 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
```

</details>


['gpu-compare' with motorola razr 50 ultra](https://vulkan.gpuinfo.org/compare.php?devices[]=motorola%20motorola%20razr%2050%20ultra&os=android&devices[]=motorola%20motorola%20one%205G%20ace&os=android#devices). _(I tried 2 Motorola smartphones on Firebase Test Lab, no crash reproducible.)_

`VK_QCOM_rotated_copy_commands` is e.g. not available on the “Motorola One 5G Ace” smartphone _(in case it should be important)_

<details><summary>Logcat orientation change</summary>

-------------

```java
02-25 15:08:05.947  1483 12929 I WindowManager: finishDrawing of orientation change: Window{8cae66a u0 com.example.orientationtest/com.godot.game.GodotApp} 33ms
02-25 15:08:05.951  1483  1779 V WindowManager: Sent Transition (#4506) createdAt=02-25 15:08:05.878 via request=TransitionRequestInfo { type = CHANGE, triggerTask = null, pipTask = null, remoteTransition = null, displayChange = DisplayChange { displayId = 0, startAbsBounds = null, endAbsBounds = null, startRotation = 0, endRotation = 1, physicalDisplayChanged = false }, flags = 0, debugId = 4506 }
02-25 15:08:05.952  1483  1779 V WindowManager:     startWCT=WindowContainerTransaction { changes = {} hops = [] errorCallbackToken=null taskFragmentOrganizer=null }
02-25 15:08:05.952  1483  1779 V WindowManager:     info={id=4506 t=CHANGE f=0x0 trk=0 r=[0@Point(0, 0)] c=[
02-25 15:08:05.952  1483  1779 V WindowManager:         {WCT{RemoteToken{62184fc Task{d373c3c #805 type=standard A=10278:com.example.orientationtest}}} m=CHANGE f=NONE p=WCT{RemoteToken{915eaa DefaultTaskDisplayArea@106271934}} leash=Surface(name=Task=805)/@0xb51fece sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:0},
02-25 15:08:05.952  1483  1779 V WindowManager:         {WCT{RemoteToken{915eaa DefaultTaskDisplayArea@106271934}} m=CHANGE f=NONE p=WCT{RemoteToken{53518ee Display{#0 state=ON size=2400x1080 ROTATION_90}}} leash=Surface(name=DefaultTaskDisplayArea)/@0x88bdf7e sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:-1},
02-25 15:08:05.952  1483  1779 V WindowManager:         {WCT{RemoteToken{53518ee Display{#0 state=ON size=2400x1080 ROTATION_90}}} m=CHANGE f=IS_DISPLAY leash=Surface(name=WindowedMagnification:0:31)/@0x9c527e3 sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:-1}
02-25 15:08:05.952  1483  1779 V WindowManager:     ]}
02-25 15:08:05.954  2591  2622 V WindowManagerShell: onTransitionReady (#4506) android.os.BinderProxy@81e92d8: {id=4506 t=CHANGE f=0x0 trk=0 r=[0@Point(0, 0)] c=[{WCT{android.window.IWindowContainerToken$Stub$Proxy@e92aa55} m=CHANGE f=NONE p=WCT{android.window.IWindowContainerToken$Stub$Proxy@7169c6a} leash=Surface(name=Task=805)/@0x57c36e0 sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:0},{WCT{android.window.IWindowContainerToken$Stub$Proxy@c45155b} m=CHANGE f=NONE p=WCT{android.window.IWindowContainerToken$Stub$Proxy@54e01f8} leash=Surface(name=DefaultTaskDisplayArea)/@0xfdbcd99 sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:-1},{WCT{android.window.IWindowContainerToken$Stub$Proxy@4a096d1} m=CHANGE f=IS_DISPLAY leash=Surface(name=WindowedMagnification:0:31)/@0x691585e sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:-1 snapshot=Surface(name=RotationLayer)/@0xb83743f}]}
02-25 15:08:05.954  2591  2622 V WindowManagerShell: Playing animation for (#4506) android.os.BinderProxy@81e92d8@0
02-25 15:08:05.954  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.transition.DefaultMixedHandler@28663d1
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.keyguard.KeyguardTransitionHandler@a485e36
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.pip.PipTransition@db553cf
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.activityembedding.ActivityEmbeddingController@6d7f15c
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.recents.RecentsTransitionHandler@ea3fc65
02-25 15:08:05.955  2591  2622 V ShellRecents: RecentsTransitionHandler.startAnimation: no controller found
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.splitscreen.StageCoordinator@7e2311f
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.transition.RemoteTransitionHandler@dd76d3a
02-25 15:08:05.955  2591  2622 V WindowManagerShell:  try handler com.android.wm.shell.transition.DefaultTransitionHandler@9dcf9e1
02-25 15:08:05.955  2591  2622 V WindowManagerShell: start default transition animation, info = {id=4506 t=CHANGE f=0x0 trk=0 r=[0@Point(0, 0)] c=[{WCT{android.window.IWindowContainerToken$Stub$Proxy@e92aa55} m=CHANGE f=NONE p=WCT{android.window.IWindowContainerToken$Stub$Proxy@7169c6a} leash=Surface(name=Task=805)/@0x57c36e0 sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:0},{WCT{android.window.IWindowContainerToken$Stub$Proxy@c45155b} m=CHANGE f=NONE p=WCT{android.window.IWindowContainerToken$Stub$Proxy@54e01f8} leash=Surface(name=DefaultTaskDisplayArea)/@0xfdbcd99 sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:-1},{WCT{android.window.IWindowContainerToken$Stub$Proxy@4a096d1} m=CHANGE f=IS_DISPLAY leash=Surface(name=WindowedMagnification:0:31)/@0x691585e sb=Rect(0, 0 - 1080, 2400) eb=Rect(0, 0 - 2400, 1080) d=0 r=0->1:-1 snapshot=Surface(name=RotationLayer)/@0xb83743f}]}
02-25 15:08:05.955  2591  2622 V WindowManagerShell: Display is changing, resolve the animation hint.
02-25 15:08:05.955  2591  2622 V WindowManagerShell:   task 805 isn't requesting seamless, so not seamless.
02-25 15:08:05.962  2591  2622 V WindowManagerShell:  animated by com.android.wm.shell.transition.DefaultTransitionHandler@9dcf9e1
02-25 15:08:05.968  2591  2591 D DisplayRepository: combining enabled=[0], connectedExternalDisplayIds=[], ignored=[]
02-25 15:08:05.977  1483  1783 I DisplayDeviceRepository: Display device changed: DisplayDeviceInfo{"Built-in Screen": uniqueId="local:4630946218877315969", 1080 x 2400, modeId 1, renderFrameRate 60.000004, defaultModeId 1, userPreferredModeId -1, supportedModes [{id=1, width=1080, height=2400, fps=60.000004, vsync=60.000004, alternativeRefreshRates=[], supportedHdrTypes=[2, 3, 4]}], colorMode 0, supportedColorModes [0, 7, 9], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=450.0, mMaxAverageLuminance=225.15, mMinLuminance=0.3}, allmSupported false, gameContentTypeSupported false, density 420, 397.565 x 393.29 dpi, appVsyncOff 2333332, presDeadline 11500000, cutout DisplayCutout{insets=Rect(0, 106 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(478, 0 - 602, 106), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.625} cutoutSpec={M -62,0 L 62,0 L 62,106 L -62,106 Z} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}} sideOverrides={}}, touch INTERNAL, rotation 0, type INTERNAL, address {port=129, model=0x40446d0cde1eeb}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, state ON, committedState ON, frameRateOverride , brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.45882353, hdrSdrRatio NaN, FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY, FLAG_ROTATES_WITH_CONTENT, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, installOrientation 0, displayShape DisplayShape{ spec=-1893857183 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}}
02-25 15:08:05.991 23756 23836 I SwappyDisplayManager: Terminating looper thread
02-25 15:08:05.992 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x38
02-25 15:08:05.992 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.992 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.992 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.992 23756 23818 E Gralloc4: isSupported(1, 1, 56, 1, ...) failed with 1
02-25 15:08:05.992   913  4058 E qdgralloc: GetGpuPixelFormat: No map for format: 0x38
02-25 15:08:05.992   913  4058 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.992   913  4058 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.992   913  4058 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.992 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1
02-25 15:08:05.992 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:05.992 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:05.992 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.992 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.992 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.992 23756 23818 E Gralloc4: isSupported(1, 1, 59, 1, ...) failed with 1
02-25 15:08:05.993   913  4058 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:05.993   913  4058 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.993   913  4058 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.993   913  4058 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.993 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1
02-25 15:08:05.993 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:05.993 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x38
02-25 15:08:05.993 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.993 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.993 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.993 23756 23818 E Gralloc4: isSupported(1, 1, 56, 1, ...) failed with 1
02-25 15:08:05.994   913  4058 E qdgralloc: GetGpuPixelFormat: No map for format: 0x38
02-25 15:08:05.994   913  4058 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.994   913  4058 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.994   913  4058 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.994 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 56 usage b00: 1
02-25 15:08:05.994 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:05.994 23756 23818 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:05.994 23756 23818 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.994 23756 23818 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.994 23756 23818 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.994 23756 23818 E Gralloc4: isSupported(1, 1, 59, 1, ...) failed with 1
02-25 15:08:05.994   913  4058 E qdgralloc: GetGpuPixelFormat: No map for format: 0x3b
02-25 15:08:05.994   913  4058 E AdrenoUtils: <validate_memory_layout_input_parmas:1984>: Unknown Format 0
02-25 15:08:05.994   913  4058 E AdrenoUtils: <adreno_init_memory_layout:4723>: Memory Layout input parameter validation failed!
02-25 15:08:05.994   913  4058 E qdgralloc: GetGpuResourceSizeAndDimensions Graphics metadata init failed
02-25 15:08:05.994 23756 23818 E GraphicBufferAllocator: Failed to allocate (4 x 4) layerCount 1 format 59 usage b00: 1
02-25 15:08:05.994 23756 23818 E AHardwareBuffer: GraphicBuffer(w=4, h=4, lc=1) failed (Unknown error -1), handle=0x0
02-25 15:08:06.005  2591  2591 D DisplayRepository: combining enabled=[0], connectedExternalDisplayIds=[], ignored=[]
02-25 15:08:06.009  1483  2412 W UserManagerService: Requested status bar icon for non-badged user 0
02-25 15:08:06.010   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.011 23756 23818 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-25 15:08:06.015 23756 23844 I SwappyDisplayManager: Starting looper thread
02-25 15:08:06.020  2591  2591 I KeyguardBlueprintViewBinder: runTransition: running IntraBlueprintTransition: currentPriority=-1; config=Config(type=NoTransition, checkPriority=true, terminatePrevious=true)
02-25 15:08:06.020  2591  2591 D DisplayRepository: combining enabled=[0], connectedExternalDisplayIds=[], ignored=[]
02-25 15:08:06.022  2878  3489 D QCNEJ/WlanStaInfoRelay: Received action: android.net.wifi.RSSI_CHANGED
02-25 15:08:06.023  1148 22991 I netd    : networkAddUidRangesParcel(NativeUidRangeConfig{netId: 568, uidRanges: [UidRangeParcel{start: 0, stop: 2147483647}], subPriority: 998}) <0.22ms>
02-25 15:08:06.024  1148 22991 I netd    : networkRemoveUidRangesParcel(NativeUidRangeConfig{netId: 568, uidRanges: [UidRangeParcel{start: 0, stop: 2147483647}], subPriority: 998}) <0.18ms>
02-25 15:08:06.026   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.030 14937 14937 I MagicTether: [ActiveNetworkTracker] setActiveNetwork: 568 [CONTEXT service_id=276 ]
02-25 15:08:06.030 14937 14937 I MagicTether: [TetherService] onActiveNetworkChanged: network=568 isLost=false [CONTEXT service_id=276 ]
02-25 15:08:06.030 14937 23717 I MagicTether: [WifiConnectionHandler] Ignoring getWifiConfigurationByNetworkId when checking connected state [CONTEXT service_id=276 ]
02-25 15:08:06.030 14937 23717 I MagicTether: [WifiConnectionHandler] No networkId set, can't be connected. [CONTEXT service_id=276 ]
02-25 15:08:06.031 14937 23717 I MagicTether: [TetherService] TRANSPORT_CELLULAR [false], TRANSPORT_ETHERNET [false], TRANSPORT_WIFI [true] [CONTEXT service_id=276 ]
02-25 15:08:06.031 11769 11953 I BugleRcsEngine: handleMessage processing message:[NOTIFY_UPTIME_IGNORE_STATE_CHANGED] with [non-null]:RcsEngineImpl reference [CONTEXT log_prefix="RcsEngineImpl[DUAL_REG]:[341ad634-3b4e]>Handler" thread_id=56 ]
02-25 15:08:06.033 11769 11881 I BugleRcsEngine: Connected state: [1], networkType: [WIFI] [CONTEXT thread_id=46 ]
02-25 15:08:06.033 14937 23717 I MagicTether: [TetherService] setRoles hasActiveNetworkConnection=true canActiveNetworkBeTethered=true isConnectedToInstantTether=false isWifiEnabled=true isHosting=false [CONTEXT service_id=276 ]
02-25 15:08:06.037 14937 14937 I MagicTether: [LaunchUtils] Instant Wifi for status account: name: brycehenley97@gmail.com | type: com.google | isLaunched: true [CONTEXT service_id=276 ]
02-25 15:08:06.038 14937 14937 I MagicTether: [TidepoolFeatureStatusManager] isInstantHotspotEnabled=true [CONTEXT service_id=276 ]
02-25 15:08:06.038 14937 14937 I MagicTether: [TidepoolFeatureStatusManager] isInstantWifiEnabled=true [CONTEXT service_id=276 ]
02-25 15:08:06.038 14937 14937 I MagicTether: [TetherService] startNearbyClientRole: start: false isInstantHotspotEnabled: true isInstantWifiEnabled: true [CONTEXT service_id=276 ]
02-25 15:08:06.038 14937 14937 I MagicTether: [TetherService] Stopping Nearby client role [CONTEXT service_id=276 ]
02-25 15:08:06.039 14937 14937 I MagicTether: [ClientTetherRole] Client role already stopped [CONTEXT service_id=276 ]
02-25 15:08:06.039  1483  3871 D ActivityManager: sync unfroze 18104 com.google.android.apps.messaging for 7
02-25 15:08:06.040 14937 14937 I MagicTether: [LaunchUtils] Instant Wifi for status account: name: brycehenley97@gmail.com | type: com.google | isLaunched: true [CONTEXT service_id=276 ]
02-25 15:08:06.040 14937 14937 I MagicTether: [TidepoolFeatureStatusManager] isInstantHotspotEnabled=true [CONTEXT service_id=276 ]
02-25 15:08:06.040 14937 14937 I MagicTether: [TidepoolFeatureStatusManager] isInstantWifiEnabled=true [CONTEXT service_id=276 ]
02-25 15:08:06.040 14937 14937 I MagicTether: [TetherService] startNearbyHostRole: start: true isInstantHotspotEnabled: true isInstantWifiEnabled: true [CONTEXT service_id=276 ]
02-25 15:08:06.040 14937 14937 I MagicTether: [TidepoolFeatureStatusManager] isInstantHotspotEnabled=true [CONTEXT service_id=276 ]
02-25 15:08:06.040 14937 14937 I MagicTether: [HostTetherRole] Nearby host role already started [CONTEXT service_id=276 ]
02-25 15:08:06.041  1483  1783 I DisplayDeviceRepository: Display device changed: DisplayDeviceInfo{"Built-in Screen": uniqueId="local:4630946218877315969", 1080 x 2400, modeId 1, renderFrameRate 60.000004, defaultModeId 1, userPreferredModeId -1, supportedModes [{id=1, width=1080, height=2400, fps=60.000004, vsync=60.000004, alternativeRefreshRates=[], supportedHdrTypes=[2, 3, 4]}], colorMode 0, supportedColorModes [0, 7, 9], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=450.0, mMaxAverageLuminance=225.15, mMinLuminance=0.3}, allmSupported false, gameContentTypeSupported false, density 420, 397.565 x 393.29 dpi, appVsyncOff 2333332, presDeadline 11500000, cutout DisplayCutout{insets=Rect(0, 106 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(478, 0 - 602, 106), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.625} cutoutSpec={M -62,0 L 62,0 L 62,106 L -62,106 Z} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}} sideOverrides={}}, touch INTERNAL, rotation 0, type INTERNAL, address {port=129, model=0x40446d0cde1eeb}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, state ON, committedState ON, frameRateOverride {uid=10278 frameRateHz=30.000002} , brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.45882353, hdrSdrRatio NaN, FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY, FLAG_ROTATES_WITH_CONTENT, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, installOrientation 0, displayShape DisplayShape{ spec=-1893857183 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}}
02-25 15:08:06.041 18104 18104 E ActivityThread: Package [com.example.orientationtest] reported as REPLACED, but missing application info. Assuming REMOVED.
02-25 15:08:06.042 18104 18104 E ActivityThread: Package [com.example.orientationtest] reported as REPLACED, but missing application info. Assuming REMOVED.
02-25 15:08:06.043 23756 23827 W MessageQueue: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:06.043 23756 23827 W MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.MessageQueue.enqueueMessage(MessageQueue.java:603)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.Handler.enqueueMessage(Handler.java:787)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.Handler.sendMessageAtTime(Handler.java:736)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.Handler.sendMessageDelayed(Handler.java:706)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.Handler.post(Handler.java:436)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:43)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.Binder.execTransactInternal(Binder.java:1505)
02-25 15:08:06.043 23756 23827 W MessageQueue: 	at android.os.Binder.execTransact(Binder.java:1444)
02-25 15:08:06.044   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.044   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.044   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.045 23756 23827 W Binder  : Caught a RuntimeException from the binder stub implementation.
02-25 15:08:06.045 23756 23827 W Binder  : java.util.concurrent.RejectedExecutionException: Handler (android.os.Handler) {3ca401f} is shutting down
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:44)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.os.Binder.execTransactInternal(Binder.java:1505)
02-25 15:08:06.045 23756 23827 W Binder  : 	at android.os.Binder.execTransact(Binder.java:1444)
02-25 15:08:06.050 11769 11953 I BugleRcsEngine: Rcs is enabled from user settings: true [CONTEXT log_prefix="ProvisioningEngineDataRetriever" thread_id=56 ]
02-25 15:08:06.050  1483  3871 I ImeTracker: com.example.orientationtest:9813def4: onRequestHide at ORIGIN_SERVER reason HIDE_SAME_WINDOW_FOCUSED_WITHOUT_EDITOR fromUser false
02-25 15:08:06.050  1483  3871 I ImeTracker: com.example.orientationtest:9813def4: onCancelled at PHASE_SERVER_SHOULD_HIDE
02-25 15:08:06.057   910   910 D DisplayDevice: setDesiredMode 4630946218877315969 {mode=30.00 Hz (60.00 Hz(60.00 Hz)), emitEvent=true, force=false}
02-25 15:08:06.058  2591  2591 I KeyguardBlueprintViewBinder: onTransitionStart: IntraBlueprintTransition
02-25 15:08:06.058  2591  2591 E KeyguardBlueprintViewBinder: onTransitionEnd: IntraBlueprintTransition
02-25 15:08:06.058  1483  1783 I DisplayDeviceRepository: Display device changed: DisplayDeviceInfo{"Built-in Screen": uniqueId="local:4630946218877315969", 1080 x 2400, modeId 1, renderFrameRate 30.000002, defaultModeId 1, userPreferredModeId -1, supportedModes [{id=1, width=1080, height=2400, fps=60.000004, vsync=60.000004, alternativeRefreshRates=[], supportedHdrTypes=[2, 3, 4]}], colorMode 0, supportedColorModes [0, 7, 9], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=450.0, mMaxAverageLuminance=225.15, mMinLuminance=0.3}, allmSupported false, gameContentTypeSupported false, density 420, 397.565 x 393.29 dpi, appVsyncOff 2333332, presDeadline 11500000, cutout DisplayCutout{insets=Rect(0, 106 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(478, 0 - 602, 106), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.625} cutoutSpec={M -62,0 L 62,0 L 62,106 L -62,106 Z} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}} sideOverrides={}}, touch INTERNAL, rotation 0, type INTERNAL, address {port=129, model=0x40446d0cde1eeb}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, state ON, committedState ON, frameRateOverride {uid=10278 frameRateHz=30.000002} , brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.45882353, hdrSdrRatio NaN, FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY, FLAG_ROTATES_WITH_CONTENT, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, installOrientation 0, displayShape DisplayShape{ spec=-1893857183 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}}
02-25 15:08:06.060  1483  1783 D DisplayManagerService: Ignore redundant display event 0/2 to 10131/8135
02-25 15:08:06.060   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.060   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.060  1483  1783 D DisplayManagerService: Ignore redundant display event 0/2 to 10233/21891
02-25 15:08:06.060  1279  2210 D audio_hw_primary: adev_set_parameters: enter: screen_state=on
02-25 15:08:06.060  1279  2210 V msm8974_platform: platform_set_parameters: enter: screen_state=on
02-25 15:08:06.060  1279  2210 V msm8974_platform: platform_set_parameters: exit with code(0)
02-25 15:08:06.060  1279  2210 D audio_hw_primary: adev_set_parameters: exit with code(0) takes 0.05 ms
02-25 15:08:06.062 23756 23827 W MessageQueue: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:06.062 23756 23827 W MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.MessageQueue.enqueueMessage(MessageQueue.java:603)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.Handler.enqueueMessage(Handler.java:787)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.Handler.sendMessageAtTime(Handler.java:736)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.Handler.sendMessageDelayed(Handler.java:706)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.Handler.post(Handler.java:436)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:43)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.Binder.execTransactInternal(Binder.java:1505)
02-25 15:08:06.062 23756 23827 W MessageQueue: 	at android.os.Binder.execTransact(Binder.java:1444)
02-25 15:08:06.063 23756 23827 W Binder  : Caught a RuntimeException from the binder stub implementation.
02-25 15:08:06.063 23756 23827 W Binder  : java.util.concurrent.RejectedExecutionException: Handler (android.os.Handler) {3ca401f} is shutting down
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:44)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.os.Binder.execTransactInternal(Binder.java:1505)
02-25 15:08:06.063 23756 23827 W Binder  : 	at android.os.Binder.execTransact(Binder.java:1444)
02-25 15:08:06.066  2591  2591 D DisplayRepository: combining enabled=[0], connectedExternalDisplayIds=[], ignored=[]
02-25 15:08:06.075   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.075   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.092   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.092   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.126   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.126   910   910 W HwcComposer: command 0x4080000 generated error 4
02-25 15:08:06.127 14937 23214 I NearbyMediums: No BLE Fast/GATT advertisements found in the latest cycle.
02-25 14:58:11.531     0     0 E msm_dwc3_perf_vote_work: in_perf_mode:0, interrupts in last sample:175
02-25 15:08:06.141  2591  2622 V WindowManagerShell: Transition animation finished (aborted=false), notifying core (#4506) android.os.BinderProxy@81e92d8@0
02-25 15:08:06.142  1483  1779 V WindowManager: Finish Transition (#4506): created at 02-25 15:08:05.878 collect-started=0.132ms request-sent=0.268ms started=3.502ms ready=35.368ms sent=72.881ms finished=264.041ms
02-25 15:08:06.142  2591  2622 V WindowManagerShell: Track 0 became idle
02-25 15:08:06.143  2591  2622 V WindowManagerShell: All active transition animations finished
02-25 15:08:06.424 21479 21479 D SensorReceiver: Received intent: android.intent.action.CONFIGURATION_CHANGED
02-25 15:08:06.425 21479 21479 D SensorReceiver: Sensor(s) [screen_orientation, screen_rotation] corresponding to received event android.intent.action.CONFIGURATION_CHANGED are disabled, skipping sensors update
02-25 15:08:06.531 14937 23214 I NearbySharing: Network state changed: NetworkState(isRestricted=false, isOnline=true, isCongested=false, isMetered=false, isWifiConnected=true)
02-25 14:58:11.959     0     0 I ufstw_suspend: 824 ufstw_lu4 goto suspend
02-25 14:58:11.964     0     0 I ufstw_cancel_lu_jobs: 509 cancel_delayed_work_sync(tw_flush_work) ufstw_lu4 = 0
02-25 14:58:11.973     0     0 I ufstw_cancel_lu_jobs: 512 cancel_work_sync(tw_lifetime_work) ufstw_lu4 = 0
02-25 15:08:06.588  1324 11336 I WifiHAL : event received NL80211_CMD_VENDOR, vendor_id = 0x1374, subcmd = 0xd
02-25 15:08:06.588  1642  1642 I cnss-daemon: nl80211 response handler invoked
02-25 15:08:06.589  1642  1642 I cnss-daemon: nl80211_response_handler: cmd 103, vendorID 4980, subcmd 13  received
02-25 15:08:06.872  1281 19478 E sensors-hal: handle_sns_client_event:62, mot_disprot_event: now=1128930374192150 ts=1128930262436852, type=16, status=3
02-25 15:08:07.271  1281 19478 E sensors-hal: handle_sns_client_event:62, mot_disprot_event: now=1128930772865940 ts=1128930700642477, type=0, status=3
02-25 15:08:07.272  2591  2622 V WindowManagerShell: Transition requested (#4507): android.os.BinderProxy@d8de7f7 TransitionRequestInfo { type = CHANGE, triggerTask = null, pipTask = null, remoteTransition = null, displayChange = DisplayChange { displayId = 0, startAbsBounds = null, endAbsBounds = null, startRotation = 1, endRotation = 0, physicalDisplayChanged = false }, flags = 0, debugId = 4507 }
02-25 15:08:07.276  1483  1783 I ActivityTaskManager: Config changes=20000480 {1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25152 fontWeightAdjustment=0}
02-25 15:08:07.279  1483  1783 W ActivityTaskManager: Current config: {1.0 310mcc240mnc [en_US] ldltr sw411dp w874dp h359dp 420dpi nrml long land night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 2400, 1080) mAppBounds=Rect(106, 0 - 2400, 1017) mMaxBounds=Rect(0, 0 - 2400, 1080) mDisplayRotation=ROTATION_90 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_90} as.2 s.25152 fontWeightAdjustment=0} unchanged for IME proc org.futo.inputmethod.latin.playstore
02-25 15:08:07.286  1483  1783 I WindowManager: Override config changes=20000480 {1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25152 fontWeightAdjustment=0} for displayId=0
02-25 15:08:07.302  1483  1783 W ImageReader_JNI: Unable to acquire a buffer item, very likely client tried to acquire more than maxImages buffers
02-25 15:08:07.304  1483  1483 W WindowTokenClientController: Can't find attached WindowTokenClient for android.window.WindowTokenClient@748c1de
02-25 15:08:07.304  1483  1783 V ActivityTaskManager: Sending to IME proc org.futo.inputmethod.latin.playstore new config {1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25195 fontWeightAdjustment=0}
02-25 15:08:07.308 11197 11197 D b/254119092: TaskbarManager#mComponentCallbacks.onConfigurationChanged: {1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25152 fontWeightAdjustment=0}
02-25 15:08:07.308 11197 11197 D b/254119092: mActivity and mContext agree taskbarIsPresent=false
02-25 15:08:07.308 11197 11197 D b/254119092: ComponentCallbacks#onConfigurationChanged() configDiff={}
02-25 15:08:07.308 11197 11197 D b/254119092: mActivity and mContext agree taskbarIsPresent=false
02-25 15:08:07.308 11197 11197 D b/254119092: destroyExistingTaskbar: null
02-25 15:08:07.308 11197 11197 D b/254119092: mActivity and mContext agree taskbarIsPresent=false
02-25 15:08:07.308 11197 11197 D b/254119092: recreateTaskbar: isTaskbarEnabled=false [dp != null (i.e. mUserUnlocked)]=true FLAG_HIDE_NAVBAR_WINDOW=false dp.isTaskbarPresent=false
02-25 15:08:07.308 11197 11197 D b/254119092: mActivity and mContext agree taskbarIsPresent=false
02-25 15:08:07.308  2591  2622 V ShellDragAndDrop: Display changed: 0
02-25 15:08:07.309 21775 21775 W LatinIME: Configuration changed
02-25 15:08:07.309  1483  1783 I InputManager-JNI: Viewport [0] to add: local:4630946218877315969, isActive: true
02-25 15:08:07.309 11197 11197 D b/254119092: DisplayController#onConfigurationChanged: {1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25152 fontWeightAdjustment=0}
02-25 15:08:07.309  1483  2477 I InputReader: Reconfiguring input devices, changes=DISPLAY_INFO
02-25 15:08:07.314  1483  1783 D DisplayManagerService: Ignore redundant display event 0/2 to 10131/8135
02-25 15:08:07.314  1279  2210 D audio_hw_primary: adev_set_parameters: enter: screen_state=on
02-25 15:08:07.314  1279  2210 V msm8974_platform: platform_set_parameters: enter: screen_state=on
02-25 15:08:07.314  1279  2210 V msm8974_platform: platform_set_parameters: exit with code(0)
02-25 15:08:07.314  1279  2210 D audio_hw_primary: adev_set_parameters: exit with code(0) takes 0.05 ms
02-25 15:08:07.315  1483  1783 D DisplayManagerService: Ignore redundant display event 0/2 to 10233/21891
02-25 15:08:07.316 23756 23827 W MessageQueue: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:07.316 23756 23827 W MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.MessageQueue.enqueueMessage(MessageQueue.java:603)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.Handler.enqueueMessage(Handler.java:787)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.Handler.sendMessageAtTime(Handler.java:736)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.Handler.sendMessageDelayed(Handler.java:706)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.Handler.post(Handler.java:436)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:43)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.Binder.execTransactInternal(Binder.java:1505)
02-25 15:08:07.316 23756 23827 W MessageQueue: 	at android.os.Binder.execTransact(Binder.java:1444)
02-25 15:08:07.316  1279  2210 D audio_hw_primary: adev_set_parameters: enter: rotation=0
02-25 15:08:07.316  1279  2210 V msm8974_platform: platform_set_parameters: enter: rotation=0
02-25 15:08:07.316  1279  2210 V msm8974_platform: platform_set_parameters: exit with code(0)
02-25 15:08:07.316  1279  2210 D audio_hw_primary: adev_set_parameters: exit with code(0) takes 0.05 ms
02-25 15:08:07.317 23756 23827 W Binder  : Caught a RuntimeException from the binder stub implementation.
02-25 15:08:07.317 23756 23827 W Binder  : java.util.concurrent.RejectedExecutionException: Handler (android.os.Handler) {3ca401f} is shutting down
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:44)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.os.Binder.execTransactInternal(Binder.java:1505)
02-25 15:08:07.317 23756 23827 W Binder  : 	at android.os.Binder.execTransact(Binder.java:1444)
02-25 15:08:07.319 23756 23756 W MessageQueue: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:07.319 23756 23756 W MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {3ca401f} sending message to a Handler on a dead thread
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.MessageQueue.enqueueMessage(MessageQueue.java:603)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Handler.enqueueMessage(Handler.java:787)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Handler.sendMessageAtTime(Handler.java:736)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Handler.sendMessageDelayed(Handler.java:706)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Handler.post(Handler.java:436)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:43)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayChangeFromWindowManager(DisplayManagerGlobal.java:425)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.app.servertransaction.ClientTransactionListenerController.onDisplayChanged(ClientTransactionListenerController.java:76)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:131)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2595)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Handler.dispatchMessage(Handler.java:107)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Looper.loopOnce(Looper.java:232)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.os.Looper.loop(Looper.java:317)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at android.app.ActivityThread.main(ActivityThread.java:8592)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at java.lang.reflect.Method.invoke(Native Method)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
02-25 15:08:07.319 23756 23756 W MessageQueue: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
02-25 15:08:07.319 23756 23756 D AndroidRuntime: Shutting down VM
02-25 15:08:07.319 23756 23756 E AndroidRuntime: FATAL EXCEPTION: main
02-25 15:08:07.319 23756 23756 E AndroidRuntime: Process: com.example.orientationtest, PID: 23756
02-25 15:08:07.319 23756 23756 E AndroidRuntime: java.util.concurrent.RejectedExecutionException: Handler (android.os.Handler) {3ca401f} is shutting down
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.os.HandlerExecutor.execute(HandlerExecutor.java:44)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.hardware.display.DisplayManagerGlobal.handleDisplayChangeFromWindowManager(DisplayManagerGlobal.java:425)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.app.servertransaction.ClientTransactionListenerController.onDisplayChanged(ClientTransactionListenerController.java:76)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:131)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2595)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:107)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.os.Looper.loopOnce(Looper.java:232)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:317)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:8592)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
02-25 15:08:07.319 23756 23756 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
02-25 15:08:07.320  2591  2591 I NoBackGesture: Config changed: newConfig={1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25192 fontWeightAdjustment=0} lastReportedConfig={1.0 310mcc240mnc [en_US] ldltr sw411dp w874dp h359dp 420dpi nrml long land night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 2400, 1080) mAppBounds=Rect(106, 0 - 2400, 1017) mMaxBounds=Rect(0, 0 - 2400, 1080) mDisplayRotation=ROTATION_90 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_90} as.2 s.25146 fontWeightAdjustment=0}
02-25 15:08:07.321  2591  2591 I NoBackGesture: NavbarController: newConfig={1.0 310mcc240mnc [en_US] ldltr sw411dp w411dp h850dp 420dpi nrml long port night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 106 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.25192 fontWeightAdjustment=0} mTaskbarDelegate initialized=false willApplyConfigToNavbars=false navBarCount=1
02-25 15:08:07.321  1483  2929 E ActivityManager: App crashed on incremental package com.example.orientationtest which is 100% loaded.
02-25 15:08:07.322  1483  2929 E incfs   : IncFs_GetMetrics: failed to read file: /sys/fs/incremental-fs/instances/MT_data_app_vmdl198bbb641be-cd98-4594-8603-f9327d2a4af8/reads_delayed_min: No such file or directory
02-25 15:08:07.326  1483 23849 I DropBoxManagerService: add tag=data_app_crash isTagEnabled=true flags=0x2
02-25 15:08:07.326   910   910 D DisplayDevice: setDesiredMode 4630946218877315969 {mode=60.00 Hz (60.00 Hz(60.00 Hz)), emitEvent=true, force=false}
02-25 15:08:07.327  1483  2929 W ActivityTaskManager:   Force finishing activity com.example.orientationtest/com.godot.game.GodotApp
02-25 15:08:07.327  1483  1783 I DisplayDeviceRepository: Display device changed: DisplayDeviceInfo{"Built-in Screen": uniqueId="local:4630946218877315969", 1080 x 2400, modeId 1, renderFrameRate 60.000004, defaultModeId 1, userPreferredModeId -1, supportedModes [{id=1, width=1080, height=2400, fps=60.000004, vsync=60.000004, alternativeRefreshRates=[], supportedHdrTypes=[2, 3, 4]}], colorMode 0, supportedColorModes [0, 7, 9], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[2, 3, 4], mMaxLuminance=450.0, mMaxAverageLuminance=225.15, mMinLuminance=0.3}, allmSupported false, gameContentTypeSupported false, density 420, 397.565 x 393.29 dpi, appVsyncOff 2333332, presDeadline 11500000, cutout DisplayCutout{insets=Rect(0, 106 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(478, 0 - 602, 106), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.625} cutoutSpec={M -62,0 L 62,0 L 62,106 L -62,106 Z} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}} sideOverrides={}}, touch INTERNAL, rotation 0, type INTERNAL, address {port=129, model=0x40446d0cde1eeb}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, state ON, committedState ON, frameRateOverride {uid=10278 frameRateHz=30.000002} , brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.45882353, hdrSdrRatio NaN, FLAG_ALLOWED_TO_BE_DEFAULT_DISPLAY, FLAG_ROTATES_WITH_CONTENT, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, installOrientation 0, displayShape DisplayShape{ spec=-1893857183 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}}
02-25 15:08:07.334 23756 23756 I Process : Sending signal. PID: 23756 SIG: 9
02-25 15:08:07.335  1483  1783 D DisplayManagerService: Ignore redundant display event 0/2 to 10131/8135
02-25 15:08:07.336  1483  1783 D DisplayManagerService: Ignore redundant display event 0/2 to 10233/21891
02-25 15:08:07.336  1279  2210 D audio_hw_primary: adev_set_parameters: enter: screen_state=on
02-25 15:08:07.336  1279  2210 V msm8974_platform: platform_set_parameters: enter: screen_state=on
02-25 15:08:07.336  1279  2210 V msm8974_platform: platform_set_parameters: exit with code(0)
02-25 15:08:07.336  1279  2210 D audio_hw_primary: adev_set_parameters: exit with code(0) takes 0.09 ms
02-25 15:08:07.342   910   910 I BpBinder: onLastStrongRef automatically unlinking death recipients: 
02-25 15:08:07.356  2591  2591 D DisplayRepository: combining enabled=[0], connectedExternalDisplayIds=[], ignored=[]
02-25 15:08:07.366  1483 13447 I ActivityManager: Process com.example.orientationtest (pid 23756) has died: fg  TOP 
02-25 15:08:07.367  1483  3871 I WindowManager: WIN DEATH: Window{8cae66a u0 com.example.orientationtest/com.godot.game.GodotApp}
02-25 15:08:07.367  1483  3871 W InputManager-JNI: Input channel object '8cae66a com.example.orientationtest/com.godot.game.GodotApp (client)' was disposed without first being removed with the input manager!
02-25 15:08:07.369  1483  2668 I ImeTracker: com.example.orientationtest:c553b016: onRequestHide at ORIGIN_SERVER reason HIDE_REMOVE_CLIENT fromUser false
02-25 15:08:07.369  1483  2668 I ImeTracker: com.example.orientationtest:c553b016: onCancelled at PHASE_SERVER_SHOULD_HIDE
02-25 14:58:12.767     0     0 W binder_cleanup_transaction: 1 callbacks suppressed
02-25 14:58:12.767     0     0 I binder  : undelivered transaction 179182577, process died.
02-25 15:08:07.373  1483  1900 I libprocessgroup: Removed cgroup /sys/fs/cgroup/uid_10278/pid_23756
02-25 15:08:07.381  1149  1149 I Zygote  : Process 23756 exited due to signal 9 (Killed)
02-25 14:58:12.780     0     0 I binder  : undelivered transaction 179182684, process died.
02-25 15:08:07.387  1483  1780 V GameManagerService: Game power mode OFF (no games in foreground)

```

</details>

--------------------


`SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.`

We could still try an export template without “Swappy”. I'll try to compile it for you tomorrow.
 @brycehenley Please try disabling `Frame Pacing` in the project settings first:

<details> <summary>Screenshot:  Display -> Window -> Frame Pacing </summary>

![Image](https://github.com/user-attachments/assets/1f12fa74-a14f-43fe-9cbd-2bfedf4f2b9e)
</details>



<details><summary>If that doesn't help, then try an export template without swappy.</summary>

----------------------

[android_debug_no_swappy_4.4-rc2.apk](https://drive.google.com/file/d/1NgGGyCBaM7L-TDcbjdumvOGsqt56Qe3d/view?usp=sharing) (85 MB Download, arm32 / arm64)
**or** 
https://docs.godotengine.org/en/stable/contributing/development/compiling/compiling_for_android.html
`scons platform=android target=template_debug arch=arm64 generate_apk=yes swappy=no`

<details> <summary>Screenshot: Export -> Custom Template -> Debug </summary>

![Image](https://github.com/user-attachments/assets/a59d1514-8100-4d52-b6ad-e8595c5797cc)
</details>

---------------

I noticed that `SwappyDisplayManager` keeps restarting when the display orientation is changed.
However, these logcat entries only disappear when “Frame Pacing” is deactivated under project settings.

![Image](https://github.com/user-attachments/assets/47578dc4-721f-43af-bb89-51f8dff92b8d)
</details>

On Firebase Test Lab I tested on 10 other devices, mostly `Adreno 610 `and `Adreno 619,` no crashes reproducible. (With swappy/frame pacing)


Rotating worked after disabling Frame Pacing.
> Rotating worked after disabling Frame Pacing.

CC @darksylinc
Will take a look at it tomorrow! Thanks for the CC.

In the meantime the workaround is to disable Frame Pacing.
In the commit logs on the first page I see `swappy` 9 times

https://android.googlesource.com/platform/frameworks/opt/gamesdk/+log

> 80243e8 Fix race condition in Swappy destructor Bug: b/298957185 Test: Bouncyball by Victor Repetskyi · 1 year, 5 months ago

Maybe we can try with a new version first? @darksylinc 
`v2023.3.0.0`
https://github.com/darksylinc/godot-swappy/releases
I cannot repro this on my phones, however I recognize this error from my own apps (non-Godot) that trace back to Swappy:

```
Caught a RuntimeException from the binder stub implementation.
java.util.concurrent.RejectedExecutionException: Handler (android.os.Handler) {3ca401f} is shutting down
	at android.os.HandlerExecutor.execute(HandlerExecutor.java:44)
	at android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate.sendDisplayEvent(DisplayManagerGlobal.java:1219)
	at android.hardware.display.DisplayManagerGlobal.handleDisplayEvent(DisplayManagerGlobal.java:517)
	at android.hardware.display.DisplayManagerGlobal.-$$Nest$mhandleDisplayEvent(Unknown Source:0)
	at android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback.onDisplayEvent(DisplayManagerGlobal.java:1192)
	at android.hardware.display.IDisplayManagerCallback$Stub.onTransact(IDisplayManagerCallback.java:87)
	at android.os.Binder.execTransactInternal(Binder.java:1505)
	at android.os.Binder.execTransact(Binder.java:1444)
```

Which is more common in certain specific models for but I was never able to repro myself.

I'll follow Alex2782's advise and build a newer version of Swappy.
OK I created a new Android export template based on the latest version of Swappy.

Could you test it out @brycehenley and see if that fixes your problem?

[Download it from here](https://github.com/darksylinc/temp/releases/tag/swappy).

**Edit:** In case you don't know where it goes, they must replace the ones in your export templates folder. You can see where the folder location is by going to `Editor-> Manage Export Templates`:

![Image](https://github.com/user-attachments/assets/1349c4d8-473e-47cd-ba05-36a27ca4aacc)

In this picture, it's in `/home/matias/.local/share/godot/export_templates/4.4.beta` because I'm on Linux.
also possible: `Export -> Advanced Options -> Custom Template`

<details><summary>Screenshot</summary>

![Image](https://github.com/user-attachments/assets/73373160-303c-4fcc-a906-780d1e52157e)
</details>

Enable `Frame Pacing` again and check logcat: `adb logcat -s SwappyDisplayManager`
```java
--------- beginning of main
02-28 00:24:58.768 29670 29822 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-28 00:24:58.771 29670 29981 I SwappyDisplayManager: Starting looper thread
```

Using the custom export template with the latest version of Swappy solved the app crashing issue.

Logcat shows Swappy starting and terminating the looper thread on every rotation. I'm not familiar with Swappy so I don't know if that is the expected behavior.

```java
02-27 17:18:32.851 20797 20869 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-27 17:18:32.853 20797 20903 I SwappyDisplayManager: Starting looper thread
02-27 17:18:35.405 20797 20903 I SwappyDisplayManager: Terminating looper thread
02-27 17:18:35.427 20797 20869 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-27 17:18:35.429 20797 20908 I SwappyDisplayManager: Starting looper thread
02-27 17:18:39.830 20797 20908 I SwappyDisplayManager: Terminating looper thread
02-27 17:18:39.845 20797 20869 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-27 17:18:39.847 20797 20914 I SwappyDisplayManager: Starting looper thread
02-27 17:18:41.801 20797 20914 I SwappyDisplayManager: Terminating looper thread
02-27 17:18:41.816 20797 20869 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-27 17:18:41.818 20797 20919 I SwappyDisplayManager: Starting looper thread
02-27 17:18:43.804 20797 20919 I SwappyDisplayManager: Terminating looper thread
02-27 17:18:43.825 20797 20869 I SwappyDisplayManager: Using internal com/google/androidgamesdk/SwappyDisplayManager class from dex bytes.
02-27 17:18:43.828 20797 20924 I SwappyDisplayManager: Starting looper thread
```

That's ok, thanks for testing!
> Using the custom export template with the latest version of Swappy solved the app crashing issue.

That's awesome!

I'll update the libs and prepare a PR.

> Logcat shows Swappy starting and terminating the looper thread on every rotation. I'm not familiar with Swappy so I don't know if that is the expected behavior.

As long as it happens on every rotation, that is expected behavior.
If it gets spammed every frame without you doing anything, that would not be expected behavior.

Fix patch:
diff --git a/.github/workflows/android_builds.yml b/.github/workflows/android_builds.yml
index 443b0be0f388..426efac6ece3 100644
--- a/.github/workflows/android_builds.yml
+++ b/.github/workflows/android_builds.yml
@@ -62,8 +62,8 @@ jobs:
       - name: Download pre-built Android Swappy Frame Pacing Library
         uses: dsaltares/fetch-gh-release-asset@1.1.2
         with:
-          repo: darksylinc/godot-swappy
-          version: tags/v2023.3.0.0
+          repo: godotengine/godot-swappy
+          version: tags/from-source-2025-01-31
           file: godot-swappy.7z
           target: swappy/godot-swappy.7z
 
diff --git a/.gitignore b/.gitignore
index 2c3bf742ba2e..8adc7b786c63 100644
--- a/.gitignore
+++ b/.gitignore
@@ -263,6 +263,11 @@ bld/
 !thirdparty/**/arm/
 !thirdparty/**/arm64/
 
+thirdparty/swappy-frame-pacing/arm64-v8a/abi.json
+thirdparty/swappy-frame-pacing/armeabi-v7a/abi.json
+thirdparty/swappy-frame-pacing/x86/abi.json
+thirdparty/swappy-frame-pacing/x86_64/abi.json
+
 # Visual Studio 2015/2017 cache/options directory
 .vs/
 
diff --git a/platform/android/detect.py b/platform/android/detect.py
index 571cfd9819c0..cac7c3f48d4e 100644
--- a/platform/android/detect.py
+++ b/platform/android/detect.py
@@ -187,7 +187,7 @@ def configure(env: "SConsEnvironment"):
     has_swappy = detect_swappy()
     if not has_swappy:
         print_warning(
-            "Swappy Frame Pacing not detected! It is strongly recommended you download it from https://github.com/darksylinc/godot-swappy/releases and extract it so that the following files can be found:\n"
+            "Swappy Frame Pacing not detected! It is strongly recommended you download it from https://github.com/godotengine/godot-swappy/releases and extract it so that the following files can be found:\n"
             + " thirdparty/swappy-frame-pacing/arm64-v8a/libswappy_static.a\n"
             + " thirdparty/swappy-frame-pacing/armeabi-v7a/libswappy_static.a\n"
             + " thirdparty/swappy-frame-pacing/x86/libswappy_static.a\n"
diff --git a/thirdparty/swappy-frame-pacing/common/gamesdk_common.h b/thirdparty/swappy-frame-pacing/common/gamesdk_common.h
index d29ac01af384..25ce813968f7 100644
--- a/thirdparty/swappy-frame-pacing/common/gamesdk_common.h
+++ b/thirdparty/swappy-frame-pacing/common/gamesdk_common.h
@@ -31,11 +31,12 @@
 
 // There are separate versions for each GameSDK component that use this format:
 #define ANDROID_GAMESDK_PACKED_VERSION(MAJOR, MINOR, BUGFIX) \
-    ((MAJOR << 16) | (MINOR << 8) | (BUGFIX))
+  ((MAJOR << 16) | (MINOR << 8) | (BUGFIX))
 // Accessors
 #define ANDROID_GAMESDK_MAJOR_VERSION(PACKED) ((PACKED) >> 16)
 #define ANDROID_GAMESDK_MINOR_VERSION(PACKED) (((PACKED) >> 8) & 0xff)
 #define ANDROID_GAMESDK_BUGFIX_VERSION(PACKED) ((PACKED) & 0xff)
 
-#define AGDK_STRING_VERSION(MAJOR, MINOR, BUGFIX, GIT) \
-#MAJOR "." #MINOR "." #BUGFIX "." #GIT
+#define AGDK_STRINGIFY(NUMBER) #NUMBER
+#define AGDK_STRING_VERSION(MAJOR, MINOR, BUGFIX) \
+  AGDK_STRINGIFY(MAJOR) "." AGDK_STRINGIFY(MINOR) "." AGDK_STRINGIFY(BUGFIX)
diff --git a/thirdparty/swappy-frame-pacing/swappyVk.h b/thirdparty/swappy-frame-pacing/swappyVk.h
index 020683cbc43c..654fcbf4a4a7 100644
--- a/thirdparty/swappy-frame-pacing/swappyVk.h
+++ b/thirdparty/swappy-frame-pacing/swappyVk.h
@@ -281,30 +281,30 @@ void SwappyVk_uninjectTracer(const SwappyTracer* tracer);
  * Usage of this functionality is optional.
  */
 typedef struct SwappyVkFunctionProvider {
-    /**
-     * @brief Callback to initialize the function provider.
-     *
-     * This function is called by Swappy before any functions are requested.
-     * E.g. so you can call dlopen on the Vulkan library.
-     */
-    bool (*init)();
-
-    /**
-     * @brief Callback to get the address of a function.
-     *
-     * This function is called by Swappy to get the address of a Vulkan
-     * function.
-     * @param name The null-terminated name of the function.
-     */
-    void* (*getProcAddr)(const char* name);
-
-    /**
-     * @brief Callback to close any resources owned by the function provider.
-     *
-     * This function is called by Swappy when no more functions will be
-     * requested, e.g. so you can call dlclose on the Vulkan library.
-     */
-    void (*close)();
+  /**
+   * @brief Callback to initialize the function provider.
+   *
+   * This function is called by Swappy before any functions are requested.
+   * E.g. so you can call dlopen on the Vulkan library.
+   */
+  bool (*init)();
+
+  /**
+   * @brief Callback to get the address of a function.
+   *
+   * This function is called by Swappy to get the address of a Vulkan
+   * function.
+   * @param name The null-terminated name of the function.
+   */
+  void* (*getProcAddr)(const char* name);
+
+  /**
+   * @brief Callback to close any resources owned by the function provider.
+   *
+   * This function is called by Swappy when no more functions will be
+   * requested, e.g. so you can call dlclose on the Vulkan library.
+   */
+  void (*close)();
 } SwappyVkFunctionProvider;
 
 /**
@@ -384,7 +384,8 @@ void SwappyVk_enableStats(VkSwapchainKHR swapchain, bool enabled);
 
  * @see SwappyVk_enableStats.
  */
-void SwappyVk_recordFrameStart(VkQueue queue, VkSwapchainKHR swapchain, uint32_t image);
+void SwappyVk_recordFrameStart(VkQueue queue, VkSwapchainKHR swapchain,
+                               uint32_t image);
 
 /**
  * @brief Returns the stats collected, if statistics collection was toggled on.
@@ -396,11 +397,11 @@ void SwappyVk_recordFrameStart(VkQueue queue, VkSwapchainKHR swapchain, uint32_t
  * conditions.
  *
  * @param[in]  swapchain   - The swapchain for which stats are being queried.
- * @param      swappyStats - Pointer to a SwappyStats that will be populated with
- *                             the collected stats. Cannot be NULL.
+ * @param      swappyStats - Pointer to a SwappyStats that will be populated
+ * with the collected stats. Cannot be NULL.
  * @see SwappyStats
  */
-void SwappyVk_getStats(VkSwapchainKHR swapchain, SwappyStats *swappyStats);
+void SwappyVk_getStats(VkSwapchainKHR swapchain, SwappyStats* swappyStats);
 
 /**
  * @brief Clears the frame statistics collected so far.
@@ -413,6 +414,58 @@ void SwappyVk_getStats(VkSwapchainKHR swapchain, SwappyStats *swappyStats);
  */
 void SwappyVk_clearStats(VkSwapchainKHR swapchain);
 
+/**
+ * @brief Reset the swappy pacing mechanism
+ *
+ * In cases where the frame timing history is irrelevant (for example during
+ * scene/level transitions or after loading screens), calling this would
+ * remove all the history for frame pacing. Calling this entry point
+ * would reset the frame rate to the initial state at the end of the current
+ * frame. Then swappy would just pace as normal with fresh state from next
+ * frame. There are no error conditions associated with this call.
+ *
+ * @param[in]  swapchain   - The swapchain for which frame pacing is reset.
+ */
+void SwappyVk_resetFramePacing(VkSwapchainKHR swapchain);
+
+/**
+ * @brief Enable/Disable the swappy pacing mechanism
+ *
+ * By default frame pacing is enabled when swappy is used, however it can be
+ * disabled at runtime by calling `SwappyVk_enableFramePacing(swapchain,
+ * false)`. When the frame pacing is disabled, ::SwappyVk_enableBlockingWait
+ * will control whether
+ * ::SwappyVk_queuePresent will return immediately, or will block until the
+ * previous frame's GPU work is completed. All enabling/disabling effects take
+ * place from next frame. Once disabled, `SwappyVk_enableFramePacing(swapchain,
+ * true)` will enable frame pacing again with a fresh frame time state -
+ * equivalent of calling ::SwappyVk_resetFramePacing().
+ *
+ * @param[in]  swapchain   - The swapchain for which stats are being queried.
+ * @param      enable      - If true, enables frame pacing otherwise disables it
+ */
+void SwappyVk_enableFramePacing(VkSwapchainKHR swapchain, bool enable);
+
+/**
+ * @brief Enable/Disable blocking wait when frame-pacing is disabled
+ *
+ * By default ::SwappyVk_queuePresent will do a blocking wait until previous
+ * frame's GPU work is completed. However when frame pacing is disabled, calling
+ * `SwappyVk_enableBlockingWait(swapchain, false)` will ensure that
+ * ::SwappyVk_queuePresent returns without waiting for previous frame's GPU
+ * work. This behaviour impacts the GPU time returned in the
+ * ::SwappyPostWaitCallback callback. If the last frame's GPU work is done by
+ * the time ::SwappyVk_queuePresent for this frame is called, then the previous
+ * frame's GPU time will be returned otherwise `-1` will be delivered in the
+ * callback for the frame. This setting has no impact when frame pacing is
+ * enabled.
+ *
+ * @param[in]  swapchain   - The swapchain for which stats are being queried.
+ * @param      enable      - If true, ::SwappyVk_queuePresent will block until
+ * the previous frame's GPU work is complete.
+ */
+void SwappyVk_enableBlockingWait(VkSwapchainKHR swapchain, bool enable);
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif
diff --git a/thirdparty/swappy-frame-pacing/swappy_common.h b/thirdparty/swappy-frame-pacing/swappy_common.h
index b711ca910fb3..acceb4243df6 100644
--- a/thirdparty/swappy-frame-pacing/swappy_common.h
+++ b/thirdparty/swappy-frame-pacing/swappy_common.h
@@ -48,22 +48,22 @@
 
 // Internal macros to track Swappy version, do not use directly.
 #define SWAPPY_MAJOR_VERSION 2
-#define SWAPPY_MINOR_VERSION 0
+#define SWAPPY_MINOR_VERSION 2
 #define SWAPPY_BUGFIX_VERSION 0
-#define SWAPPY_PACKED_VERSION                                                  \
-    ANDROID_GAMESDK_PACKED_VERSION(SWAPPY_MAJOR_VERSION, SWAPPY_MINOR_VERSION, \
-                                   SWAPPY_BUGFIX_VERSION)
+#define SWAPPY_PACKED_VERSION                                                \
+  ANDROID_GAMESDK_PACKED_VERSION(SWAPPY_MAJOR_VERSION, SWAPPY_MINOR_VERSION, \
+                                 SWAPPY_BUGFIX_VERSION)
 
 // Internal macros to generate a symbol to track Swappy version, do not use
 // directly.
 #define SWAPPY_VERSION_CONCAT_NX(PREFIX, MAJOR, MINOR, BUGFIX, GITCOMMIT) \
-    PREFIX##_##MAJOR##_##MINOR##_##BUGFIX##_##GITCOMMIT
+  PREFIX##_##MAJOR##_##MINOR##_##BUGFIX##_##GITCOMMIT
 #define SWAPPY_VERSION_CONCAT(PREFIX, MAJOR, MINOR, BUGFIX, GITCOMMIT) \
-    SWAPPY_VERSION_CONCAT_NX(PREFIX, MAJOR, MINOR, BUGFIX, GITCOMMIT)
-#define SWAPPY_VERSION_SYMBOL                                          \
-    SWAPPY_VERSION_CONCAT(Swappy_version, SWAPPY_MAJOR_VERSION,        \
-                          SWAPPY_MINOR_VERSION, SWAPPY_BUGFIX_VERSION, \
-                          AGDK_GIT_COMMIT)
+  SWAPPY_VERSION_CONCAT_NX(PREFIX, MAJOR, MINOR, BUGFIX, GITCOMMIT)
+#define SWAPPY_VERSION_SYMBOL                                        \
+  SWAPPY_VERSION_CONCAT(Swappy_version, SWAPPY_MAJOR_VERSION,        \
+                        SWAPPY_MINOR_VERSION, SWAPPY_BUGFIX_VERSION, \
+                        AGDK_GIT_COMMIT)
 
 // Define this to 1 to enable all logging from Swappy, by default it is
 // disabled in a release build and enabled in a debug build.
@@ -83,29 +83,29 @@ typedef uint64_t SwappyThreadId;
  * Usage of this functionality is optional.
  */
 typedef struct SwappyThreadFunctions {
-    /** @brief Thread start callback.
-     *
-     * This function is called by Swappy to start thread_func on a new thread.
-     * @param user_data A value to be passed the thread function.
-     * If the thread was started, this function should set the thread_id and
-     * return 0. If the thread was not started, this function should return a
-     * non-zero value.
-     */
-    int (*start)(SwappyThreadId* thread_id, void* (*thread_func)(void*),
-                 void* user_data);
-
-    /** @brief Thread join callback.
-     *
-     * This function is called by Swappy to join the thread with given id.
-     */
-    void (*join)(SwappyThreadId thread_id);
-
-    /** @brief Thread joinable callback.
-     *
-     * This function is called by Swappy to discover whether the thread with the
-     * given id is joinable.
-     */
-    bool (*joinable)(SwappyThreadId thread_id);
+  /** @brief Thread start callback.
+   *
+   * This function is called by Swappy to start thread_func on a new thread.
+   * @param user_data A value to be passed the thread function.
+   * If the thread was started, this function should set the thread_id and
+   * return 0. If the thread was not started, this function should return a
+   * non-zero value.
+   */
+  int (*start)(SwappyThreadId* thread_id, void* (*thread_func)(void*),
+               void* user_data);
+
+  /** @brief Thread join callback.
+   *
+   * This function is called by Swappy to join the thread with given id.
+   */
+  void (*join)(SwappyThreadId thread_id);
+
+  /** @brief Thread joinable callback.
+   *
+   * This function is called by Swappy to discover whether the thread with the
+   * given id is joinable.
+   */
+  bool (*joinable)(SwappyThreadId thread_id);
 } SwappyThreadFunctions;
 
 #ifdef __cplusplus
@@ -138,47 +138,46 @@ const char* Swappy_versionString();
  * ::SwappyGL_enableStats or ::SwappyVk_enableStats.
  */
 typedef struct SwappyStats {
-    /** @brief Total frames swapped by swappy */
-    uint64_t totalFrames;
-
-    /** @brief Histogram of the number of screen refreshes a frame waited in the
-     * compositor queue after rendering was completed.
-     *
-     * For example:
-     *     if a frame waited 2 refresh periods in the compositor queue after
-     * rendering was done, the frame will be counted in idleFrames[2]
-     */
-    uint64_t idleFrames[MAX_FRAME_BUCKETS];
-
-    /** @brief Histogram of the number of screen refreshes passed between the
-     * requested presentation time and the actual present time.
-     *
-     * For example:
-     *     if a frame was presented 2 refresh periods after the requested
-     * timestamp swappy set, the frame will be counted in lateFrames[2]
-     */
-    uint64_t lateFrames[MAX_FRAME_BUCKETS];
-
-    /** @brief Histogram of the number of screen refreshes passed between two
-     * consecutive frames
-     *
-     * For example:
-     *     if frame N was presented 2 refresh periods after frame N-1
-     *     frame N will be counted in offsetFromPreviousFrame[2]
-     */
-    uint64_t offsetFromPreviousFrame[MAX_FRAME_BUCKETS];
-
-    /** @brief Histogram of the number of screen refreshes passed between the
-     * call to Swappy_recordFrameStart and the actual present time.
-     *
-     * For example:
-     *     if a frame was presented 2 refresh periods after the call to
-     * `Swappy_recordFrameStart` the frame will be counted in latencyFrames[2]
-     */
-    uint64_t latencyFrames[MAX_FRAME_BUCKETS];
+  /** @brief Total frames swapped by swappy */
+  uint64_t totalFrames;
+
+  /** @brief Histogram of the number of screen refreshes a frame waited in the
+   * compositor queue after rendering was completed.
+   *
+   * For example:
+   *     if a frame waited 2 refresh periods in the compositor queue after
+   * rendering was done, the frame will be counted in idleFrames[2]
+   */
+  uint64_t idleFrames[MAX_FRAME_BUCKETS];
+
+  /** @brief Histogram of the number of screen refreshes passed between the
+   * requested presentation time and the actual present time.
+   *
+   * For example:
+   *     if a frame was presented 2 refresh periods after the requested
+   * timestamp swappy set, the frame will be counted in lateFrames[2]
+   */
+  uint64_t lateFrames[MAX_FRAME_BUCKETS];
+
+  /** @brief Histogram of the number of screen refreshes passed between two
+   * consecutive frames
+   *
+   * For example:
+   *     if frame N was presented 2 refresh periods after frame N-1
+   *     frame N will be counted in offsetFromPreviousFrame[2]
+   */
+  uint64_t offsetFromPreviousFrame[MAX_FRAME_BUCKETS];
+
+  /** @brief Histogram of the number of screen refreshes passed between the
+   * call to Swappy_recordFrameStart and the actual present time.
+   *
+   * For example:
+   *     if a frame was presented 2 refresh periods after the call to
+   * `Swappy_recordFrameStart` the frame will be counted in latencyFrames[2]
+   */
+  uint64_t latencyFrames[MAX_FRAME_BUCKETS];
 } SwappyStats;
 
-
 #ifdef __cplusplus
 }  // extern "C"
 #endif
@@ -236,43 +235,43 @@ typedef void (*SwappySwapIntervalChangedCallback)(void*);
  * Injection of these is optional.
  */
 typedef struct SwappyTracer {
-    /**
-     * Callback called before waiting to queue the frame to the composer.
-     */
-    SwappyPreWaitCallback preWait;
-
-    /**
-     * Callback called after wait to queue the frame to the composer is done.
-     */
-    SwappyPostWaitCallback postWait;
-
-    /**
-     * Callback called before calling the function to queue the frame to the
-     * composer.
-     */
-    SwappyPreSwapBuffersCallback preSwapBuffers;
-
-    /**
-     * Callback called after calling the function to queue the frame to the
-     * composer.
-     */
-    SwappyPostSwapBuffersCallback postSwapBuffers;
-
-    /**
-     * Callback called at the start of a frame.
-     */
-    SwappyStartFrameCallback startFrame;
-
-    /**
-     * Pointer to some arbitrary data that will be passed as the first argument
-     * of callbacks.
-     */
-    void* userData;
-
-    /**
-     * Callback called when the swap interval was changed.
-     */
-    SwappySwapIntervalChangedCallback swapIntervalChanged;
+  /**
+   * Callback called before waiting to queue the frame to the composer.
+   */
+  SwappyPreWaitCallback preWait;
+
+  /**
+   * Callback called after wait to queue the frame to the composer is done.
+   */
+  SwappyPostWaitCallback postWait;
+
+  /**
+   * Callback called before calling the function to queue the frame to the
+   * composer.
+   */
+  SwappyPreSwapBuffersCallback preSwapBuffers;
+
+  /**
+   * Callback called after calling the function to queue the frame to the
+   * composer.
+   */
+  SwappyPostSwapBuffersCallback postSwapBuffers;
+
+  /**
+   * Callback called at the start of a frame.
+   */
+  SwappyStartFrameCallback startFrame;
+
+  /**
+   * Pointer to some arbitrary data that will be passed as the first argument
+   * of callbacks.
+   */
+  void* userData;
+
+  /**
+   * Callback called when the swap interval was changed.
+   */
+  SwappySwapIntervalChangedCallback swapIntervalChanged;
 } SwappyTracer;
 
 /** @} */


Test patch: