diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index d01cef531..484069d83 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -285,7 +285,6 @@ bool Instance::CreateDevice() { }; AddExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); - AddExtension(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); AddExtension(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME); timeline_semaphores = AddExtension(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME); extended_dynamic_state = AddExtension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 81924be34..d550de928 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -6,7 +6,6 @@ #include "common/common_paths.h" #include "common/file_util.h" #include "common/logging/log.h" -#include "common/microprofile.h" #include "core/settings.h" #include "video_core/renderer_vulkan/pica_to_vk.h" #include "video_core/renderer_vulkan/vk_instance.h" @@ -491,11 +490,7 @@ vk::Pipeline PipelineCache::BuildPipeline(const PipelineInfo& info) { const vk::Rect2D scissor = {.offset = {0, 0}, .extent = {1, 1}}; - vk::PipelineViewportDepthClipControlCreateInfoEXT depth_clip_control = {.negativeOneToOne = - true}; - const vk::PipelineViewportStateCreateInfo viewport_info = { - .pNext = &depth_clip_control, .viewportCount = 1, .pViewports = &viewport, .scissorCount = 1, diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index 40afc225c..8130fa42f 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -49,9 +49,7 @@ vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::EmuWindow& e LOG_ERROR(Render_Vulkan, "Failed to initialize Xlib surface"); UNREACHABLE(); } - } - - if (window_info.type == Frontend::WindowSystemType::Wayland) { + } else if (window_info.type == Frontend::WindowSystemType::Wayland) { const vk::WaylandSurfaceCreateInfoKHR wayland_ci = { .display = static_cast(window_info.display_connection), .surface = static_cast(window_info.render_surface)}; @@ -73,10 +71,22 @@ vk::SurfaceKHR CreateSurface(vk::Instance instance, const Frontend::EmuWindow& e UNREACHABLE(); } } +#elif defined(VK_USE_PLATFORM_ANDROID_KHR) + if (window_info.type == Frontend::WindowSystemType::Android) { + vk::AndroidSurfaceCreateInfoKHR android_ci = { + .window = reinterpret_cast(window_info.render_surface) + }; + + if (instance.createAndroidSurfaceKHR(&android_ci, nullptr, &surface) != vk::Result::eSuccess) { + LOG_CRITICAL(Render_Vulkan, "Failed to initialize Android surface"); + UNREACHABLE(); + } + } #endif if (!surface) { LOG_CRITICAL(Render_Vulkan, "Presentation not supported on this platform"); + UNREACHABLE(); } return surface; @@ -112,6 +122,10 @@ std::vector GetInstanceExtensions(Frontend::WindowSystemType window case Frontend::WindowSystemType::MacOS: extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME); break; +#elif defined(VK_USE_PLATFORM_ANDROID_KHR) + case Frontend::WindowSystemType::Android: + extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); + break; #endif default: LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform"); diff --git a/src/video_core/renderer_vulkan/vk_shader_gen.cpp b/src/video_core/renderer_vulkan/vk_shader_gen.cpp index 45bd6d4fb..fa9602246 100644 --- a/src/video_core/renderer_vulkan/vk_shader_gen.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_gen.cpp @@ -1601,6 +1601,7 @@ void main() { normquat = vert_normquat; view = vert_view; gl_Position = vert_position; + gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0; gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0 if (enable_clip1) { @@ -1770,6 +1771,7 @@ struct Vertex { semantic(VSOutputAttributes::POSITION_Z) + ", " + semantic(VSOutputAttributes::POSITION_W) + ");\n"; out += " gl_Position = vtx_pos;\n"; + out += " gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\n"; out += "#if !defined(CITRA_GLES) || defined(GL_EXT_clip_cull_distance)\n"; out += " gl_ClipDistance[0] = -vtx_pos.z;\n"; // fixed PICA clipping plane z <= 0 out += " gl_ClipDistance[1] = dot(clip_coef, vtx_pos);\n";