mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Vulkan: Auto-set queued deletes to null.
This commit is contained in:
parent
d80598d03f
commit
39d6ea2985
8 changed files with 24 additions and 50 deletions
|
@ -66,18 +66,18 @@ class VulkanDeleteList {
|
|||
};
|
||||
|
||||
public:
|
||||
void QueueDeleteDescriptorPool(VkDescriptorPool pool) { descPools_.push_back(pool); }
|
||||
void QueueDeleteShaderModule(VkShaderModule module) { modules_.push_back(module); }
|
||||
void QueueDeleteBuffer(VkBuffer buffer) { buffers_.push_back(buffer); }
|
||||
void QueueDeleteBufferView(VkBufferView bufferView) { bufferViews_.push_back(bufferView); }
|
||||
void QueueDeleteImage(VkImage image) { images_.push_back(image); }
|
||||
void QueueDeleteImageView(VkImageView imageView) { imageViews_.push_back(imageView); }
|
||||
void QueueDeleteDeviceMemory(VkDeviceMemory deviceMemory) { deviceMemory_.push_back(deviceMemory); }
|
||||
void QueueDeleteSampler(VkSampler sampler) { samplers_.push_back(sampler); }
|
||||
void QueueDeletePipeline(VkPipeline pipeline) { pipelines_.push_back(pipeline); }
|
||||
void QueueDeletePipelineCache(VkPipelineCache pipelineCache) { pipelineCaches_.push_back(pipelineCache); }
|
||||
void QueueDeleteRenderPass(VkRenderPass renderPass) { renderPasses_.push_back(renderPass); }
|
||||
void QueueDeleteFramebuffer(VkFramebuffer framebuffer) { framebuffers_.push_back(framebuffer); }
|
||||
void QueueDeleteDescriptorPool(VkDescriptorPool &pool) { descPools_.push_back(pool); pool = VK_NULL_HANDLE; }
|
||||
void QueueDeleteShaderModule(VkShaderModule &module) { modules_.push_back(module); module = VK_NULL_HANDLE; }
|
||||
void QueueDeleteBuffer(VkBuffer &buffer) { buffers_.push_back(buffer); buffer = VK_NULL_HANDLE; }
|
||||
void QueueDeleteBufferView(VkBufferView &bufferView) { bufferViews_.push_back(bufferView); bufferView = VK_NULL_HANDLE; }
|
||||
void QueueDeleteImage(VkImage &image) { images_.push_back(image); image = VK_NULL_HANDLE; }
|
||||
void QueueDeleteImageView(VkImageView &imageView) { imageViews_.push_back(imageView); imageView = VK_NULL_HANDLE; }
|
||||
void QueueDeleteDeviceMemory(VkDeviceMemory &deviceMemory) { deviceMemory_.push_back(deviceMemory); deviceMemory = VK_NULL_HANDLE; }
|
||||
void QueueDeleteSampler(VkSampler &sampler) { samplers_.push_back(sampler); sampler = VK_NULL_HANDLE; }
|
||||
void QueueDeletePipeline(VkPipeline &pipeline) { pipelines_.push_back(pipeline); pipeline = VK_NULL_HANDLE; }
|
||||
void QueueDeletePipelineCache(VkPipelineCache &pipelineCache) { pipelineCaches_.push_back(pipelineCache); pipelineCache = VK_NULL_HANDLE; }
|
||||
void QueueDeleteRenderPass(VkRenderPass &renderPass) { renderPasses_.push_back(renderPass); renderPass = VK_NULL_HANDLE; }
|
||||
void QueueDeleteFramebuffer(VkFramebuffer &framebuffer) { framebuffers_.push_back(framebuffer); framebuffer = VK_NULL_HANDLE; }
|
||||
void QueueCallback(void(*func)(void *userdata), void *userdata) { callbacks_.push_back(Callback(func, userdata)); }
|
||||
|
||||
void Take(VulkanDeleteList &del) {
|
||||
|
|
|
@ -22,11 +22,9 @@ void VulkanTexture::CreateMappableImage() {
|
|||
// If we already have a mappableImage, forget it.
|
||||
if (mappableImage) {
|
||||
vulkan_->Delete().QueueDeleteImage(mappableImage);
|
||||
mappableImage = VK_NULL_HANDLE;
|
||||
}
|
||||
if (mappableMemory) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mappableMemory);
|
||||
mappableMemory = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
bool U_ASSERT_ONLY pass;
|
||||
|
@ -193,9 +191,6 @@ void VulkanTexture::Unlock() {
|
|||
// Then drop the temporary mappable image - although should not be necessary...
|
||||
vulkan_->Delete().QueueDeleteImage(mappableImage);
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mappableMemory);
|
||||
|
||||
mappableImage = VK_NULL_HANDLE;
|
||||
mappableMemory = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
VkImageViewCreateInfo view_info = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
|
||||
|
@ -218,15 +213,12 @@ void VulkanTexture::Unlock() {
|
|||
void VulkanTexture::Wipe() {
|
||||
if (image) {
|
||||
vulkan_->Delete().QueueDeleteImage(image);
|
||||
image = VK_NULL_HANDLE;
|
||||
}
|
||||
if (view) {
|
||||
vulkan_->Delete().QueueDeleteImageView(view);
|
||||
view = VK_NULL_HANDLE;
|
||||
}
|
||||
if (mem && !allocator_) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem);
|
||||
mem = VK_NULL_HANDLE;
|
||||
} else if (mem) {
|
||||
allocator_->Free(mem, offset_);
|
||||
mem = VK_NULL_HANDLE;
|
||||
|
@ -371,25 +363,22 @@ void VulkanTexture::EndCreate() {
|
|||
}
|
||||
|
||||
void VulkanTexture::Destroy() {
|
||||
if (view) {
|
||||
if (view != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteImageView(view);
|
||||
}
|
||||
if (image) {
|
||||
vulkan_->Delete().QueueDeleteImage(image);
|
||||
if (image != VK_NULL_HANDLE) {
|
||||
if (mappableImage == image) {
|
||||
mappableImage = VK_NULL_HANDLE;
|
||||
}
|
||||
vulkan_->Delete().QueueDeleteImage(image);
|
||||
}
|
||||
if (mem && !allocator_) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem);
|
||||
if (mem != VK_NULL_HANDLE && !allocator_) {
|
||||
if (mappableMemory == mem) {
|
||||
mappableMemory = VK_NULL_HANDLE;
|
||||
}
|
||||
} else if (mem) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem);
|
||||
} else if (mem != VK_NULL_HANDLE) {
|
||||
allocator_->Free(mem, offset_);
|
||||
mem = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
view = VK_NULL_HANDLE;
|
||||
image = VK_NULL_HANDLE;
|
||||
mem = VK_NULL_HANDLE;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ public:
|
|||
}
|
||||
|
||||
void Destroy(VulkanContext *vulkan) {
|
||||
for (const BufInfo &info : buffers_) {
|
||||
for (BufInfo &info : buffers_) {
|
||||
vulkan->Delete().QueueDeleteBuffer(info.buffer);
|
||||
vulkan->Delete().QueueDeleteDeviceMemory(info.deviceMemory);
|
||||
}
|
||||
|
|
|
@ -208,7 +208,6 @@ DrawEngineVulkan::~DrawEngineVulkan() {
|
|||
void DrawEngineVulkan::FrameData::Destroy(VulkanContext *vulkan) {
|
||||
if (descPool != VK_NULL_HANDLE) {
|
||||
vulkan->Delete().QueueDeleteDescriptorPool(descPool);
|
||||
descPool = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
if (pushUBO) {
|
||||
|
@ -234,10 +233,8 @@ void DrawEngineVulkan::DestroyDeviceObjects() {
|
|||
}
|
||||
if (depalSampler_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteSampler(depalSampler_);
|
||||
depalSampler_ = VK_NULL_HANDLE;
|
||||
if (nullSampler_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteSampler(nullSampler_);
|
||||
nullSampler_ = VK_NULL_HANDLE;
|
||||
if (pipelineLayout_ != VK_NULL_HANDLE)
|
||||
vkDestroyPipelineLayout(vulkan_->GetDevice(), pipelineLayout_, nullptr);
|
||||
pipelineLayout_ = VK_NULL_HANDLE;
|
||||
|
|
|
@ -202,16 +202,12 @@ void FramebufferManagerVulkan::InitDeviceObjects() {
|
|||
void FramebufferManagerVulkan::DestroyDeviceObjects() {
|
||||
if (rpLoadColorLoadDepth_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteRenderPass(rpLoadColorLoadDepth_);
|
||||
rpLoadColorLoadDepth_ = VK_NULL_HANDLE;
|
||||
if (rpClearColorLoadDepth_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteRenderPass(rpClearColorLoadDepth_);
|
||||
rpClearColorLoadDepth_ = VK_NULL_HANDLE;
|
||||
if (rpClearColorClearDepth_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteRenderPass(rpClearColorClearDepth_);
|
||||
rpClearColorClearDepth_ = VK_NULL_HANDLE;
|
||||
if (rpLoadColorClearDepth_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteRenderPass(rpLoadColorClearDepth_);
|
||||
rpLoadColorClearDepth_ = VK_NULL_HANDLE;
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (frameData_[i].numCommandBuffers_ > 0) {
|
||||
|
@ -234,26 +230,19 @@ void FramebufferManagerVulkan::DestroyDeviceObjects() {
|
|||
|
||||
if (fsBasicTex_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteShaderModule(fsBasicTex_);
|
||||
fsBasicTex_ = VK_NULL_HANDLE;
|
||||
if (vsBasicTex_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteShaderModule(vsBasicTex_);
|
||||
vsBasicTex_ = VK_NULL_HANDLE;
|
||||
|
||||
if (linearSampler_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteSampler(linearSampler_);
|
||||
linearSampler_ = VK_NULL_HANDLE;
|
||||
if (nearestSampler_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeleteSampler(nearestSampler_);
|
||||
nearestSampler_ = VK_NULL_HANDLE;
|
||||
if (pipelineBasicTex_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeletePipeline(pipelineBasicTex_);
|
||||
pipelineBasicTex_ = VK_NULL_HANDLE;
|
||||
if (pipelinePostShader_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeletePipeline(pipelinePostShader_);
|
||||
pipelinePostShader_ = VK_NULL_HANDLE;
|
||||
if (pipelineCache2D_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeletePipelineCache(pipelineCache2D_);
|
||||
pipelineCache2D_ = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
void FramebufferManagerVulkan::NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth) {
|
||||
|
|
|
@ -13,7 +13,8 @@ PipelineManagerVulkan::PipelineManagerVulkan(VulkanContext *vulkan) : vulkan_(vu
|
|||
|
||||
PipelineManagerVulkan::~PipelineManagerVulkan() {
|
||||
Clear();
|
||||
vulkan_->Delete().QueueDeletePipelineCache(pipelineCache_);
|
||||
if (pipelineCache_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeletePipelineCache(pipelineCache_);
|
||||
}
|
||||
|
||||
void PipelineManagerVulkan::Clear() {
|
||||
|
@ -31,7 +32,6 @@ void PipelineManagerVulkan::DeviceLost() {
|
|||
Clear();
|
||||
if (pipelineCache_ != VK_NULL_HANDLE)
|
||||
vulkan_->Delete().QueueDeletePipelineCache(pipelineCache_);
|
||||
pipelineCache_ = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
void PipelineManagerVulkan::DeviceRestore(VulkanContext *vulkan) {
|
||||
|
|
|
@ -81,7 +81,7 @@ VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, ShaderID id, c
|
|||
}
|
||||
|
||||
VulkanFragmentShader::~VulkanFragmentShader() {
|
||||
if (module_) {
|
||||
if (module_ != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteShaderModule(module_);
|
||||
}
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ VulkanVertexShader::VulkanVertexShader(VulkanContext *vulkan, ShaderID id, const
|
|||
}
|
||||
|
||||
VulkanVertexShader::~VulkanVertexShader() {
|
||||
if (module_) {
|
||||
if (module_ != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteShaderModule(module_);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,6 @@ void Vulkan2D::DestroyDeviceObjects() {
|
|||
for (int i = 0; i < 2; i++) {
|
||||
if (frameData_[i].descPool != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteDescriptorPool(frameData_[i].descPool);
|
||||
frameData_[i].descPool = VK_NULL_HANDLE;
|
||||
}
|
||||
}
|
||||
for (auto it : pipelines_) {
|
||||
|
|
Loading…
Add table
Reference in a new issue