Skip to content

Commit 2b49543

Browse files
committed
Merge pull request godotengine#98709 from darksylinc/matias-upsidedown-splash
Fix splash screen upside down on Android
2 parents 0a2a259 + b9a2f10 commit 2b49543

File tree

12 files changed

+42
-53
lines changed

12 files changed

+42
-53
lines changed

drivers/vulkan/rendering_device_driver_vulkan.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2996,6 +2996,24 @@ Error RenderingDeviceDriverVulkan::swap_chain_resize(CommandQueueID p_cmd_queue,
29962996
swap_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
29972997
swap_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
29982998
swap_create_info.preTransform = surface_transform_bits;
2999+
switch (swap_create_info.preTransform) {
3000+
case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
3001+
swap_chain->pre_transform_rotation_degrees = 0;
3002+
break;
3003+
case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
3004+
swap_chain->pre_transform_rotation_degrees = 90;
3005+
break;
3006+
case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
3007+
swap_chain->pre_transform_rotation_degrees = 180;
3008+
break;
3009+
case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
3010+
swap_chain->pre_transform_rotation_degrees = 270;
3011+
break;
3012+
default:
3013+
WARN_PRINT("Unexpected swap_create_info.preTransform = " + itos(swap_create_info.preTransform) + ".");
3014+
swap_chain->pre_transform_rotation_degrees = 0;
3015+
break;
3016+
}
29993017
swap_create_info.compositeAlpha = composite_alpha;
30003018
swap_create_info.presentMode = present_mode;
30013019
swap_create_info.clipped = true;
@@ -3167,6 +3185,13 @@ RDD::RenderPassID RenderingDeviceDriverVulkan::swap_chain_get_render_pass(SwapCh
31673185
return swap_chain->render_pass;
31683186
}
31693187

3188+
int RenderingDeviceDriverVulkan::swap_chain_get_pre_rotation_degrees(SwapChainID p_swap_chain) {
3189+
DEV_ASSERT(p_swap_chain.id != 0);
3190+
3191+
SwapChain *swap_chain = (SwapChain *)(p_swap_chain.id);
3192+
return swap_chain->pre_transform_rotation_degrees;
3193+
}
3194+
31703195
RDD::DataFormat RenderingDeviceDriverVulkan::swap_chain_get_format(SwapChainID p_swap_chain) {
31713196
DEV_ASSERT(p_swap_chain.id != 0);
31723197

drivers/vulkan/rendering_device_driver_vulkan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
359359
LocalVector<CommandQueue *> command_queues_acquired;
360360
LocalVector<uint32_t> command_queues_acquired_semaphores;
361361
RenderPassID render_pass;
362+
int pre_transform_rotation_degrees = 0;
362363
uint32_t image_index = 0;
363364
#ifdef ANDROID_ENABLED
364365
uint64_t refresh_duration = 0;
@@ -373,6 +374,7 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
373374
virtual Error swap_chain_resize(CommandQueueID p_cmd_queue, SwapChainID p_swap_chain, uint32_t p_desired_framebuffer_count) override final;
374375
virtual FramebufferID swap_chain_acquire_framebuffer(CommandQueueID p_cmd_queue, SwapChainID p_swap_chain, bool &r_resize_required) override final;
375376
virtual RenderPassID swap_chain_get_render_pass(SwapChainID p_swap_chain) override final;
377+
virtual int swap_chain_get_pre_rotation_degrees(SwapChainID p_swap_chain) override final;
376378
virtual DataFormat swap_chain_get_format(SwapChainID p_swap_chain) override final;
377379
virtual void swap_chain_set_max_fps(SwapChainID p_swap_chain, int p_max_fps) override final;
378380
virtual void swap_chain_free(SwapChainID p_swap_chain) override final;

platform/android/display_server_android.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,6 @@ DisplayServer::ScreenOrientation DisplayServerAndroid::screen_get_orientation(in
243243
return (ScreenOrientation)orientation;
244244
}
245245

246-
int DisplayServerAndroid::screen_get_internal_current_rotation(int p_screen) const {
247-
GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java();
248-
ERR_FAIL_NULL_V(godot_io_java, 0);
249-
250-
const int rotation = godot_io_java->get_internal_current_screen_rotation();
251-
return rotation;
252-
}
253-
254246
int DisplayServerAndroid::get_screen_count() const {
255247
return 1;
256248
}

platform/android/display_server_android.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ class DisplayServerAndroid : public DisplayServer {
133133

134134
virtual void screen_set_orientation(ScreenOrientation p_orientation, int p_screen = SCREEN_OF_MAIN_WINDOW) override;
135135
virtual ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const override;
136-
virtual int screen_get_internal_current_rotation(int p_screen) const override;
137136

138137
virtual int get_screen_count() const override;
139138
virtual int get_primary_screen() const override;

platform/android/java/lib/src/org/godotengine/godot/GodotIO.java

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -296,28 +296,6 @@ public int getScreenOrientation() {
296296
}
297297
}
298298

299-
/**
300-
This function is used by DisplayServer::screen_get_internal_current_rotation (C++)
301-
and is used to implement a performance optimization in devices that do not offer
302-
a HW rotator.
303-
@return
304-
Rotation in degrees, in multiples of 90°
305-
*/
306-
public int getInternalCurrentScreenRotation() {
307-
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
308-
309-
switch (rotation) {
310-
case Surface.ROTATION_90:
311-
return 90;
312-
case Surface.ROTATION_180:
313-
return 180;
314-
case Surface.ROTATION_270:
315-
return 270;
316-
default:
317-
return 0;
318-
}
319-
}
320-
321299
public void setEdit(GodotEditText _edit) {
322300
edit = _edit;
323301
}

platform/android/java_godot_io_wrapper.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ GodotIOJavaWrapper::GodotIOJavaWrapper(JNIEnv *p_env, jobject p_godot_io_instanc
6666
_has_hardware_keyboard = p_env->GetMethodID(cls, "hasHardwareKeyboard", "()Z");
6767
_set_screen_orientation = p_env->GetMethodID(cls, "setScreenOrientation", "(I)V");
6868
_get_screen_orientation = p_env->GetMethodID(cls, "getScreenOrientation", "()I");
69-
_get_internal_current_screen_rotation = p_env->GetMethodID(cls, "getInternalCurrentScreenRotation", "()I");
7069
_get_system_dir = p_env->GetMethodID(cls, "getSystemDir", "(IZ)Ljava/lang/String;");
7170
}
7271
}
@@ -268,16 +267,6 @@ int GodotIOJavaWrapper::get_screen_orientation() {
268267
}
269268
}
270269

271-
int GodotIOJavaWrapper::get_internal_current_screen_rotation() {
272-
if (_get_internal_current_screen_rotation) {
273-
JNIEnv *env = get_jni_env();
274-
ERR_FAIL_NULL_V(env, 0);
275-
return env->CallIntMethod(godot_io_instance, _get_internal_current_screen_rotation);
276-
} else {
277-
return 0;
278-
}
279-
}
280-
281270
String GodotIOJavaWrapper::get_system_dir(int p_dir, bool p_shared_storage) {
282271
if (_get_system_dir) {
283272
JNIEnv *env = get_jni_env();

platform/android/java_godot_io_wrapper.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ class GodotIOJavaWrapper {
6161
jmethodID _has_hardware_keyboard = 0;
6262
jmethodID _set_screen_orientation = 0;
6363
jmethodID _get_screen_orientation = 0;
64-
jmethodID _get_internal_current_screen_rotation = 0;
6564
jmethodID _get_system_dir = 0;
6665

6766
public:
@@ -89,7 +88,6 @@ class GodotIOJavaWrapper {
8988
void set_vk_height(int p_height);
9089
void set_screen_orientation(int p_orient);
9190
int get_screen_orientation();
92-
int get_internal_current_screen_rotation();
9391
String get_system_dir(int p_dir, bool p_shared_storage);
9492
};
9593

servers/display_server.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -361,13 +361,6 @@ class DisplayServer : public Object {
361361

362362
virtual void screen_set_orientation(ScreenOrientation p_orientation, int p_screen = SCREEN_OF_MAIN_WINDOW);
363363
virtual ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const;
364-
// Note: The "internal" current orientation is not necessarily the current orientation and will often be 0 for most platforms.
365-
//
366-
// Some Android GPUs come with a HW-based rotator which means the screen gets rotated for free to
367-
// whatever orientation the device is currently facing. But many Android GPUs emulate it via SW instead,
368-
// which costs performance and power. This value is an optimization that tells Godot's compositor how to
369-
// rotate the render texture before presenting to screen so that Android's compositor doesn't have to.
370-
virtual int screen_get_internal_current_rotation(int p_screen = SCREEN_OF_MAIN_WINDOW) const { return 0; }
371364

372365
virtual void screen_set_keep_on(bool p_enable); //disable screensaver
373366
virtual bool screen_is_kept_on() const;

servers/rendering/renderer_rd/renderer_compositor_rd.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void RendererCompositorRD::blit_render_targets_to_screen(DisplayServer::WindowID
6767
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, render_target_descriptors[rd_texture], 0);
6868

6969
// We need to invert the phone rotation.
70-
int screen_rotation_degrees = -DisplayServer::get_singleton()->screen_get_internal_current_rotation();
70+
const int screen_rotation_degrees = -RD::get_singleton()->screen_get_pre_rotation_degrees(p_screen);
7171
float screen_rotation = Math::deg_to_rad((float)screen_rotation_degrees);
7272

7373
blit.push_constant.rotation_cos = Math::cos(screen_rotation);
@@ -238,7 +238,7 @@ void RendererCompositorRD::set_boot_image(const Ref<Image> &p_image, const Color
238238
RD::get_singleton()->draw_list_bind_index_array(draw_list, blit.array);
239239
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uset, 0);
240240

241-
int screen_rotation_degrees = DisplayServer::get_singleton()->screen_get_internal_current_rotation();
241+
const int screen_rotation_degrees = -RD::get_singleton()->screen_get_pre_rotation_degrees(DisplayServer::MAIN_WINDOW_ID);
242242
float screen_rotation = Math::deg_to_rad((float)screen_rotation_degrees);
243243
blit.push_constant.rotation_cos = Math::cos(screen_rotation);
244244
blit.push_constant.rotation_sin = Math::sin(screen_rotation);

servers/rendering/rendering_device.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3757,6 +3757,15 @@ int RenderingDevice::screen_get_height(DisplayServer::WindowID p_screen) const {
37573757
return context->surface_get_height(surface);
37583758
}
37593759

3760+
int RenderingDevice::screen_get_pre_rotation_degrees(DisplayServer::WindowID p_screen) const {
3761+
_THREAD_SAFE_METHOD_
3762+
3763+
HashMap<DisplayServer::WindowID, RDD::SwapChainID>::ConstIterator it = screen_swap_chains.find(p_screen);
3764+
ERR_FAIL_COND_V_MSG(it == screen_swap_chains.end(), ERR_CANT_CREATE, "A swap chain was not created for the screen.");
3765+
3766+
return driver->swap_chain_get_pre_rotation_degrees(it->value);
3767+
}
3768+
37603769
RenderingDevice::FramebufferFormatID RenderingDevice::screen_get_framebuffer_format(DisplayServer::WindowID p_screen) const {
37613770
_THREAD_SAFE_METHOD_
37623771

0 commit comments

Comments
 (0)