Advertisement
cheako

Untitled

Mar 28th, 2022
1,317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 6.54 KB | None | 0 0
  1. macro_rules! device_procs {
  2.     ($bname:literal $name:ident $pfn:ident) => {
  3.         $($bname => std::mem::transmute::<_, vk::PFN_vkVoidFunction>($name as vk::$pfn),)*
  4.     }
  5. }
  6.  
  7. macro_rules! get_device_proc_match {
  8.     ($match_name:ident $device:ident $pname:ident ) => {
  9.         match $match_name.to_bytes() {
  10.             device_procs!(b"vkGetDeviceProcAddr"       CheakoCache_GetDeviceProcAddr PFN_vkGetDeviceProcAddr)
  11.             device_procs!(b"vkAllocateMemory"          allocate_memory               PFN_vkAllocateMemory)
  12.             device_procs!(b"vkFreeMemory"              free_memory                   PFN_vkFreeMemory)
  13.             device_procs!(b"vkCreateSemaphore"         create_semaphore              PFN_vkCreateSemaphore)
  14.             device_procs!(b"vkDestroySemaphore"        destroy_semaphore             PFN_vkDestroySemaphore)
  15.             device_procs!(b"vkCreateFence"             create_fence                  PFN_vkCreateFence)
  16.             device_procs!(b"vkDestroyFence"            destroy_fence                 PFN_vkDestroyFence)
  17.             device_procs!(b"vkCreateBuffer"            create_buffer                 PFN_vkCreateBuffer)
  18.             device_procs!(b"vkDestroyBuffer"           destroy_buffer                PFN_vkDestroyBuffer)
  19.             device_procs!(b"vkCreateRenderPass"        create_render_pass            PFN_vkCreateRenderPass)
  20.             device_procs!(b"vkDestroyRenderPass"       destroy_render_pass           PFN_vkDestroyRenderPass)
  21.             device_procs!(b"vkCreateGraphicsPipelines" create_graphics_pipeline      PFN_vkCreateGraphicsPipelines)
  22.             device_procs!(b"vkDestroyPipeline"         destroy_pipeline              PFN_vkDestroyPipeline)
  23.             device_procs!(b"vkCreateImage"             create_image                  PFN_vkCreateImage)
  24.             device_procs!(b"vkDestroyImage"            destroy_image                 PFN_vkDestroyImage)
  25.             device_procs!(b"vkCreateImageView"         create_image_view             PFN_vkCreateImageView)
  26.             device_procs!(b"vkDestroyImageView"        destroy_image_view            PFN_vkDestroyImageView)
  27.             device_procs!(b"vkQueuePresentKHR"         queue_present                 PFN_vkQueuePresentKHR)
  28.             device_procs!(b"vkGetDeviceQueue"          get_device_queue              PFN_vkGetDeviceQueue)
  29.             _ => (DEVICE
  30.                 .read()
  31.                 .unwrap()
  32.                 .get(&$device)
  33.                 .unwrap()
  34.                 .instance_fn
  35.                 .get_device_proc_addr)($device, $pname),
  36.         }
  37.     }
  38. }
  39.  
  40. #[no_mangle]
  41. pub unsafe extern "system" fn CheakoCache_GetDeviceProcAddr(
  42.     device: vk::Device,
  43.     p_name: *const std::os::raw::c_char,
  44. ) -> vk::PFN_vkVoidFunction {
  45.     let result = catch_unwind(|| {
  46.         use handlers::{
  47.             buffer::*,
  48.             fence::*,
  49.             images::{image::*, view::*},
  50.             memory::*,
  51.             present::*,
  52.             renders::{graphics_pipeline::*, render_pass::*},
  53.             semaphore::*,
  54.         };
  55.         let name = ffi::CStr::from_ptr(p_name);
  56.         get_device_proc_match! (
  57.             name device p_name
  58.         )
  59.     });
  60.     assert!(result.is_ok());
  61.     result.unwrap()
  62. }
  63.  
  64. macro_rules! get_instance_proc_match {
  65.     {$match_name:ident $instance:ident $pname:ident $($bname:literal $name:ident $pfn:ident)*} => {
  66.         match $match_name.to_bytes() {
  67.             $($bname => std::mem::transmute::<_, vk::PFN_vkVoidFunction>(
  68.                 $name as vk::$pfn,
  69.             )),*,
  70.             _ => {
  71.                 assert!(ENTRY_INIT.is_completed());
  72.                 (ENTRY.assume_init_ref().get_instance_proc_addr)($instance, $pname)
  73.             }
  74.         }
  75.     }
  76. }
  77.  
  78. #[no_mangle]
  79. pub unsafe extern "system" fn CheakoCache_GetInstanceProcAddr(
  80.     instance: vk::Instance,
  81.     p_name: *const std::os::raw::c_char,
  82. ) -> vk::PFN_vkVoidFunction {
  83.     let result = catch_unwind(|| {
  84.         use handlers::{
  85.             buffer::*,
  86.             fence::*,
  87.             images::{image::*, view::*},
  88.             memory::*,
  89.             present::*,
  90.             renders::{graphics_pipeline::*, render_pass::*},
  91.             semaphore::*,
  92.         };
  93.         let name = ffi::CStr::from_ptr(p_name);
  94.         get_instance_proc_match! {
  95.             name instance p_name
  96.             b"vkCreateInstance"           create_instance                 PFN_vkCreateInstance
  97.             b"vkEnumeratePhysicalDevices" enumerate_physical_devices      PFN_vkEnumeratePhysicalDevices
  98.             b"vkCreateDevice"             create_device                   PFN_vkCreateDevice
  99.             b"vkGetInstanceProcAddr"      CheakoCache_GetInstanceProcAddr PFN_vkGetInstanceProcAddr
  100.             b"vkGetDeviceProcAddr"        CheakoCache_GetDeviceProcAddr   PFN_vkGetDeviceProcAddr
  101.             b"vkAllocateMemory"           allocate_memory                 PFN_vkAllocateMemory
  102.             b"vkFreeMemory"               free_memory                     PFN_vkFreeMemory
  103.             b"vkCreateSemaphore"          create_semaphore                PFN_vkCreateSemaphore
  104.             b"vkDestroySemaphore"         destroy_semaphore               PFN_vkDestroySemaphore
  105.             b"vkCreateBuffer"             create_buffer                   PFN_vkCreateBuffer
  106.             b"vkDestroyBuffer"            destroy_buffer                  PFN_vkDestroyBuffer
  107.             b"vkCreateFence"              create_fence                    PFN_vkCreateFence
  108.             b"vkDestroyFence"             destroy_fence                   PFN_vkDestroyFence
  109.             b"vkCreateRenderPass"         create_render_pass              PFN_vkCreateRenderPass
  110.             b"vkDestroyRenderPass"        destroy_render_pass             PFN_vkDestroyRenderPass
  111.             b"vkCreateGraphicsPipelines"  create_graphics_pipeline        PFN_vkCreateGraphicsPipelines
  112.             b"vkDestroyPipeline"          destroy_pipeline                PFN_vkDestroyPipeline
  113.             b"vkCreateImage"              create_image                    PFN_vkCreateImage
  114.             b"vkDestroyImage"             destroy_image                   PFN_vkDestroyImage
  115.             b"vkCreateImageView"          create_image_view               PFN_vkCreateImageView
  116.             b"vkDestroyImageView"         destroy_image_view              PFN_vkDestroyImageView
  117.             b"vkQueuePresentKHR"          queue_present                   PFN_vkQueuePresentKHR
  118.             b"vkGetDeviceQueue"           get_device_queue                PFN_vkGetDeviceQueue
  119.         }
  120.     });
  121.     assert!(result.is_ok());
  122.     result.unwrap()
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement