Skip to content

Commit fd9ff59

Browse files
author
Vasily Galkin
committed
Workaround erupt UB panic while running debug build.
Empty extensions array explicitly passed instead of relying on default. Should resolve #53
1 parent e046285 commit fd9ff59

1 file changed

Lines changed: 17 additions & 8 deletions

File tree

src/main.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,28 @@ where
4646
}
4747
}
4848

49-
struct CStrStaticPtr([*const std::os::raw::c_char; 1]);
49+
struct CStrStaticPtr<const N: usize>([*const std::os::raw::c_char; N]);
5050

51-
impl core::ops::Deref for CStrStaticPtr {
52-
type Target = [*const std::os::raw::c_char; 1];
51+
impl<const N: usize> core::ops::Deref for CStrStaticPtr<N> {
52+
type Target = [*const std::os::raw::c_char; N];
5353

5454
fn deref(&self) -> &Self::Target {
5555
&self.0
5656
}
5757
}
5858

59-
unsafe impl Sync for CStrStaticPtr {}
59+
unsafe impl<const N: usize> Sync for CStrStaticPtr<N> {}
6060

6161
const VK_LOADER_DEBUG: &str = "VK_LOADER_DEBUG";
6262
const LAYER_KHRONOS_VALIDATION: &CStr = c_str!("VK_LAYER_KHRONOS_validation");
63-
static LAYER_KHRONOS_VALIDATION_ARRAY: CStrStaticPtr =
63+
static LAYER_KHRONOS_VALIDATION_ARRAY: CStrStaticPtr<1> =
6464
CStrStaticPtr([LAYER_KHRONOS_VALIDATION.as_ptr()]);
65+
66+
// erupt CreateInfoBuilder's has problem without passing enabled_extensions argument,
67+
// https://github.com/GpuZelenograd/memtest_vulkan/issues/53
68+
// Workaround it by explicitly passing empty array
69+
static NO_EXTENSIONS_ARRAY: CStrStaticPtr<0> = CStrStaticPtr([]);
70+
6571
const GB: f32 = (1024 * 1024 * 1024) as f32;
6672
const READ_SHADER: &[u32] = memtest_vulkan_build::compiled_vk_compute_spirv!(
6773
r#"
@@ -593,8 +599,9 @@ fn prepare_and_test_device<Writer: std::io::Write>(
593599
.queue_priorities(&[1.0]),
594600
];
595601

596-
let device_create_info =
597-
vk::DeviceCreateInfoBuilder::new().queue_create_infos(&queue_create_info);
602+
let device_create_info = vk::DeviceCreateInfoBuilder::new()
603+
.enabled_extension_names(&*NO_EXTENSIONS_ARRAY)
604+
.queue_create_infos(&queue_create_info);
598605

599606
let device =
600607
match unsafe { DeviceLoader::new(instance, selected.physical_device, &device_create_info) }
@@ -1316,7 +1323,9 @@ fn load_instance<Writer: std::io::Write>(
13161323
let simple_instance_try = unsafe {
13171324
InstanceLoader::new(
13181325
&entry,
1319-
&vk::InstanceCreateInfoBuilder::new().application_info(&app_info),
1326+
&vk::InstanceCreateInfoBuilder::new()
1327+
.enabled_extension_names(&*NO_EXTENSIONS_ARRAY)
1328+
.application_info(&app_info),
13201329
)
13211330
}
13221331
.err_as_str_context("instance. Try specifying icd.json via VK_DRIVER_FILES env var");

0 commit comments

Comments
 (0)