Ported GPUCode's Android Vulkan stability fixes

Thanks!
This commit is contained in:
OpenSauce04 2024-04-07 15:58:39 +01:00
parent 127244a1d0
commit 3bc0312b45
7 changed files with 23 additions and 17 deletions

View File

@ -85,10 +85,6 @@ class EmulationActivity : AppCompatActivity() {
windowManager.defaultDisplay.rotation windowManager.defaultDisplay.rotation
) )
// Start a foreground service to prevent the app from getting killed in the background
foregroundService = Intent(this, ForegroundService::class.java)
startForegroundService(foregroundService)
EmulationLifecycleUtil.addShutdownHook(hook = { this.finish() }) EmulationLifecycleUtil.addShutdownHook(hook = { this.finish() })
} }
@ -112,7 +108,6 @@ class EmulationActivity : AppCompatActivity() {
override fun onDestroy() { override fun onDestroy() {
EmulationLifecycleUtil.clear() EmulationLifecycleUtil.clear()
stopForegroundService(this)
super.onDestroy() super.onDestroy()
} }

View File

@ -27,7 +27,11 @@ static void UpdateLandscapeScreenLayout() {
IDCache::GetNativeLibraryClass(), IDCache::GetLandscapeScreenLayout())); IDCache::GetNativeLibraryClass(), IDCache::GetLandscapeScreenLayout()));
} }
void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) { bool EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
if (render_window == surface) {
return false;
}
render_window = surface; render_window = surface;
window_info.type = Frontend::WindowSystemType::Android; window_info.type = Frontend::WindowSystemType::Android;
@ -35,6 +39,8 @@ void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) {
StopPresenting(); StopPresenting();
OnFramebufferSizeChanged(); OnFramebufferSizeChanged();
return true;
} }
bool EmuWindow_Android::OnTouchEvent(int x, int y, bool pressed) { bool EmuWindow_Android::OnTouchEvent(int x, int y, bool pressed) {

View File

@ -17,7 +17,7 @@ public:
~EmuWindow_Android(); ~EmuWindow_Android();
/// Called by the onSurfaceChanges() method to change the surface /// Called by the onSurfaceChanges() method to change the surface
void OnSurfaceChanged(ANativeWindow* surface); bool OnSurfaceChanged(ANativeWindow* surface);
/// Handles touch event that occur.(Touched or released) /// Handles touch event that occur.(Touched or released)
bool OnTouchEvent(int x, int y, bool pressed); bool OnTouchEvent(int x, int y, bool pressed);

View File

@ -289,12 +289,13 @@ void Java_io_github_lime3ds_android_NativeLibrary_surfaceChanged(JNIEnv* env,
jobject surf) { jobject surf) {
s_surf = ANativeWindow_fromSurface(env, surf); s_surf = ANativeWindow_fromSurface(env, surf);
bool notify = false;
if (window) { if (window) {
window->OnSurfaceChanged(s_surf); notify = window->OnSurfaceChanged(s_surf);
} }
auto& system = Core::System::GetInstance(); auto& system = Core::System::GetInstance();
if (system.IsPoweredOn()) { if (notify && system.IsPoweredOn()) {
system.GPU().Renderer().NotifySurfaceChanged(); system.GPU().Renderer().NotifySurfaceChanged();
} }

View File

@ -82,7 +82,7 @@ constexpr std::array<vk::DescriptorSetLayoutBinding, 7> SHADOW_BINDINGS = {{
PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
RenderpassCache& renderpass_cache_, DescriptorPool& pool_) RenderpassCache& renderpass_cache_, DescriptorPool& pool_)
: instance{instance_}, scheduler{scheduler_}, renderpass_cache{renderpass_cache_}, pool{pool_}, : instance{instance_}, scheduler{scheduler_}, renderpass_cache{renderpass_cache_}, pool{pool_},
num_worker_threads{std::max(std::thread::hardware_concurrency(), 2U)}, num_worker_threads{std::max(std::thread::hardware_concurrency() >> 1, 2U)},
workers{num_worker_threads, "Pipeline workers"}, workers{num_worker_threads, "Pipeline workers"},
descriptor_set_providers{DescriptorSetProvider{instance, pool, BUFFER_BINDINGS}, descriptor_set_providers{DescriptorSetProvider{instance, pool, BUFFER_BINDINGS},
DescriptorSetProvider{instance, pool, TEXTURE_BINDINGS}, DescriptorSetProvider{instance, pool, TEXTURE_BINDINGS},

View File

@ -473,7 +473,7 @@ void PresentWindow::CopyToSwapchain(Frame* frame) {
.pSignalSemaphores = &present_ready, .pSignalSemaphores = &present_ready,
}; };
std::scoped_lock submit_lock{scheduler.submit_mutex}; std::scoped_lock submit_lock{scheduler.submit_mutex, recreate_surface_mutex};
try { try {
graphics_queue.submit(submit_info, frame->present_done); graphics_queue.submit(submit_info, frame->present_done);

View File

@ -78,9 +78,13 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) {
} }
bool Swapchain::AcquireNextImage() { bool Swapchain::AcquireNextImage() {
if (needs_recreation) {
return false;
}
MICROPROFILE_SCOPE(Vulkan_Acquire); MICROPROFILE_SCOPE(Vulkan_Acquire);
vk::Device device = instance.GetDevice(); const vk::Device device = instance.GetDevice();
vk::Result result = const vk::Result result =
device.acquireNextImageKHR(swapchain, std::numeric_limits<u64>::max(), device.acquireNextImageKHR(swapchain, std::numeric_limits<u64>::max(),
image_acquired[frame_index], VK_NULL_HANDLE, &image_index); image_acquired[frame_index], VK_NULL_HANDLE, &image_index);
@ -102,10 +106,6 @@ bool Swapchain::AcquireNextImage() {
} }
void Swapchain::Present() { void Swapchain::Present() {
if (needs_recreation) {
return;
}
const vk::PresentInfoKHR present_info = { const vk::PresentInfoKHR present_info = {
.waitSemaphoreCount = 1, .waitSemaphoreCount = 1,
.pWaitSemaphores = &present_ready[image_index], .pWaitSemaphores = &present_ready[image_index],
@ -119,6 +119,10 @@ void Swapchain::Present() {
[[maybe_unused]] vk::Result result = instance.GetPresentQueue().presentKHR(present_info); [[maybe_unused]] vk::Result result = instance.GetPresentQueue().presentKHR(present_info);
} catch (vk::OutOfDateKHRError&) { } catch (vk::OutOfDateKHRError&) {
needs_recreation = true; needs_recreation = true;
return;
} catch (vk::SurfaceLostKHRError&) {
needs_recreation = true;
return;
} catch (const vk::SystemError& err) { } catch (const vk::SystemError& err) {
LOG_CRITICAL(Render_Vulkan, "Swapchain presentation failed {}", err.what()); LOG_CRITICAL(Render_Vulkan, "Swapchain presentation failed {}", err.what());
UNREACHABLE(); UNREACHABLE();