summaryrefslogtreecommitdiffstats
path: root/src/video_core
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2023-06-02 02:57:49 +0200
committerbunnei <bunneidev@gmail.com>2023-06-03 09:06:07 +0200
commit057117f0096a47b07f9070d48a0dbd952ab0522e (patch)
treeb3364fb9ad8e94d16691acc7831d477d975188ff /src/video_core
parentandroid: Enable overlay scale/opacity dialog (diff)
downloadyuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.tar
yuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.tar.gz
yuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.tar.bz2
yuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.tar.lz
yuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.tar.xz
yuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.tar.zst
yuzu-057117f0096a47b07f9070d48a0dbd952ab0522e.zip
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_vulkan/vk_blit_screen.cpp55
1 files changed, 47 insertions, 8 deletions
diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
index e4c581a28..7cdde992b 100644
--- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp
+++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp
@@ -37,6 +37,10 @@
#include "video_core/vulkan_common/vulkan_memory_allocator.h"
#include "video_core/vulkan_common/vulkan_wrapper.h"
+#ifdef ANDROID
+extern u32 GetAndroidScreenRotation();
+#endif
+
namespace Vulkan {
namespace {
@@ -74,23 +78,58 @@ struct ScreenRectVertex {
}
};
-constexpr std::array<f32, 4 * 4> MakeOrthographicMatrix(f32 width, f32 height) {
- // clang-format off
#ifdef ANDROID
- // Android renders in portrait, so rotate the matrix.
- return { 0.f, 2.f / width, 0.f, 0.f,
- -2.f / height, 0.f, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 1.f, -1.f, 0.f, 1.f};
+
+std::array<f32, 4 * 4> MakeOrthographicMatrix(f32 width, f32 height) {
+ constexpr u32 ROTATION_0 = 0;
+ constexpr u32 ROTATION_90 = 1;
+ constexpr u32 ROTATION_180 = 2;
+ constexpr u32 ROTATION_270 = 3;
+
+ // clang-format off
+ switch (GetAndroidScreenRotation()) {
+ case ROTATION_0:
+ // Desktop
+ return { 2.f / width, 0.f, 0.f, 0.f,
+ 0.f, 2.f / height, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ -1.f, -1.f, 0.f, 1.f};
+ case ROTATION_180:
+ // Reverse desktop
+ return {-2.f / width, 0.f, 0.f, 0.f,
+ 0.f, -2.f / height, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ 1.f, 1.f, 0.f, 1.f};
+ case ROTATION_270:
+ // Reverse landscape
+ return { 0.f, -2.f / width, 0.f, 0.f,
+ 2.f / height, 0.f, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ -1.f, 1.f, 0.f, 1.f};
+ case ROTATION_90:
+ default:
+ // Landscape
+ return { 0.f, 2.f / width, 0.f, 0.f,
+ -2.f / height, 0.f, 0.f, 0.f,
+ 0.f, 0.f, 1.f, 0.f,
+ 1.f, -1.f, 0.f, 1.f};
+ }
+ // clang-format on
+}
+
#else
+
+std::array<f32, 4 * 4> MakeOrthographicMatrix(f32 width, f32 height) {
+ // clang-format off
return { 2.f / width, 0.f, 0.f, 0.f,
0.f, 2.f / height, 0.f, 0.f,
0.f, 0.f, 1.f, 0.f,
-1.f, -1.f, 0.f, 1.f};
-#endif // ANDROID
// clang-format on
}
+#endif
+
u32 GetBytesPerPixel(const Tegra::FramebufferConfig& framebuffer) {
using namespace VideoCore::Surface;
return BytesPerBlock(PixelFormatFromGPUPixelFormat(framebuffer.pixel_format));