diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index d34c1368e5..df8caaf1bc 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -58,13 +58,6 @@ class DeferredDisposer { public: DeferredDisposer(std::vector> &calls) : calls(calls) {} - - void defer(std::function func) - { - calls.push_back(std::move(func)); - } - - private: std::vector> &calls; }; @@ -76,8 +69,6 @@ class Buffer size_t size, VkBufferUsageFlags usage); ~Buffer(); - void *map(); - Buffer(Buffer&&) = delete; void operator=(Buffer&&) = delete; @@ -721,7 +712,9 @@ static std::unique_ptr vulkan_filter_chain_load_lut( buffer = std::unique_ptr(new Buffer(info->device, *info->memory_properties, image.width * image.height * sizeof(uint32_t), VK_BUFFER_USAGE_TRANSFER_SRC_BIT)); - ptr = buffer->map(); + if (!buffer->mapped && vkMapMemory(buffer->device, buffer->memory, 0, + buffer->size, 0, &buffer->mapped) == VK_SUCCESS) + ptr = buffer->mapped; memcpy(ptr, image.pixels, image.width * image.height * sizeof(uint32_t)); if (buffer->mapped) vkUnmapMemory(buffer->device, buffer->memory); @@ -1063,7 +1056,9 @@ bool vulkan_filter_chain::init() memory_properties, common.ubo_offset * deferred_calls.size(), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)); - common.ubo_mapped = static_cast(common.ubo->map()); + if (!common.ubo->mapped && vkMapMemory(common.ubo->device, + common.ubo->memory, 0, common.ubo->size, 0, &common.ubo->mapped) == VK_SUCCESS) + common.ubo_mapped = static_cast(common.ubo->mapped); /* Initialize history */ original_history.clear(); @@ -1213,13 +1208,6 @@ Buffer::Buffer(VkDevice device, vkBindBufferMemory(device, buffer, memory, 0); } -void *Buffer::map() -{ - if (!mapped && vkMapMemory(device, memory, 0, size, 0, &mapped) == VK_SUCCESS) - return mapped; - return nullptr; -} - Buffer::~Buffer() { if (mapped) @@ -1350,6 +1338,7 @@ CommonResources::CommonResources(VkDevice device, : device(device) { unsigned i; + void *ptr = NULL; VkSamplerCreateInfo info = { VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO }; /* The final pass uses an MVP designed for [0, 1] range VBO. @@ -1374,7 +1363,9 @@ CommonResources::CommonResources(VkDevice device, std::unique_ptr(new Buffer(device, memory_properties, sizeof(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)); - void *ptr = vbo->map(); + if (!vbo->mapped && vkMapMemory(vbo->device, vbo->memory, 0, vbo->size, 0, + &vbo->mapped) == VK_SUCCESS) + ptr = vbo->mapped; memcpy(ptr, vbo_data, sizeof(vbo_data)); if (vbo->mapped) vkUnmapMemory(vbo->device, vbo->memory); @@ -2232,7 +2223,7 @@ void Framebuffer::init(DeferredDisposer *disposer) { VkDevice d = device; VkDeviceMemory m = memory.memory; - disposer->defer([=] { vkFreeMemory(d, m, nullptr); }); + disposer->calls.push_back(std::move([=] { vkFreeMemory(d, m, nullptr); })); } memory.type = alloc.memoryTypeIndex; @@ -2299,7 +2290,7 @@ void Framebuffer::set_size(DeferredDisposer &disposer, const Size2D &size, VkFor VkImageView v = view; VkImageView fbv = fb_view; VkFramebuffer fb = framebuffer; - disposer.defer([=] + disposer.calls.push_back(std::move([=] { if (fb != VK_NULL_HANDLE) vkDestroyFramebuffer(d, fb, nullptr); @@ -2309,7 +2300,7 @@ void Framebuffer::set_size(DeferredDisposer &disposer, const Size2D &size, VkFor vkDestroyImageView(d, fbv, nullptr); if (i != VK_NULL_HANDLE) vkDestroyImage(d, i, nullptr); - }); + })); } init(&disposer);