- Replace gpu-allocator with vk-mem 0.5.0 (VMA 3.3.0) in renderer_device - Add public GpuAllocation wrapper, MemoryLocation, AllocationDesc, and allocate_for_buffer/image + bind_buffer/image_memory helpers - Restrict CPU-mapped allocations to HOST_VISIBLE|HOST_COHERENT memory types - Handle guards: raw buffer/image handles owned before allocation so failure paths never leak - Use renderer_device::device::MemoryLocation across renderer, renderer_resources, and renderer_rendergraph; remove all gpu-allocator dependencies - Error on dedicated allocation below Vulkan 1.1 instead of silent downgrade - Add Send/Sync asserts, coherent-mapping and dedicated-allocation validation tests; update AGENTS.md docs
91 lines
2.6 KiB
Rust
91 lines
2.6 KiB
Rust
use std::sync::Arc;
|
|
|
|
use ash::vk;
|
|
use renderer_device::{
|
|
device::{MemoryLocation, QueueFlags},
|
|
testing::TestVulkan,
|
|
};
|
|
use renderer_resources::{
|
|
buffers::{Buffer, BufferDesc},
|
|
pipeline::{
|
|
BufferDescriptor, DescriptorPool, DescriptorPoolDesc, DescriptorSetAllocDesc,
|
|
DescriptorSetLayout, DescriptorSetLayoutBindingDesc, DescriptorSetLayoutDesc,
|
|
},
|
|
};
|
|
|
|
#[test]
|
|
fn managed_set_write_and_pool_reset_under_validation() {
|
|
let Some(test) = TestVulkan::acquire() else {
|
|
return;
|
|
};
|
|
let device = test.device().clone();
|
|
let buffer = Arc::new(
|
|
Buffer::new(
|
|
device.clone(),
|
|
BufferDesc {
|
|
size: 256,
|
|
usage: vk::BufferUsageFlags::UNIFORM_BUFFER,
|
|
queue_families: QueueFlags::empty(),
|
|
mem_location: MemoryLocation::CpuToGpu,
|
|
..Default::default()
|
|
},
|
|
)
|
|
.expect("create descriptor buffer"),
|
|
);
|
|
let bindings = [DescriptorSetLayoutBindingDesc {
|
|
binding: 0,
|
|
count: 1,
|
|
kind: vk::DescriptorType::UNIFORM_BUFFER,
|
|
stage: vk::ShaderStageFlags::VERTEX,
|
|
flags: None,
|
|
}];
|
|
let layout = DescriptorSetLayout::new(
|
|
device.clone(),
|
|
DescriptorSetLayoutDesc {
|
|
bindings: &bindings,
|
|
..Default::default()
|
|
},
|
|
)
|
|
.expect("create descriptor set layout");
|
|
let sizes = [vk::DescriptorPoolSize::default()
|
|
.ty(vk::DescriptorType::UNIFORM_BUFFER)
|
|
.descriptor_count(1)];
|
|
let pool = DescriptorPool::new(
|
|
device,
|
|
DescriptorPoolDesc {
|
|
sizes: &sizes,
|
|
max_sets: 1,
|
|
..Default::default()
|
|
},
|
|
)
|
|
.expect("create descriptor pool");
|
|
let mut set = pool
|
|
.allocate_managed(DescriptorSetAllocDesc {
|
|
name: None,
|
|
layout: &layout,
|
|
})
|
|
.expect("allocate managed descriptor set");
|
|
let mut writer = set.writer().expect("create descriptor writer");
|
|
writer
|
|
.write_buffer(
|
|
0,
|
|
0,
|
|
&[BufferDescriptor {
|
|
buffer: &buffer,
|
|
offset: 0,
|
|
range: 256,
|
|
}],
|
|
)
|
|
.expect("stage buffer descriptor");
|
|
writer.commit().expect("commit buffer descriptor");
|
|
|
|
test.device().wait_idle().expect("wait for device idle");
|
|
drop(set);
|
|
// SAFETY: no command uses this set, the device is idle, and this test excludes concurrent use.
|
|
unsafe { pool.reset() }.expect("reset descriptor pool");
|
|
drop(pool);
|
|
drop(layout);
|
|
drop(buffer);
|
|
test.assert_no_validation_errors();
|
|
}
|