diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index ce1aa081..cb4fecd3 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -176,8 +176,8 @@ void VideoOutDriver::Flip(std::chrono::microseconds timeout) { requests.pop(); } - if (!renderer->ShowSplash( - req.frame)) { // Whatever the game is rendering show splash if it is active + // Whatever the game is rendering show splash if it is active + if (!renderer->ShowSplash(req.frame)) { // Present the frame. renderer->Present(req.frame); } diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 654f7e77..2c351116 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -166,18 +166,20 @@ bool RendererVulkan::ShowSplash(Frame* frame /*= nullptr*/) { } if (!frame) { - const auto* splash = Common::Singleton::Instance(); + if (!splash_img.has_value()) { + const auto* splash = Common::Singleton::Instance(); - VideoCore::ImageInfo info{}; - info.pixel_format = vk::Format::eR8G8B8A8Srgb; - info.type = vk::ImageType::e2D; - info.size = - VideoCore::Extent3D{splash->GetImageInfo().width, splash->GetImageInfo().height, 1}; - info.pitch = splash->GetImageInfo().width * 4; - info.guest_size_bytes = splash->GetImageData().size(); - auto& image = texture_cache.FindImage(info, VAddr(splash->GetImageData().data())); - - frame = PrepareFrameInternal(image); + VideoCore::ImageInfo info{}; + info.pixel_format = vk::Format::eR8G8B8A8Srgb; + info.type = vk::ImageType::e2D; + info.size = + VideoCore::Extent3D{splash->GetImageInfo().width, splash->GetImageInfo().height, 1}; + info.pitch = splash->GetImageInfo().width * 4; + info.guest_size_bytes = splash->GetImageData().size(); + splash_img.emplace(instance, scheduler, info, VAddr(splash->GetImageData().data())); + texture_cache.RefreshImage(*splash_img); + } + frame = PrepareFrameInternal(*splash_img); } Present(frame); return true; diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index d3eb7985..3c7d0d6b 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -54,6 +54,7 @@ private: std::mutex free_mutex; std::condition_variable free_cv; std::condition_variable_any frame_cv; + std::optional splash_img; }; } // namespace Vulkan diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 36a5966b..ac4df300 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -35,6 +35,9 @@ public: /// Retrieves the image handle of the image with the provided attributes and address. Image& FindImage(const ImageInfo& info, VAddr cpu_address); + /// Reuploads image contents. + void RefreshImage(Image& image); + private: /// Iterate over all page indices in a range template @@ -93,9 +96,6 @@ private: /// Create an image from the given parameters [[nodiscard]] ImageId InsertImage(const ImageInfo& info, VAddr cpu_addr); - /// Reuploads image contents. - void RefreshImage(Image& image); - /// Register image in the page table void RegisterImage(ImageId image);