1 // Copyright 2020-2021 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #include "api/CPUDevice.h"
5 #include "openvkl/common/ManagedObject.h"
6 
7 // For Windows in particular, we need registered object creation functions
8 // available in the top level module library, as exports from dependencies will
9 // not be visible.
10 
11 #define VKL_WRAP_DEVICE_REGISTRATION(                                    \
12     module_name, internal_name, external_name)                           \
13   extern "C" OPENVKL_DLLEXPORT void openvkl_init_module_##module_name(); \
14                                                                          \
15   extern "C" OPENVKL_DLLEXPORT ::openvkl::api::Device                    \
16       *openvkl_create_device__##internal_name();                         \
17                                                                          \
18   extern "C" OPENVKL_DLLEXPORT ::openvkl::api::Device                    \
19       *openvkl_create_device__##external_name()                          \
20   {                                                                      \
21     return openvkl_create_device__##internal_name();                     \
22   }
23 
24 #define VKL_WRAP_VOLUME_REGISTRATION(internal_name, external_name) \
25   extern "C" OPENVKL_DLLEXPORT ::openvkl::ManagedObject            \
26       *openvkl_create_volume__##internal_name();                   \
27                                                                    \
28   extern "C" OPENVKL_DLLEXPORT ::openvkl::ManagedObject            \
29       *openvkl_create_volume__##external_name()                    \
30   {                                                                \
31     return openvkl_create_volume__##internal_name();               \
32   }
33 
34 #if VKL_TARGET_WIDTH_ENABLED_4
VKL_WRAP_DEVICE_REGISTRATION(cpu_device_4,internal_cpu_4,cpu_4)35 VKL_WRAP_DEVICE_REGISTRATION(cpu_device_4, internal_cpu_4, cpu_4)
36 
37 VKL_WRAP_VOLUME_REGISTRATION(internal_amr_4, amr_4)
38 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredRegular_4, structuredRegular_4)
39 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredSpherical_4,
40                              structuredSpherical_4)
41 VKL_WRAP_VOLUME_REGISTRATION(internal_unstructured_4, unstructured_4)
42 VKL_WRAP_VOLUME_REGISTRATION(internal_vdb_4, vdb_4)
43 VKL_WRAP_VOLUME_REGISTRATION(internal_particle_4, particle_4)
44 
45 // support deprecated snake case names (a warning will be triggered if these are
46 // used)
47 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredRegular_4, structured_regular_4)
48 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredSpherical_4,
49                              structured_spherical_4)
50 #endif
51 
52 #if VKL_TARGET_WIDTH_ENABLED_8
53 VKL_WRAP_DEVICE_REGISTRATION(cpu_device_8, internal_cpu_8, cpu_8)
54 
55 VKL_WRAP_VOLUME_REGISTRATION(internal_amr_8, amr_8)
56 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredRegular_8, structuredRegular_8)
57 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredSpherical_8,
58                              structuredSpherical_8)
59 VKL_WRAP_VOLUME_REGISTRATION(internal_unstructured_8, unstructured_8)
60 VKL_WRAP_VOLUME_REGISTRATION(internal_vdb_8, vdb_8)
61 VKL_WRAP_VOLUME_REGISTRATION(internal_particle_8, particle_8)
62 
63 // support deprecated snake case names (a warning will be triggered if these are
64 // used)
65 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredRegular_8, structured_regular_8)
66 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredSpherical_8,
67                              structured_spherical_8)
68 #endif
69 
70 #if VKL_TARGET_WIDTH_ENABLED_16
71 VKL_WRAP_DEVICE_REGISTRATION(cpu_device_16, internal_cpu_16, cpu_16)
72 
73 VKL_WRAP_VOLUME_REGISTRATION(internal_amr_16, amr_16)
74 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredRegular_16,
75                              structuredRegular_16)
76 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredSpherical_16,
77                              structuredSpherical_16)
78 VKL_WRAP_VOLUME_REGISTRATION(internal_unstructured_16, unstructured_16)
79 VKL_WRAP_VOLUME_REGISTRATION(internal_vdb_16, vdb_16)
80 VKL_WRAP_VOLUME_REGISTRATION(internal_particle_16, particle_16)
81 
82 // support deprecated snake case names (a warning will be triggered if these are
83 // used)
84 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredRegular_16,
85                              structured_regular_16)
86 VKL_WRAP_VOLUME_REGISTRATION(internal_structuredSpherical_16,
87                              structured_spherical_16)
88 #endif
89 
90 // calls init functions in [4, 8, 16] devices to ensure proper linkage
91 extern "C" OPENVKL_DLLEXPORT void openvkl_init_module_cpu_device()
92 {
93 #if VKL_TARGET_WIDTH_ENABLED_4
94   openvkl_init_module_cpu_device_4();
95 #endif
96 
97 #if VKL_TARGET_WIDTH_ENABLED_8
98   openvkl_init_module_cpu_device_8();
99 #endif
100 
101 #if VKL_TARGET_WIDTH_ENABLED_16
102   openvkl_init_module_cpu_device_16();
103 #endif
104 }
105