splash functionality restored

This commit is contained in:
psucien 2024-11-21 00:00:10 +01:00
parent bd0b27bfd6
commit f6b5735402
3 changed files with 67 additions and 3 deletions

View File

@ -201,6 +201,9 @@ void VideoOutDriver::Flip(const Request& req) {
} }
void VideoOutDriver::DrawBlankFrame() { void VideoOutDriver::DrawBlankFrame() {
if (presenter->ShowSplash(nullptr)) {
return;
}
const auto empty_frame = presenter->PrepareBlankFrame(false); const auto empty_frame = presenter->PrepareBlankFrame(false);
presenter->Present(empty_frame); presenter->Present(empty_frame);
} }

View File

@ -407,6 +407,9 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) {
return false; return false;
} }
draw_scheduler.EndRendering();
const auto cmdbuf = draw_scheduler.CommandBuffer();
if (!frame) { if (!frame) {
if (!splash_img.has_value()) { if (!splash_img.has_value()) {
VideoCore::ImageInfo info{}; VideoCore::ImageInfo info{};
@ -417,11 +420,69 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) {
info.pitch = splash->GetImageInfo().width; info.pitch = splash->GetImageInfo().width;
info.guest_address = VAddr(splash->GetImageData().data()); info.guest_address = VAddr(splash->GetImageData().data());
info.guest_size_bytes = splash->GetImageData().size(); info.guest_size_bytes = splash->GetImageData().size();
info.mips_layout.emplace_back(splash->GetImageData().size(),
splash->GetImageInfo().width,
splash->GetImageInfo().height, 0);
splash_img.emplace(instance, present_scheduler, info); splash_img.emplace(instance, present_scheduler, info);
texture_cache.RefreshImage(*splash_img); texture_cache.RefreshImage(*splash_img);
splash_img->Transit(vk::ImageLayout::eTransferSrcOptimal,
vk::AccessFlagBits2::eTransferRead, {}, cmdbuf);
} }
// frame = PrepareFrameInternal(*splash_img);
frame = GetRenderFrame();
} }
const auto frame_subresources = vk::ImageSubresourceRange{
.aspectMask = vk::ImageAspectFlagBits::eColor,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
};
const auto pre_barrier =
vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
.srcAccessMask = vk::AccessFlagBits2::eTransferRead,
.dstStageMask = vk::PipelineStageFlagBits2::eTransfer,
.dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
.oldLayout = vk::ImageLayout::eUndefined,
.newLayout = vk::ImageLayout::eTransferDstOptimal,
.image = frame->image,
.subresourceRange{frame_subresources}};
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &pre_barrier,
});
cmdbuf.blitImage(splash_img->image, vk::ImageLayout::eTransferSrcOptimal, frame->image,
vk::ImageLayout::eTransferDstOptimal,
MakeImageBlitFit(splash->GetImageInfo().width, splash->GetImageInfo().height,
frame->width, frame->height),
vk::Filter::eLinear);
const auto post_barrier =
vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
.srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
.dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
.dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite,
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
.newLayout = vk::ImageLayout::eGeneral,
.image = frame->image,
.subresourceRange{frame_subresources}};
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &post_barrier,
});
// Flush frame creation commands.
frame->ready_semaphore = draw_scheduler.GetMasterSemaphore()->Handle();
frame->ready_tick = draw_scheduler.CurrentTick();
SubmitInfo info{};
draw_scheduler.Flush(info);
Present(frame); Present(frame);
return true; return true;
} }

View File

@ -28,7 +28,7 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler&
info.num_bits = 32; info.num_bits = 32;
info.UpdateSize(); info.UpdateSize();
const ImageId null_id = slot_images.insert(instance, scheduler, info); const ImageId null_id = slot_images.insert(instance, scheduler, info);
ASSERT(null_id.index == 0); ASSERT(null_id.index == NULL_IMAGE_ID.index);
const vk::Image& null_image = slot_images[null_id].image; const vk::Image& null_image = slot_images[null_id].image;
Vulkan::SetObjectName(instance.GetDevice(), null_image, "Null Image"); Vulkan::SetObjectName(instance.GetDevice(), null_image, "Null Image");
slot_images[null_id].flags = ImageFlagBits::Tracked; slot_images[null_id].flags = ImageFlagBits::Tracked;
@ -36,7 +36,7 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler&
ImageViewInfo view_info; ImageViewInfo view_info;
const auto null_view_id = const auto null_view_id =
slot_image_views.insert(instance, view_info, slot_images[null_id], null_id); slot_image_views.insert(instance, view_info, slot_images[null_id], null_id);
ASSERT(null_view_id.index == 0); ASSERT(null_view_id.index == NULL_IMAGE_VIEW_ID.index);
const vk::ImageView& null_image_view = slot_image_views[null_view_id].image_view.get(); const vk::ImageView& null_image_view = slot_image_views[null_view_id].image_view.get();
Vulkan::SetObjectName(instance.GetDevice(), null_image_view, "Null Image View"); Vulkan::SetObjectName(instance.GetDevice(), null_image_view, "Null Image View");
} }