forked from suyu/suyu
vulkan_blitter: Fix pool allocation double free.
This commit is contained in:
parent
aedd739631
commit
df6dffa30b
3 changed files with 10 additions and 25 deletions
|
@ -145,6 +145,11 @@ VkSemaphore BlitScreen::Draw(const Tegra::FramebufferConfig& framebuffer,
|
|||
// Finish any pending renderpass
|
||||
scheduler.RequestOutsideRenderPassOperationContext();
|
||||
|
||||
if (const auto swapchain_images = swapchain.GetImageCount(); swapchain_images != image_count) {
|
||||
image_count = swapchain_images;
|
||||
Recreate();
|
||||
}
|
||||
|
||||
const std::size_t image_index = swapchain.GetImageIndex();
|
||||
|
||||
scheduler.Wait(resource_ticks[image_index]);
|
||||
|
@ -448,15 +453,15 @@ vk::Framebuffer BlitScreen::CreateFramebuffer(const VkImageView& image_view, VkE
|
|||
|
||||
void BlitScreen::CreateStaticResources() {
|
||||
CreateShaders();
|
||||
CreateSampler();
|
||||
}
|
||||
|
||||
void BlitScreen::CreateDynamicResources() {
|
||||
CreateSemaphores();
|
||||
CreateDescriptorPool();
|
||||
CreateDescriptorSetLayout();
|
||||
CreateDescriptorSets();
|
||||
CreatePipelineLayout();
|
||||
CreateSampler();
|
||||
}
|
||||
|
||||
void BlitScreen::CreateDynamicResources() {
|
||||
CreateRenderPass();
|
||||
CreateFramebuffers();
|
||||
CreateGraphicsPipeline();
|
||||
|
|
|
@ -109,7 +109,7 @@ private:
|
|||
MemoryAllocator& memory_allocator;
|
||||
Swapchain& swapchain;
|
||||
Scheduler& scheduler;
|
||||
const std::size_t image_count;
|
||||
std::size_t image_count;
|
||||
const ScreenInfo& screen_info;
|
||||
|
||||
vk::ShaderModule vertex_shader;
|
||||
|
|
|
@ -519,9 +519,7 @@ public:
|
|||
dld{rhs.dld} {}
|
||||
|
||||
/// Assign an allocation transfering ownership from another allocation.
|
||||
/// Releases any previously held allocation.
|
||||
PoolAllocations& operator=(PoolAllocations&& rhs) noexcept {
|
||||
Release();
|
||||
allocations = std::move(rhs.allocations);
|
||||
num = rhs.num;
|
||||
device = rhs.device;
|
||||
|
@ -530,11 +528,6 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
/// Destroys any held allocation.
|
||||
~PoolAllocations() {
|
||||
Release();
|
||||
}
|
||||
|
||||
/// Returns the number of allocations.
|
||||
std::size_t size() const noexcept {
|
||||
return num;
|
||||
|
@ -557,19 +550,6 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
/// Destroys the held allocations if they exist.
|
||||
void Release() noexcept {
|
||||
if (!allocations) {
|
||||
return;
|
||||
}
|
||||
const Span<AllocationType> span(allocations.get(), num);
|
||||
const VkResult result = Free(device, pool, span, *dld);
|
||||
// There's no way to report errors from a destructor.
|
||||
if (result != VK_SUCCESS) {
|
||||
std::terminate();
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<AllocationType[]> allocations;
|
||||
std::size_t num = 0;
|
||||
VkDevice device = nullptr;
|
||||
|
|
Loading…
Reference in a new issue