vidya/crates/renderer_resources/tests/managed_set_validation.rs
janis e116851b90
feat: migrate GPU memory allocator from gpu-allocator to VMA (vk-mem)
- 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
2026-10-26 13:44:17 +01:00

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();
}