mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-11-02 05:11:44 +01:00
Another intent on write/read on the fly
This commit is contained in:
parent
5caa0bd567
commit
50e59cf09d
6 changed files with 150 additions and 3 deletions
|
|
@ -350,7 +350,11 @@ public:
|
|||
return properties.properties.limits.minUniformBufferOffsetAlignment;
|
||||
}
|
||||
|
||||
/// Returns storage alignment requirement.
|
||||
/// Returns max storage buffer range requirement.
|
||||
u32 GetMaxStorageBufferRange() const {
|
||||
return properties.properties.limits.maxStorageBufferRange;
|
||||
}
|
||||
|
||||
VkDeviceSize GetStorageBufferAlignment() const {
|
||||
return properties.properties.limits.minStorageBufferOffsetAlignment;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -360,6 +360,8 @@ bool HostMemoryImport::ImportHardwareBuffers(
|
|||
const auto memory_props = device.GetPhysical().GetMemoryProperties().memoryProperties;
|
||||
window_size = hardware_buffer_window;
|
||||
base_offset = hardware_buffer_base;
|
||||
|
||||
const auto import_all = [&](VkBufferUsageFlags usage, bool want_address) {
|
||||
for (size_t i = 0; i < hardware_buffers.size(); ++i) {
|
||||
const size_t offset = hardware_buffer_base + i * hardware_buffer_window;
|
||||
if (offset >= size) {
|
||||
|
|
@ -390,7 +392,7 @@ bool HostMemoryImport::ImportHardwareBuffers(
|
|||
.pNext = &external_info,
|
||||
.flags = 0,
|
||||
.size = window_len,
|
||||
.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
||||
.usage = usage,
|
||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||
.queueFamilyIndexCount = 0,
|
||||
.pQueueFamilyIndices = nullptr,
|
||||
|
|
@ -422,9 +424,19 @@ bool HostMemoryImport::ImportHardwareBuffers(
|
|||
.image = VK_NULL_HANDLE,
|
||||
.buffer = new_buffer,
|
||||
};
|
||||
const VkMemoryAllocateFlagsInfo flags_info{
|
||||
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
|
||||
.pNext = &dedicated_info,
|
||||
.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
|
||||
.deviceMask = 0,
|
||||
};
|
||||
const void *alloc_next = &dedicated_info;
|
||||
if (want_address) {
|
||||
alloc_next = &flags_info;
|
||||
}
|
||||
const VkMemoryAllocateInfo alloc_info{
|
||||
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
|
||||
.pNext = &dedicated_info,
|
||||
.pNext = alloc_next,
|
||||
.allocationSize = ahb_props.allocationSize,
|
||||
.memoryTypeIndex = *type_index,
|
||||
};
|
||||
|
|
@ -437,12 +449,37 @@ bool HostMemoryImport::ImportHardwareBuffers(
|
|||
logical.DestroyBufferRaw(new_buffer);
|
||||
break;
|
||||
}
|
||||
VkDeviceAddress address = 0;
|
||||
if (want_address) {
|
||||
address = logical.GetBufferDeviceAddress(new_buffer);
|
||||
}
|
||||
windows.push_back(Window{
|
||||
.memory = std::move(memory),
|
||||
.buffer = new_buffer,
|
||||
.address = address,
|
||||
});
|
||||
imported_size += static_cast<size_t>(window_len);
|
||||
}
|
||||
return !windows.empty();
|
||||
};
|
||||
|
||||
constexpr VkBufferUsageFlags TransferUsage =
|
||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
VkBufferUsageFlags shader_usage = TransferUsage |
|
||||
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
|
||||
const bool want_address = device.IsBufferDeviceAddressSupported();
|
||||
if (want_address) {
|
||||
shader_usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
|
||||
}
|
||||
|
||||
bindable = import_all(shader_usage, want_address);
|
||||
if (!bindable) {
|
||||
imported_size = 0;
|
||||
import_all(TransferUsage, false);
|
||||
}
|
||||
if (windows.empty()) {
|
||||
window_size = 0;
|
||||
base_offset = 0;
|
||||
|
|
|
|||
|
|
@ -122,14 +122,23 @@ namespace Vulkan {
|
|||
return windows[index].buffer;
|
||||
}
|
||||
|
||||
[[nodiscard]] VkDeviceAddress GetWindowAddress(size_t index) const noexcept {
|
||||
return windows[index].address;
|
||||
}
|
||||
|
||||
[[nodiscard]] size_t GetWindowCount() const noexcept {
|
||||
return windows.size();
|
||||
}
|
||||
|
||||
[[nodiscard]] bool IsBindable() const noexcept {
|
||||
return bindable;
|
||||
}
|
||||
|
||||
private:
|
||||
struct Window {
|
||||
vk::DeviceMemory memory;
|
||||
VkBuffer buffer{};
|
||||
VkDeviceAddress address{};
|
||||
};
|
||||
|
||||
bool ImportHostPointer(void *base, size_t size);
|
||||
|
|
@ -144,6 +153,7 @@ namespace Vulkan {
|
|||
size_t imported_size{};
|
||||
size_t base_offset{};
|
||||
bool foreign_ownership{};
|
||||
bool bindable{};
|
||||
};
|
||||
|
||||
/// Memory allocator container.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue