allow dumping AABB

This commit is contained in:
2026-01-31 17:35:10 +00:00
parent 9ef20de508
commit 1acafae017
2 changed files with 63 additions and 5 deletions
+35 -3
View File
@@ -8,6 +8,7 @@ const IGNORE_STENCIL: bool = true;
const VSYNC: bool = true; const VSYNC: bool = true;
const COMPUTE_FUZZING: bool = false; const COMPUTE_FUZZING: bool = false;
const ROBUST: bool = false; const ROBUST: bool = false;
const DUMP_AABBS: bool = false;
const DEFAULT_SUBDIVISION: u32 = 16; const DEFAULT_SUBDIVISION: u32 = 16;
const MAXIMUM_SUBDIVISION: u32 = 64; const MAXIMUM_SUBDIVISION: u32 = 64;
@@ -31,7 +32,7 @@ use bytemuck::{Pod, Zeroable};
use egui_winit_vulkano::{Gui, GuiConfig}; use egui_winit_vulkano::{Gui, GuiConfig};
use foldhash::{HashMap, HashMapExt, HashSet}; use foldhash::{HashMap, HashMapExt, HashSet};
use glam::{self, EulerRot, Mat3, Mat4, Vec3, vec3}; use glam::{self, EulerRot, Mat3, Mat4, Vec3, vec3};
use log::{error, info, trace}; use log::{error, info, trace, warn};
use notify::{RecommendedWatcher, Watcher}; use notify::{RecommendedWatcher, Watcher};
use rspirv::dr::Module; use rspirv::dr::Module;
use simplelog::{CombinedLogger, Config, TermLogger, WriteLogger}; use simplelog::{CombinedLogger, Config, TermLogger, WriteLogger};
@@ -94,7 +95,9 @@ use vulkano::{
PresentMode, Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, SwapchainPresentInfo, PresentMode, Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, SwapchainPresentInfo,
acquire_next_image, acquire_next_image,
}, },
sync::{self, GpuFuture, PipelineStage, future::FenceSignalFuture}, sync::{
self, AccessConflict, GpuFuture, HostAccessError, PipelineStage, future::FenceSignalFuture,
},
}; };
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
use winit::platform::x11::EventLoopBuilderExtX11; use winit::platform::x11::EventLoopBuilderExtX11;
@@ -593,7 +596,11 @@ impl App {
SubbufferAllocatorCreateInfo { SubbufferAllocatorCreateInfo {
buffer_usage: BufferUsage::STORAGE_BUFFER buffer_usage: BufferUsage::STORAGE_BUFFER
| BufferUsage::ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY, | BufferUsage::ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY,
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE, memory_type_filter: if DUMP_AABBS {
MemoryTypeFilter::HOST_RANDOM_ACCESS
} else {
MemoryTypeFilter::PREFER_DEVICE
},
..Default::default() ..Default::default()
}, },
))); )));
@@ -2629,6 +2636,31 @@ impl App {
} }
} }
if DUMP_AABBS {
for future in rcx.previous_frame_end.iter_mut().flatten() {
future.wait(None).unwrap();
future.cleanup_finished();
}
for csg in self.gstate.csg.iter() {
let csg = csg.read().unwrap();
let mut reader = csg.aabb_buffer[image_index].read();
'writerloop: loop {
match reader {
Err(HostAccessError::AccessConflict(AccessConflict::DeviceRead))
| Err(HostAccessError::AccessConflict(AccessConflict::DeviceWrite)) => {
warn!("WAITING FOR HOST BUFFER FREE");
thread::yield_now();
reader = csg.aabb_buffer[image_index].read();
},
_ => break 'writerloop,
}
}
let reader = reader.unwrap();
info!("AABBS: {:?}", &reader[..1024]);
}
}
for work in work_for_later { for work in work_for_later {
self.handle_work_complete(work); self.handle_work_complete(work);
} }
@@ -2,8 +2,23 @@
#extension GL_GOOGLE_include_directive:require #extension GL_GOOGLE_include_directive:require
#include "compute_prepass_include.glsl" #include "compute_prepass_include.glsl"
struct AABB {
float min_x;
float min_y;
float min_z;
float max_x;
float max_y;
float max_z;
};
layout(set = 1, binding = 1, std430) restrict writeonly buffer AABBS {
AABB aabbs[];
} aabbs;
layout(local_size_x = 8, local_size_y = 8, local_size_z = 8) in; layout(local_size_x = 8, local_size_y = 8, local_size_z = 8) in;
const float NAN = 0.0 / 0.0;
void main() { void main() {
if (SPEC_BRUTE_FORCE || SPEC_USE_CPU_ENABLE_GEN) { if (SPEC_BRUTE_FORCE || SPEC_USE_CPU_ENABLE_GEN) {
return; return;
@@ -34,6 +49,17 @@ void main() {
bool enable = (interval.x < 0) && (interval.y > 0); bool enable = (interval.x < 0) && (interval.y > 0);
if (enable) {
aabbs.aabbs[base_index].min_x = low_corner.x;
aabbs.aabbs[base_index].min_y = low_corner.y;
aabbs.aabbs[base_index].min_z = low_corner.z;
aabbs.aabbs[base_index].max_x = high_corner.x;
aabbs.aabbs[base_index].max_y = high_corner.y;
aabbs.aabbs[base_index].max_z = high_corner.z;
} else {
aabbs.aabbs[base_index].min_x = NAN;
}
switch ((base_index >> 5) & 3) { switch ((base_index >> 5) & 3) {
default: default:
case 0: case 0: