rFactor2_vk_hud/src/lib.rs

379 lines
16 KiB
Rust
Raw Normal View History

2023-01-10 13:24:04 +00:00
pub mod enums;
pub mod structs;
2023-01-10 17:20:18 +00:00
#[macro_use]
mod instance_handles;
#[macro_use]
2023-01-10 17:20:18 +00:00
mod device_handles;
2023-01-10 13:24:04 +00:00
2023-01-10 17:20:18 +00:00
use std::{fs::OpenOptions, io::Write, mem, os::raw::c_char, ptr};
use device_handles::*;
2023-01-10 13:24:04 +00:00
use enums::*;
2023-01-10 17:20:18 +00:00
use instance_handles::*;
2023-01-10 13:24:04 +00:00
use structs::*;
use vulkan_sys::prelude::*;
#[no_mangle]
#[allow(non_snake_case)]
pub extern "C" fn vkNegotiateLoaderLayerInterfaceVersion(
pVersionStruct: *mut VkNegotiateLayerInterface,
) -> VkResult {
write_log("======================================================");
write_log("================= New Negotiation ====================");
write_log("======================================================");
unsafe {
*pVersionStruct = VkNegotiateLayerInterface {
sType: enums::VkNegotiateLayerStructType::LAYER_NEGOTIATE_INTERFACE_STRUCT,
pNext: ptr::null_mut(),
loaderLayerInterfaceVersion: 2,
pfnGetInstanceProcAddr: Some(get_instance_proc_addr),
pfnGetDeviceProcAddr: Some(get_device_proc_addr),
pfnGetPhysicalDeviceProcAddr: None,
}
};
VK_SUCCESS
}
#[no_mangle]
extern "system" fn get_device_proc_addr(
2023-01-10 17:20:18 +00:00
_device: VkDevice,
2023-01-10 13:24:04 +00:00
function_name: *const c_char,
) -> PFN_vkVoidFunction {
2023-01-10 15:56:56 +00:00
write_log("-> vulkan layer device proc addr");
2023-01-10 13:24:04 +00:00
2023-01-10 15:56:56 +00:00
get_function(function_name)
2023-01-10 13:24:04 +00:00
}
#[no_mangle]
extern "system" fn get_instance_proc_addr(
2023-01-10 17:20:18 +00:00
_instance: VkInstance,
2023-01-10 13:24:04 +00:00
function_name: *const c_char,
) -> PFN_vkVoidFunction {
2023-01-10 15:56:56 +00:00
write_log("-> vulkan layer instance proc addr");
get_function(function_name)
}
2023-01-10 13:24:04 +00:00
2023-01-10 15:56:56 +00:00
fn get_function(function_name: *const c_char) -> PFN_vkVoidFunction {
2023-01-10 13:24:04 +00:00
let func_string = match VkString::try_from(function_name) {
Ok(func) => func,
Err(_) => {
write_log("Err: failed creating string");
return Functions::Null.convert();
}
};
2023-01-10 15:56:56 +00:00
let s = func_string.as_str();
cmp_instance_fn!(s, {
2023-01-10 15:56:56 +00:00
[debug_utils_messenger_functions, vkCreateDebugUtilsMessengerEXT],
[debug_utils_messenger_functions, vkDestroyDebugUtilsMessengerEXT],
[debug_report_callback_functions, vkCreateDebugReportCallbackEXT],
[debug_report_callback_functions, vkDestroyDebugReportCallbackEXT],
[instance_functions, vkEnumeratePhysicalDevices],
[instance_functions, vkGetPhysicalDeviceFeatures],
[instance_functions, vkGetPhysicalDeviceFormatProperties],
[instance_functions, vkGetPhysicalDeviceImageFormatProperties],
[instance_functions, vkGetPhysicalDeviceProperties],
[instance_functions, vkGetPhysicalDeviceQueueFamilyProperties],
[instance_functions, vkGetPhysicalDeviceMemoryProperties],
[instance_functions, vkEnumerateDeviceExtensionProperties],
// [instance_functions, vkEnumerateDeviceLayerProperties],
[instance_functions, vkGetPhysicalDeviceSparseImageFormatProperties],
// [instance_functions, vkEnumeratePhysicalDeviceGroups],
[physical_device_properties2_functions, vkGetPhysicalDeviceFeatures2KHR],
[physical_device_properties2_functions, vkGetPhysicalDeviceProperties2KHR],
[physical_device_properties2_functions, vkGetPhysicalDeviceFormatProperties2KHR],
[physical_device_properties2_functions, vkGetPhysicalDeviceFeatures2KHR],
[physical_device_properties2_functions, vkGetPhysicalDeviceFeatures2KHR],
[instance_wsi_functions, vkDestroySurfaceKHR],
[instance_wsi_functions, vkGetPhysicalDeviceSurfaceSupportKHR],
[instance_wsi_functions, vkGetPhysicalDeviceSurfaceCapabilitiesKHR],
[instance_wsi_functions, vkGetPhysicalDeviceSurfaceFormatsKHR],
[instance_wsi_functions, vkGetPhysicalDeviceSurfacePresentModesKHR],
[instance_wsi_functions, vkGetPhysicalDeviceDisplayPropertiesKHR],
[instance_wsi_functions, vkGetPhysicalDeviceDisplayPlanePropertiesKHR],
[instance_wsi_functions, vkGetDisplayPlaneSupportedDisplaysKHR],
[instance_wsi_functions, vkGetDisplayModePropertiesKHR],
[instance_wsi_functions, vkCreateDisplayModeKHR],
[instance_wsi_functions, vkGetDisplayPlaneCapabilitiesKHR],
[instance_wsi_functions, vkCreateDisplayPlaneSurfaceKHR],
[instance_wsi_functions, vkCreateXlibSurfaceKHR],
[instance_wsi_functions, vkGetPhysicalDeviceXlibPresentationSupportKHR],
[instance_wsi_functions, vkCreateXcbSurfaceKHR],
[instance_wsi_functions, vkGetPhysicalDeviceXcbPresentationSupportKHR],
[instance_wsi_functions, vkCreateWaylandSurfaceKHR],
[instance_wsi_functions, vkGetPhysicalDeviceWaylandPresentationSupportKHR],
}
);
cmp_device_fn!(s, {
[device_functions, vkGetDeviceQueue],
[device_functions, vkQueueSubmit],
[device_functions, vkQueueWaitIdle],
[device_functions, vkDeviceWaitIdle],
[device_functions, vkAllocateMemory],
[device_functions, vkFreeMemory],
[device_functions, vkMapMemory],
[device_functions, vkUnmapMemory],
[device_functions, vkBindBufferMemory],
[device_functions, vkBindImageMemory],
[device_functions, vkGetBufferMemoryRequirements],
[device_functions, vkGetImageMemoryRequirements],
[device_functions, vkCreateFence],
[device_functions, vkDestroyFence],
[device_functions, vkResetFences],
[device_functions, vkWaitForFences],
[device_functions, vkCreateSemaphore],
[device_functions, vkDestroySemaphore],
[device_functions, vkCreateEvent],
[device_functions, vkDestroyEvent],
[device_functions, vkGetEventStatus],
[device_functions, vkSetEvent],
[device_functions, vkResetEvent],
[device_functions, vkCreateBuffer],
[device_functions, vkDestroyBuffer],
[device_functions, vkCreateBufferView],
[device_functions, vkDestroyBufferView],
[device_functions, vkCreateImage],
[device_functions, vkDestroyImage],
[device_functions, vkGetImageSubresourceLayout],
[device_functions, vkCreateImageView],
[device_functions, vkDestroyImageView],
[device_functions, vkCreateShaderModule],
[device_functions, vkDestroyShaderModule],
[device_functions, vkCreatePipelineCache],
[device_functions, vkDestroyPipelineCache],
[device_functions, vkGetPipelineCacheData],
[device_functions, vkMergePipelineCaches],
[device_functions, vkCreateGraphicsPipelines],
[device_functions, vkCreateComputePipelines],
[device_functions, vkDestroyPipeline],
[device_functions, vkCreatePipelineLayout],
[device_functions, vkDestroyPipelineLayout],
[device_functions, vkCreateSampler],
[device_functions, vkDestroySampler],
[device_functions, vkCreateDescriptorSetLayout],
[device_functions, vkDestroyDescriptorSetLayout],
[device_functions, vkCreateDescriptorPool],
[device_functions, vkDestroyDescriptorPool],
[device_functions, vkResetDescriptorPool],
[device_functions, vkAllocateDescriptorSets],
[device_functions, vkFreeDescriptorSets],
[device_functions, vkUpdateDescriptorSets],
[device_functions, vkCreateFramebuffer],
[device_functions, vkDestroyFramebuffer],
[device_functions, vkCreateRenderPass],
[device_functions, vkDestroyRenderPass],
[device_functions, vkCreateCommandPool],
[device_functions, vkDestroyCommandPool],
[device_functions, vkResetCommandPool],
[device_functions, vkAllocateCommandBuffers],
[device_functions, vkFreeCommandBuffers],
[device_functions, vkBeginCommandBuffer],
[device_functions, vkEndCommandBuffer],
[device_functions, vkResetCommandBuffer],
[device_functions, vkCmdBindPipeline],
[device_functions, vkCmdSetViewport],
[device_functions, vkCmdSetScissor],
[device_functions, vkCmdSetLineWidth],
[device_functions, vkCmdSetDepthBias],
[device_functions, vkCmdSetBlendConstants],
[device_functions, vkCmdSetDepthBounds],
[device_functions, vkCmdSetStencilCompareMask],
[device_functions, vkCmdSetStencilWriteMask],
[device_functions, vkCmdSetStencilReference],
[device_functions, vkCmdBindDescriptorSets],
[device_functions, vkCmdBindIndexBuffer],
[device_functions, vkCmdBindVertexBuffers],
[device_functions, vkCmdDraw],
[device_functions, vkCmdDispatch],
[device_functions, vkCmdCopyBuffer],
[device_functions, vkCmdCopyImage],
[device_functions, vkCmdBlitImage],
[device_functions, vkCmdCopyBufferToImage],
[device_functions, vkCmdCopyImageToBuffer],
[device_functions, vkCmdUpdateBuffer],
[device_functions, vkCmdFillBuffer],
[device_functions, vkCmdClearColorImage],
[device_functions, vkCmdClearDepthStencilImage],
[device_functions, vkCmdClearAttachments],
[device_functions, vkCmdResolveImage],
[device_functions, vkCmdSetEvent],
[device_functions, vkCmdResetEvent],
[device_functions, vkCmdWaitEvents],
[device_functions, vkCmdPipelineBarrier],
[device_functions, vkCmdPushConstants],
[device_functions, vkCmdBeginRenderPass],
[device_functions, vkCmdNextSubpass],
[device_functions, vkCmdEndRenderPass],
[device_functions, vkCmdExecuteCommands],
[device_functions, vkTrimCommandPool],
[device_functions, vkGetBufferDeviceAddress],
2023-01-10 18:02:58 +00:00
[device_functions, vkGetBufferMemoryRequirements2],
[device_functions, vkGetImageMemoryRequirements2],
[device_functions, vkBindBufferMemory2],
[device_functions, vkBindImageMemory2],
[device_wsi_functions, vkCreateSwapchainKHR],
[device_wsi_functions, vkDestroySwapchainKHR],
[device_wsi_functions, vkAcquireNextImageKHR],
[device_wsi_functions, vkQueuePresentKHR],
[device_wsi_functions, vkGetSwapchainImagesKHR],
2023-01-10 18:02:58 +00:00
[acceleration_structure_functions, vkBuildAccelerationStructuresKHR],
[acceleration_structure_functions, vkCmdBuildAccelerationStructuresIndirectKHR],
[acceleration_structure_functions, vkCmdBuildAccelerationStructuresKHR],
[acceleration_structure_functions, vkCmdCopyAccelerationStructureKHR],
[acceleration_structure_functions, vkCmdCopyAccelerationStructureToMemoryKHR],
[acceleration_structure_functions, vkCmdCopyMemoryToAccelerationStructureKHR],
[acceleration_structure_functions, vkCmdWriteAccelerationStructuresPropertiesKHR],
[acceleration_structure_functions, vkCopyAccelerationStructureKHR],
[acceleration_structure_functions, vkCopyAccelerationStructureToMemoryKHR],
[acceleration_structure_functions, vkCopyMemoryToAccelerationStructureKHR],
[acceleration_structure_functions, vkCreateAccelerationStructureKHR],
[acceleration_structure_functions, vkDestroyAccelerationStructureKHR],
[acceleration_structure_functions, vkGetAccelerationStructureBuildSizesKHR],
[acceleration_structure_functions, vkGetAccelerationStructureDeviceAddressKHR],
[acceleration_structure_functions, vkGetDeviceAccelerationStructureCompatibilityKHR],
[acceleration_structure_functions, vkWriteAccelerationStructuresPropertiesKHR],
[ray_tracing_pipeline_functions, vkCmdSetRayTracingPipelineStackSizeKHR],
[ray_tracing_pipeline_functions, vkCmdTraceRaysIndirectKHR],
[ray_tracing_pipeline_functions, vkCmdTraceRaysKHR],
[ray_tracing_pipeline_functions, vkCreateRayTracingPipelinesKHR],
[ray_tracing_pipeline_functions, vkGetRayTracingCaptureReplayShaderGroupHandlesKHR],
[ray_tracing_pipeline_functions, vkGetRayTracingShaderGroupHandlesKHR],
[ray_tracing_pipeline_functions, vkGetRayTracingShaderGroupStackSizeKHR],
[maintenance3_functions, vkGetDescriptorSetLayoutSupport],
});
2023-01-10 15:56:56 +00:00
match s {
2023-01-10 13:24:04 +00:00
"vkCreateDevice" => Functions::CreateDevice(create_device),
"vkDestroyDevice" => Functions::DestroyDevice(destroy_device),
"vkCreateInstance" => Functions::CreateInstance(create_instance),
"vkDestroyInstance" => Functions::DestroyInstance(destroy_instance),
2023-01-10 15:56:56 +00:00
_ => {
write_log(format!("\trequested fn: {}", s));
write_log(format!("\t-> not found"));
Functions::Null
}
2023-01-10 13:24:04 +00:00
}
.convert()
}
extern "system" fn create_instance(
create_info: *const VkInstanceCreateInfo,
allocator: *const VkAllocationCallbacks,
instance: *mut VkInstance,
) -> VkResult {
2023-01-10 15:56:56 +00:00
write_log(" ================== vulkan layer create instance ==================");
2023-01-10 13:24:04 +00:00
let chain_info = match VkLayerInstanceCreateInfo::get_chain_info(
unsafe { &*create_info },
VK_LAYER_LINK_INFO,
) {
Some(info) => info,
None => {
2023-01-10 17:20:18 +00:00
write_log("instance chain info not found.");
2023-01-10 13:24:04 +00:00
return VK_ERROR_LAYER_NOT_PRESENT;
}
};
let proc_addr = chain_info.layer_info().next_instance_proc_addr;
2023-01-10 15:56:56 +00:00
let static_functions = StaticFunctions {
_lib: None,
vkGetInstanceProcAddr: proc_addr,
2023-01-10 13:24:04 +00:00
};
2023-01-10 15:56:56 +00:00
let entry_functions = EntryFunctions::new(&static_functions);
2023-01-10 13:24:04 +00:00
chain_info.advance_layer_info();
2023-01-10 15:56:56 +00:00
let result = unsafe { entry_functions.vkCreateInstance(create_info, allocator, instance) };
2023-01-10 13:24:04 +00:00
if result != VK_SUCCESS {
return result;
2023-01-10 17:20:18 +00:00
};
2023-01-10 15:56:56 +00:00
2023-01-10 17:20:18 +00:00
set_instance_fns(VkInstanceHandles::load_instance(
static_functions,
entry_functions,
unsafe { *instance },
));
2023-01-10 15:56:56 +00:00
write_log("-> successfully created instance.");
2023-01-10 13:24:04 +00:00
VK_SUCCESS
}
extern "system" fn destroy_instance(instance: VkInstance, allocator: *const VkAllocationCallbacks) {
2023-01-10 15:56:56 +00:00
write_log(" ================== vulkan layer destroy instance ==================");
2023-01-10 17:20:18 +00:00
unsafe {
instance_fns()
.instance_functions
.vkDestroyInstance(instance, allocator)
};
2023-01-10 13:24:04 +00:00
}
extern "system" fn create_device(
physical_device: VkPhysicalDevice,
create_info: *const VkDeviceCreateInfo<'_>,
allocator: *const VkAllocationCallbacks,
device: *mut VkDevice,
) -> VkResult {
2023-01-10 15:56:56 +00:00
write_log(" ================== vulkan layer create device ==================");
2023-01-10 13:24:04 +00:00
2023-01-10 17:20:18 +00:00
let chain_info =
match VkLayerDeviceCreateInfo::get_chain_info(unsafe { &*create_info }, VK_LAYER_LINK_INFO)
{
Some(info) => info,
None => {
write_log("device chain info not found.");
return VK_ERROR_LAYER_NOT_PRESENT;
}
};
replace_device_proc_addr(chain_info.layer_info().next_device_proc_addr);
2023-01-10 17:20:18 +00:00
let instance = instance_fns();
chain_info.advance_layer_info();
2023-01-10 17:20:18 +00:00
let result = unsafe {
instance
.instance_functions
.vkCreateDevice(physical_device, create_info, allocator, device)
};
if result != VK_SUCCESS {
return result;
}
set_device_fns(VkDeviceHandles::new(unsafe { *device }));
2023-01-10 13:24:04 +00:00
VK_SUCCESS
}
extern "system" fn destroy_device(device: VkDevice, allocator: *const VkAllocationCallbacks) {
2023-01-10 15:56:56 +00:00
write_log(" ================== vulkan layer destroy device ==================");
2023-01-10 17:20:18 +00:00
unsafe {
device_fns()
.device_functions
.vkDestroyDevice(device, allocator)
}
2023-01-10 13:24:04 +00:00
}
fn write_log(msg: impl ToString) {
let mut file = OpenOptions::new()
.append(true)
.create(true)
.open("/home/michael/rf2_vk_hud.log")
.unwrap();
file.write_all(format!("{}\n", msg.to_string()).as_bytes())
.unwrap();
}