allow dumping AABB
This commit is contained in:
+35
-3
@@ -8,6 +8,7 @@ const IGNORE_STENCIL: bool = true;
|
||||
const VSYNC: bool = true;
|
||||
const COMPUTE_FUZZING: bool = false;
|
||||
const ROBUST: bool = false;
|
||||
const DUMP_AABBS: bool = false;
|
||||
|
||||
const DEFAULT_SUBDIVISION: u32 = 16;
|
||||
const MAXIMUM_SUBDIVISION: u32 = 64;
|
||||
@@ -31,7 +32,7 @@ use bytemuck::{Pod, Zeroable};
|
||||
use egui_winit_vulkano::{Gui, GuiConfig};
|
||||
use foldhash::{HashMap, HashMapExt, HashSet};
|
||||
use glam::{self, EulerRot, Mat3, Mat4, Vec3, vec3};
|
||||
use log::{error, info, trace};
|
||||
use log::{error, info, trace, warn};
|
||||
use notify::{RecommendedWatcher, Watcher};
|
||||
use rspirv::dr::Module;
|
||||
use simplelog::{CombinedLogger, Config, TermLogger, WriteLogger};
|
||||
@@ -94,7 +95,9 @@ use vulkano::{
|
||||
PresentMode, Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, SwapchainPresentInfo,
|
||||
acquire_next_image,
|
||||
},
|
||||
sync::{self, GpuFuture, PipelineStage, future::FenceSignalFuture},
|
||||
sync::{
|
||||
self, AccessConflict, GpuFuture, HostAccessError, PipelineStage, future::FenceSignalFuture,
|
||||
},
|
||||
};
|
||||
#[cfg(target_os = "linux")]
|
||||
use winit::platform::x11::EventLoopBuilderExtX11;
|
||||
@@ -593,7 +596,11 @@ impl App {
|
||||
SubbufferAllocatorCreateInfo {
|
||||
buffer_usage: BufferUsage::STORAGE_BUFFER
|
||||
| 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()
|
||||
},
|
||||
)));
|
||||
@@ -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 {
|
||||
self.handle_work_complete(work);
|
||||
}
|
||||
|
||||
@@ -2,8 +2,23 @@
|
||||
#extension GL_GOOGLE_include_directive:require
|
||||
#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;
|
||||
|
||||
const float NAN = 0.0 / 0.0;
|
||||
|
||||
void main() {
|
||||
if (SPEC_BRUTE_FORCE || SPEC_USE_CPU_ENABLE_GEN) {
|
||||
return;
|
||||
@@ -23,9 +38,9 @@ void main() {
|
||||
);
|
||||
|
||||
vec3 low_corner = (((vec3(0.0) / float(1 << object_uniforms.subdivision_log2)) + internal_pos)
|
||||
* object_uniforms.dimensions) + object_uniforms.lowest_corner;
|
||||
* object_uniforms.dimensions) + object_uniforms.lowest_corner;
|
||||
vec3 high_corner = (((vec3(1.0) / float(1 << object_uniforms.subdivision_log2)) + internal_pos)
|
||||
* object_uniforms.dimensions) + object_uniforms.lowest_corner;
|
||||
* object_uniforms.dimensions) + object_uniforms.lowest_corner;
|
||||
|
||||
vec2 interval = interval_scene(
|
||||
vec4(low_corner, camera_uniforms.campos_and_time.w),
|
||||
@@ -34,6 +49,17 @@ void main() {
|
||||
|
||||
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) {
|
||||
default:
|
||||
case 0:
|
||||
|
||||
Reference in New Issue
Block a user