use FromNativeObject;
use TryDestroyError;
use TryDestroyErrorKind;
use VulkanObject;
use core;
use khr_display::{self, DisplayKhr};
use std::cmp::Ordering;
use std::hash::{Hash, Hasher};
use std::mem;
use vks;
#[derive(Debug, Clone)]
pub struct DisplayModeKhr {
pub(crate) handle: vks::khr_display::VkDisplayModeKHR,
display: DisplayKhr,
}
unsafe impl Send for DisplayModeKhr { }
unsafe impl Sync for DisplayModeKhr { }
impl PartialEq for DisplayModeKhr {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.handle == other.handle
}
}
impl Eq for DisplayModeKhr { }
impl PartialOrd for DisplayModeKhr {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.handle.partial_cmp(&other.handle)
}
}
impl Ord for DisplayModeKhr {
#[inline]
fn cmp(&self, other: &Self) -> Ordering {
self.handle.cmp(&other.handle)
}
}
impl Hash for DisplayModeKhr {
#[inline]
fn hash<H: Hasher>(&self, state: &mut H) {
self.handle.hash(state);
}
}
impl VulkanObject for DisplayModeKhr {
type NativeVulkanObject = vks::khr_display::VkDisplayModeKHR;
#[inline]
fn id(&self) -> u64 {
self.handle
}
#[inline]
fn as_native_vulkan_object(&self) -> Self::NativeVulkanObject {
self.handle
}
fn try_destroy(self) -> Result<(), TryDestroyError<Self>> {
Err(TryDestroyError::new(self, TryDestroyErrorKind::Unsupported))
}
}
impl FromNativeObject for DisplayModeKhr {
type Parameters = DisplayKhr;
unsafe fn from_native_object(object: Self::NativeVulkanObject, params: Self::Parameters) -> Self {
DisplayModeKhr::new(object, params)
}
}
impl DisplayModeKhr {
pub(crate) fn new(display_mode: vks::khr_display::VkDisplayModeKHR, display: DisplayKhr) -> Self {
DisplayModeKhr {
handle: display_mode,
display: display,
}
}
#[inline]
pub(crate) fn loader(&self) -> &vks::InstanceProcAddrLoader {
self.display.loader()
}
#[inline]
pub(crate) fn physical_device_handle(&self) -> vks::core::VkPhysicalDevice {
self.display.physical_device_handle()
}
pub fn get_display_plane_capabilities_khr(&self, plane_index: u32) -> Result<khr_display::DisplayPlaneCapabilitiesKhr, core::Error> {
unsafe {
let mut capabilities = mem::uninitialized();
let res = self.loader().khr_display.vkGetDisplayPlaneCapabilitiesKHR(self.physical_device_handle(), self.handle, plane_index, &mut capabilities);
if res == vks::core::VK_SUCCESS {
Ok((&capabilities).into())
}
else {
Err(res.into())
}
}
}
}