use crate::unmanaged_interop::{VulkanDeviceApi, VulkanInstanceApi};
use crate::IVulkanRenderTarget;
use ash::vk;
use ferroui_base::platform::surfaces::IPlatformRenderSurface;
use ferroui_base::platform::{IOptionalFeatureProvider, IPlatformGraphicsContext};
use ferroui_base::reactive::IDisposable;
use std::rc::Rc;
use std::sync::Arc;
pub trait IVulkanDevice: IOptionalFeatureProvider + Send + Sync {
fn handle(&self) -> isize;
fn physical_device_handle(&self) -> isize;
fn main_queue_handle(&self) -> isize;
fn graphics_queue_family_index(&self) -> u32;
fn instance(&self) -> Arc<dyn IVulkanInstance>;
fn is_lost(&self) -> bool;
fn lock(&self) -> Rc<dyn IDisposable>;
fn enabled_extensions(&self) -> Vec<String>;
fn dispose(&self);
}
pub trait IVulkanInstance: Send + Sync {
fn handle(&self) -> isize;
fn get_instance_proc_address(&self, instance: isize, name: &str) -> isize;
fn get_device_proc_address(&self, device: isize, name: &str) -> isize;
fn enabled_extensions(&self) -> Vec<String>;
}
pub trait IVulkanPlatformGraphicsContext: IPlatformGraphicsContext {
fn device(&self) -> Arc<dyn IVulkanDevice>;
fn instance(&self) -> Arc<dyn IVulkanInstance>;
fn instance_api(&self) -> &VulkanInstanceApi;
fn device_api(&self) -> &VulkanDeviceApi;
fn device_handle(&self) -> vk::Device;
fn physical_device_handle(&self) -> vk::PhysicalDevice;
fn instance_handle(&self) -> vk::Instance;
fn main_queue_handle(&self) -> vk::Queue;
fn graphics_queue_family_index(&self) -> u32;
fn create_render_target(&self, surfaces: &[Arc<dyn IPlatformRenderSurface>]) -> Rc<dyn IVulkanRenderTarget>;
}