blob: 39dee0328e70207dbab80c11f609c8b75bd7866a [file] [log] [blame]
// Copyright (c) 2020 The vulkano developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>,
// at your option. All files in the project carrying such
// notice may not be copied, modified, or distributed except
// according to those terms.
use std::ops::BitOr;
/// Describes the handle type used for Vulkan external memory apis. This is **not** just a
/// suggestion. Check out vkExternalMemoryHandleTypeFlagBits in the Vulkan spec.
///
/// If you specify an handle type that doesnt make sense (for example, using a dma-buf handle type
/// on Windows) when using this handle, a panic will happen.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct ExternalMemoryHandleType {
pub opaque_fd: bool,
pub opaque_win32: bool,
pub opaque_win32_kmt: bool,
pub d3d11_texture: bool,
pub d3d11_texture_kmt: bool,
pub d3d12_heap: bool,
pub d3d12_resource: bool,
pub dma_buf: bool,
pub android_hardware_buffer: bool,
pub host_allocation: bool,
pub host_mapped_foreign_memory: bool,
}
impl ExternalMemoryHandleType {
/// Builds a `ExternalMemoryHandleType` with all values set to false. Useful as a default value.
///
/// # Example
///
/// ```rust
/// use vulkano::memory::ExternalMemoryHandleType as ExternalMemoryHandleType;
///
/// let _handle_type = ExternalMemoryHandleType {
/// opaque_fd: true,
/// .. ExternalMemoryHandleType::none()
/// };
/// ```
#[inline]
pub fn none() -> ExternalMemoryHandleType {
ExternalMemoryHandleType {
opaque_fd: false,
opaque_win32: false,
opaque_win32_kmt: false,
d3d11_texture: false,
d3d11_texture_kmt: false,
d3d12_heap: false,
d3d12_resource: false,
dma_buf: false,
android_hardware_buffer: false,
host_allocation: false,
host_mapped_foreign_memory: false,
}
}
/// Builds an `ExternalMemoryHandleType` for a posix file descriptor.
///
/// # Example
///
/// ```rust
/// use vulkano::memory::ExternalMemoryHandleType as ExternalMemoryHandleType;
///
/// let _handle_type = ExternalMemoryHandleType::posix();
/// ```
#[inline]
pub fn posix() -> ExternalMemoryHandleType {
ExternalMemoryHandleType {
opaque_fd: true,
..ExternalMemoryHandleType::none()
}
}
}
impl From<ExternalMemoryHandleType> for ash::vk::ExternalMemoryHandleTypeFlags {
#[inline]
fn from(val: ExternalMemoryHandleType) -> Self {
let mut result = ash::vk::ExternalMemoryHandleTypeFlags::empty();
if val.opaque_fd {
result |= ash::vk::ExternalMemoryHandleTypeFlags::OPAQUE_FD;
}
if val.opaque_win32 {
result |= ash::vk::ExternalMemoryHandleTypeFlags::OPAQUE_WIN32;
}
if val.opaque_win32_kmt {
result |= ash::vk::ExternalMemoryHandleTypeFlags::OPAQUE_WIN32_KMT;
}
if val.d3d11_texture {
result |= ash::vk::ExternalMemoryHandleTypeFlags::D3D11_TEXTURE;
}
if val.d3d11_texture_kmt {
result |= ash::vk::ExternalMemoryHandleTypeFlags::D3D11_TEXTURE_KMT;
}
if val.d3d12_heap {
result |= ash::vk::ExternalMemoryHandleTypeFlags::D3D12_HEAP;
}
if val.d3d12_resource {
result |= ash::vk::ExternalMemoryHandleTypeFlags::D3D12_RESOURCE;
}
if val.dma_buf {
result |= ash::vk::ExternalMemoryHandleTypeFlags::DMA_BUF_EXT;
}
if val.android_hardware_buffer {
result |= ash::vk::ExternalMemoryHandleTypeFlags::ANDROID_HARDWARE_BUFFER_ANDROID;
}
if val.host_allocation {
result |= ash::vk::ExternalMemoryHandleTypeFlags::HOST_ALLOCATION_EXT;
}
if val.host_mapped_foreign_memory {
result |= ash::vk::ExternalMemoryHandleTypeFlags::HOST_MAPPED_FOREIGN_MEMORY_EXT
}
result
}
}
impl From<ash::vk::ExternalMemoryHandleTypeFlags> for ExternalMemoryHandleType {
fn from(val: ash::vk::ExternalMemoryHandleTypeFlags) -> Self {
ExternalMemoryHandleType {
opaque_fd: !(val & ash::vk::ExternalMemoryHandleTypeFlags::OPAQUE_FD).is_empty(),
opaque_win32: !(val & ash::vk::ExternalMemoryHandleTypeFlags::OPAQUE_WIN32).is_empty(),
opaque_win32_kmt: !(val & ash::vk::ExternalMemoryHandleTypeFlags::OPAQUE_WIN32_KMT)
.is_empty(),
d3d11_texture: !(val & ash::vk::ExternalMemoryHandleTypeFlags::D3D11_TEXTURE)
.is_empty(),
d3d11_texture_kmt: !(val & ash::vk::ExternalMemoryHandleTypeFlags::D3D11_TEXTURE_KMT)
.is_empty(),
d3d12_heap: !(val & ash::vk::ExternalMemoryHandleTypeFlags::D3D12_HEAP).is_empty(),
d3d12_resource: !(val & ash::vk::ExternalMemoryHandleTypeFlags::D3D12_RESOURCE)
.is_empty(),
dma_buf: !(val & ash::vk::ExternalMemoryHandleTypeFlags::DMA_BUF_EXT).is_empty(),
android_hardware_buffer: !(val
& ash::vk::ExternalMemoryHandleTypeFlags::ANDROID_HARDWARE_BUFFER_ANDROID)
.is_empty(),
host_allocation: !(val & ash::vk::ExternalMemoryHandleTypeFlags::HOST_ALLOCATION_EXT)
.is_empty(),
host_mapped_foreign_memory: !(val
& ash::vk::ExternalMemoryHandleTypeFlags::HOST_MAPPED_FOREIGN_MEMORY_EXT)
.is_empty(),
}
}
}
impl BitOr for ExternalMemoryHandleType {
type Output = Self;
#[inline]
fn bitor(self, rhs: Self) -> Self {
ExternalMemoryHandleType {
opaque_fd: self.opaque_fd || rhs.opaque_fd,
opaque_win32: self.opaque_win32 || rhs.opaque_win32,
opaque_win32_kmt: self.opaque_win32_kmt || rhs.opaque_win32_kmt,
d3d11_texture: self.d3d11_texture || rhs.d3d11_texture,
d3d11_texture_kmt: self.d3d11_texture_kmt || rhs.d3d11_texture_kmt,
d3d12_heap: self.d3d12_heap || rhs.d3d12_heap,
d3d12_resource: self.d3d12_resource || rhs.d3d12_resource,
dma_buf: self.dma_buf || rhs.dma_buf,
android_hardware_buffer: self.android_hardware_buffer || rhs.android_hardware_buffer,
host_allocation: self.host_allocation || rhs.host_allocation,
host_mapped_foreign_memory: self.host_mapped_foreign_memory
|| rhs.host_mapped_foreign_memory,
}
}
}