1#![allow(unused_imports)]
2#![allow(dead_code)]
3#![allow(unused_variables)]
4#![allow(unused_mut)]
5#![allow(unused_assignments)]
6#![allow(unused_macros)]
7
8mod vulkan;
9mod cpu_ops;
10mod registration;
11mod debug;
12
13pub mod operators;
14pub use operators::{
15 gpu_multiply_bridge,
16 gpu_add_bridge,
17 gpu_subtract_bridge,
18 gpu_hadamard_bridge,
19 gpu_inverse_bridge,
20 gpu_transpose_bridge,
21 gpu_reduce_sum_bridge,
22 gpu_scale_bridge,
23 gpu_to_tensor_bridge,
24 gpu_to_array_bridge,
25 elementwise_op,
26};
27
28pub use vulkan::{AshVulkanContext, VULKAN_CONTEXT};
29pub use cpu_ops::*;
30pub use registration::register_all_gpu_fns;
31#[cfg(debug_assertions)]
32pub use debug::gpu_last_call_bridge;
33
34use std::ffi::{c_void, CStr};
35use core_mumu::parser::interpreter::Interpreter;
36
37#[no_mangle]
38pub unsafe extern "C" fn Cargo_lock(
39 interp_ptr: *mut c_void,
40 extra_str: *const c_void,
41) -> i32 {
42 if interp_ptr.is_null() {
43 eprintln!("[gpu] cargo_lock => null interp ptr");
44 return 1;
45 }
46 let interp = &mut *(interp_ptr as *mut Interpreter);
47
48 let desc = if !extra_str.is_null() {
49 let c_s = CStr::from_ptr(extra_str as *const i8);
50 c_s.to_string_lossy().to_string()
51 } else {
52 "".to_string()
53 };
54
55 if interp.is_verbose() {
56 eprintln!("[gpu] cargo_lock => attempt Vulkan init, extra='{}'", desc);
57 }
58 match vulkan::AshVulkanContext::new() {
59 Ok(ctx) => {
60 *vulkan::VULKAN_CONTEXT.lock().unwrap() = Some(ctx);
61 if interp.is_verbose() {
62 eprintln!("[gpu] Using real Vulkan context => success");
63 }
64 }
65 Err(e) => {
66 eprintln!("[gpu] Vulkan init failed => fallback CPU => error: {}", e);
67 *vulkan::VULKAN_CONTEXT.lock().unwrap() = None;
68 }
69 }
70
71 registration::register_all_gpu_fns(interp);
72 0
73}