Another attempt
This commit is contained in:
parent
ce03d4e29c
commit
2d7cd8ff2c
|
|
@ -88,36 +88,26 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame,
|
|||
bool resource_update_required = false;
|
||||
bool presentation_recreate_required = false;
|
||||
|
||||
// Recreate dynamic resources if the adapting filter changed
|
||||
if (!window_adapt || scaling_filter != filters.get_scaling_filter()) {
|
||||
resource_update_required = true;
|
||||
}
|
||||
|
||||
// Recreate dynamic resources if the image count changed
|
||||
const size_t old_swapchain_image_count =
|
||||
std::exchange(image_count, current_swapchain_image_count);
|
||||
if (old_swapchain_image_count != current_swapchain_image_count) {
|
||||
if (image_count != current_swapchain_image_count) {
|
||||
resource_update_required = true;
|
||||
image_count = current_swapchain_image_count;
|
||||
}
|
||||
|
||||
// Recreate the presentation frame if the format or dimensions of the window changed
|
||||
const VkFormat old_swapchain_view_format =
|
||||
std::exchange(swapchain_view_format, current_swapchain_view_format);
|
||||
if (old_swapchain_view_format != current_swapchain_view_format ||
|
||||
if (swapchain_view_format != current_swapchain_view_format ||
|
||||
layout.width != frame->width || layout.height != frame->height) {
|
||||
resource_update_required = true;
|
||||
presentation_recreate_required = true;
|
||||
swapchain_view_format = current_swapchain_view_format;
|
||||
}
|
||||
|
||||
// If we have a pending resource update, perform it
|
||||
if (resource_update_required) {
|
||||
// Wait for idle to ensure no resources are in use
|
||||
WaitIdle();
|
||||
|
||||
// Update window adapt pass
|
||||
SetWindowAdaptPass();
|
||||
|
||||
// Update frame format if needed
|
||||
if (presentation_recreate_required) {
|
||||
present_manager.RecreateFrame(frame, layout.width, layout.height, swapchain_view_format,
|
||||
window_adapt->GetRenderPass());
|
||||
|
|
@ -126,21 +116,21 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame,
|
|||
image_index = 0;
|
||||
}
|
||||
|
||||
// Add additional layers if needed
|
||||
const VkExtent2D window_size{
|
||||
.width = layout.screen.GetWidth(),
|
||||
.height = layout.screen.GetHeight(),
|
||||
};
|
||||
|
||||
while (layers.size() < framebuffers.size()) {
|
||||
layers.emplace_back(device, memory_allocator, scheduler, device_memory, image_count,
|
||||
window_size, window_adapt->GetDescriptorSetLayout(), filters);
|
||||
if (layers.size() != framebuffers.size()) {
|
||||
layers.clear();
|
||||
for (size_t i = 0; i < framebuffers.size(); ++i) {
|
||||
layers.emplace_back(device, memory_allocator, scheduler, device_memory, image_count,
|
||||
window_size, window_adapt->GetDescriptorSetLayout(), filters);
|
||||
}
|
||||
}
|
||||
|
||||
// Perform the draw
|
||||
window_adapt->Draw(rasterizer, scheduler, image_index, layers, framebuffers, layout, frame);
|
||||
|
||||
// Advance to next image
|
||||
if (++image_index >= image_count) {
|
||||
image_index = 0;
|
||||
}
|
||||
|
|
@ -149,17 +139,20 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame,
|
|||
vk::Framebuffer BlitScreen::CreateFramebuffer(const Layout::FramebufferLayout& layout,
|
||||
VkImageView image_view,
|
||||
VkFormat current_view_format) {
|
||||
const bool format_updated =
|
||||
std::exchange(swapchain_view_format, current_view_format) != current_view_format;
|
||||
bool format_updated = swapchain_view_format != current_view_format;
|
||||
swapchain_view_format = current_view_format;
|
||||
|
||||
if (!window_adapt || scaling_filter != filters.get_scaling_filter() || format_updated) {
|
||||
WaitIdle();
|
||||
SetWindowAdaptPass();
|
||||
image_index = 0;
|
||||
}
|
||||
|
||||
const VkExtent2D extent{
|
||||
.width = layout.width,
|
||||
.height = layout.height,
|
||||
};
|
||||
|
||||
return CreateFramebuffer(image_view, extent, window_adapt->GetRenderPass());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue