|
@@ -1318,7 +1318,7 @@ const VkImageType RenderingDeviceVulkan::vulkan_image_type[RenderingDevice::TEXT
|
|
|
/**** BUFFER MANAGEMENT ****/
|
|
|
/***************************/
|
|
|
|
|
|
-Error RenderingDeviceVulkan::_buffer_allocate(Buffer *p_buffer, uint32_t p_size, uint32_t p_usage, VmaMemoryUsage p_mapping) {
|
|
|
+Error RenderingDeviceVulkan::_buffer_allocate(Buffer *p_buffer, uint32_t p_size, uint32_t p_usage, VmaMemoryUsage p_mem_usage, VmaAllocationCreateFlags p_mem_flags) {
|
|
|
VkBufferCreateInfo bufferInfo;
|
|
|
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
|
|
bufferInfo.pNext = nullptr;
|
|
@@ -1330,8 +1330,8 @@ Error RenderingDeviceVulkan::_buffer_allocate(Buffer *p_buffer, uint32_t p_size,
|
|
|
bufferInfo.pQueueFamilyIndices = nullptr;
|
|
|
|
|
|
VmaAllocationCreateInfo allocInfo;
|
|
|
- allocInfo.flags = 0;
|
|
|
- allocInfo.usage = p_mapping;
|
|
|
+ allocInfo.flags = p_mem_flags;
|
|
|
+ allocInfo.usage = p_mem_usage;
|
|
|
allocInfo.requiredFlags = 0;
|
|
|
allocInfo.preferredFlags = 0;
|
|
|
allocInfo.memoryTypeBits = 0;
|
|
@@ -1380,8 +1380,8 @@ Error RenderingDeviceVulkan::_insert_staging_block() {
|
|
|
bufferInfo.pQueueFamilyIndices = nullptr;
|
|
|
|
|
|
VmaAllocationCreateInfo allocInfo;
|
|
|
- allocInfo.flags = 0;
|
|
|
- allocInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;
|
|
|
+ allocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT;
|
|
|
+ allocInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_HOST;
|
|
|
allocInfo.requiredFlags = 0;
|
|
|
allocInfo.preferredFlags = 0;
|
|
|
allocInfo.memoryTypeBits = 0;
|
|
@@ -1847,9 +1847,9 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T
|
|
|
uint32_t image_size = get_image_format_required_size(p_format.format, p_format.width, p_format.height, p_format.depth, p_format.mipmaps, &width, &height);
|
|
|
|
|
|
VmaAllocationCreateInfo allocInfo;
|
|
|
- allocInfo.flags = 0;
|
|
|
+ allocInfo.flags = (p_format.usage_bits & TEXTURE_USAGE_CPU_READ_BIT) ? VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT : 0;
|
|
|
allocInfo.pool = nullptr;
|
|
|
- allocInfo.usage = p_format.usage_bits & TEXTURE_USAGE_CPU_READ_BIT ? VMA_MEMORY_USAGE_CPU_ONLY : VMA_MEMORY_USAGE_GPU_ONLY;
|
|
|
+ allocInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;
|
|
|
allocInfo.requiredFlags = 0;
|
|
|
allocInfo.preferredFlags = 0;
|
|
|
allocInfo.memoryTypeBits = 0;
|
|
@@ -2703,7 +2703,7 @@ Vector<uint8_t> RenderingDeviceVulkan::texture_get_data(RID p_texture, uint32_t
|
|
|
//allocate buffer
|
|
|
VkCommandBuffer command_buffer = frames[frame].draw_command_buffer; //makes more sense to retrieve
|
|
|
Buffer tmp_buffer;
|
|
|
- _buffer_allocate(&tmp_buffer, buffer_size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
|
|
|
+ _buffer_allocate(&tmp_buffer, buffer_size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_HOST, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT);
|
|
|
|
|
|
{ //Source image barrier
|
|
|
VkImageMemoryBarrier image_memory_barrier;
|
|
@@ -4097,7 +4097,7 @@ RID RenderingDeviceVulkan::vertex_buffer_create(uint32_t p_size_bytes, const Vec
|
|
|
usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
|
|
|
}
|
|
|
Buffer buffer;
|
|
|
- _buffer_allocate(&buffer, p_size_bytes, usage, VMA_MEMORY_USAGE_GPU_ONLY);
|
|
|
+ _buffer_allocate(&buffer, p_size_bytes, usage, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0);
|
|
|
if (p_data.size()) {
|
|
|
uint64_t data_size = p_data.size();
|
|
|
const uint8_t *r = p_data.ptr();
|
|
@@ -4259,7 +4259,7 @@ RID RenderingDeviceVulkan::index_buffer_create(uint32_t p_index_count, IndexBuff
|
|
|
#else
|
|
|
index_buffer.max_index = 0xFFFFFFFF;
|
|
|
#endif
|
|
|
- _buffer_allocate(&index_buffer, size_bytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY);
|
|
|
+ _buffer_allocate(&index_buffer, size_bytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0);
|
|
|
if (p_data.size()) {
|
|
|
uint64_t data_size = p_data.size();
|
|
|
const uint8_t *r = p_data.ptr();
|
|
@@ -5371,7 +5371,7 @@ RID RenderingDeviceVulkan::uniform_buffer_create(uint32_t p_size_bytes, const Ve
|
|
|
"Creating buffers with data is forbidden during creation of a draw list");
|
|
|
|
|
|
Buffer buffer;
|
|
|
- Error err = _buffer_allocate(&buffer, p_size_bytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY);
|
|
|
+ Error err = _buffer_allocate(&buffer, p_size_bytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0);
|
|
|
ERR_FAIL_COND_V(err != OK, RID());
|
|
|
if (p_data.size()) {
|
|
|
uint64_t data_size = p_data.size();
|
|
@@ -5397,7 +5397,7 @@ RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Ve
|
|
|
if (p_usage & STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT) {
|
|
|
flags |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
|
|
|
}
|
|
|
- Error err = _buffer_allocate(&buffer, p_size_bytes, flags, VMA_MEMORY_USAGE_GPU_ONLY);
|
|
|
+ Error err = _buffer_allocate(&buffer, p_size_bytes, flags, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0);
|
|
|
ERR_FAIL_COND_V(err != OK, RID());
|
|
|
|
|
|
if (p_data.size()) {
|
|
@@ -5423,7 +5423,7 @@ RID RenderingDeviceVulkan::texture_buffer_create(uint32_t p_size_elements, DataF
|
|
|
ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != size_bytes, RID());
|
|
|
|
|
|
TextureBuffer texture_buffer;
|
|
|
- Error err = _buffer_allocate(&texture_buffer.buffer, size_bytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VMA_MEMORY_USAGE_GPU_ONLY);
|
|
|
+ Error err = _buffer_allocate(&texture_buffer.buffer, size_bytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0);
|
|
|
ERR_FAIL_COND_V(err != OK, RID());
|
|
|
|
|
|
if (p_data.size()) {
|
|
@@ -6170,7 +6170,7 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) {
|
|
|
VkCommandBuffer command_buffer = frames[frame].setup_command_buffer;
|
|
|
|
|
|
Buffer tmp_buffer;
|
|
|
- _buffer_allocate(&tmp_buffer, buffer->size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
|
|
|
+ _buffer_allocate(&tmp_buffer, buffer->size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_HOST, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT);
|
|
|
VkBufferCopy region;
|
|
|
region.srcOffset = 0;
|
|
|
region.dstOffset = 0;
|