mod handles;
pub use handles::*;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub enum GpuResource {
D3D11Texture(D3D11Texture),
D3D12Resource(D3D12Resource),
D3D12BufferHandle(D3D12BufferHandle),
VkImage(VkImage),
VkBufferHandle(VkBufferHandle),
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
VkOpaqueFd(VkOpaqueFd),
#[cfg(windows)]
VkOpaqueWin32(VkOpaqueWin32),
CudaPtr2D(CudaPtr2D),
CudaBufferHandle(CudaBufferHandle),
#[cfg(feature = "wgpu")]
CudaSurface(CudaSurface),
OpenClMem(OpenClMem),
MetalTextureHandle(MetalTextureHandle),
MetalBufferHandle(MetalBufferHandle),
#[cfg(target_vendor = "apple")]
IoSurface(IoSurface),
#[cfg(target_vendor = "apple")]
VideoToolboxFrame(VideoToolboxFrame),
GlTextureHandle(GlTextureHandle),
GlBufferHandle(GlBufferHandle),
#[cfg(any(target_os = "linux", target_os = "android"))]
DmaBufHandle(DmaBufHandle),
#[cfg(target_os = "linux")]
VaapiSurface(VaapiSurface),
#[cfg(target_os = "android")]
AHardwareBufferHandle(AHardwareBufferHandle),
#[cfg(target_os = "android")]
MediaCodecFrame(MediaCodecFrame),
#[cfg(target_os = "android")]
AImageFrame(AImageFrame),
#[cfg(target_os = "android")]
AndroidNativeWindowHandle(AndroidNativeWindowHandle),
#[cfg(target_os = "android")]
AndroidSurfaceControlHandle(AndroidSurfaceControlHandle),
#[cfg(windows)]
NtHandle(NtHandle),
#[cfg(windows)]
KmtToken(KmtToken),
CpuBytes(CpuBytes),
CpuPlanes(CpuPlaneSet),
CpuSharedSlot(CpuSharedSlot),
#[cfg(feature = "wgpu")]
WgpuTexture(WgpuTexture),
#[cfg(all(target_family = "wasm", feature = "web"))]
Web(crate::web::WebGpuResource),
}
#[cfg(all(target_family = "wasm", feature = "web", feature = "wgpu"))]
static_assertions::assert_not_impl_any!(GpuResource: Send, Sync);
#[derive(Debug, Copy, Clone)]
pub struct CpuPlaneSet {
pub format: crate::PixelFormat,
pub count: u8,
pub planes: [Option<CpuPlane>; 4],
}
#[derive(Debug, Copy, Clone)]
pub struct CpuPlane {
pub data: *mut u8,
pub size: usize,
pub row_pitch: u32,
}
unsafe impl Send for CpuPlaneSet {}
unsafe impl Sync for CpuPlaneSet {}
unsafe impl Send for CpuPlane {}
unsafe impl Sync for CpuPlane {}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GlTextureTarget {
Texture2D,
Texture2DArray,
Texture3D,
CubeMap,
Rectangle,
Renderbuffer,
}
impl GlTextureTarget {
pub const fn to_gl_enum(self) -> u32 {
match self {
Self::Texture2D => 0x0DE1,
Self::Texture2DArray => 0x8C1A,
Self::Texture3D => 0x806F,
Self::CubeMap => 0x8513,
Self::Rectangle => 0x84F5,
Self::Renderbuffer => 0x8D41,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GlBufferTarget {
ArrayBuffer,
ElementArrayBuffer,
PixelUnpackBuffer,
PixelPackBuffer,
ShaderStorageBuffer,
UniformBuffer,
TransformFeedbackBuffer,
CopyReadBuffer,
CopyWriteBuffer,
}
impl GlBufferTarget {
pub const fn to_gl_enum(self) -> u32 {
match self {
Self::ArrayBuffer => 0x8892,
Self::ElementArrayBuffer => 0x8893,
Self::PixelUnpackBuffer => 0x88EC,
Self::PixelPackBuffer => 0x88EB,
Self::ShaderStorageBuffer => 0x90D2,
Self::UniformBuffer => 0x8A11,
Self::TransformFeedbackBuffer => 0x8C8E,
Self::CopyReadBuffer => 0x8F36,
Self::CopyWriteBuffer => 0x8F37,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GlInternalFormat {
Unspecified,
R8,
R8Snorm,
R8Ui,
R8I,
R16,
R16F,
R16Ui,
R16I,
R32F,
Rg8,
Rg8Snorm,
Rg16,
Rg16F,
Rgba8,
Srgb8Alpha8,
Rgba8Snorm,
Rgb10A2,
Rgba16,
Rgba16F,
Rgba32F,
R11fG11fB10f,
Bgra8,
Depth16,
Depth24Stencil8,
}
impl GlInternalFormat {
pub const fn to_gl_enum(self) -> u32 {
match self {
Self::Unspecified => 0,
Self::R8 => 0x8229,
Self::R8Snorm => 0x8F94,
Self::R8Ui => 0x8232,
Self::R8I => 0x8231,
Self::R16 => 0x822A,
Self::R16F => 0x822D,
Self::R16Ui => 0x8234,
Self::R16I => 0x8233,
Self::R32F => 0x822E,
Self::Rg8 => 0x822B,
Self::Rg8Snorm => 0x8F95,
Self::Rg16 => 0x822C,
Self::Rg16F => 0x822F,
Self::Rgba8 => 0x8058,
Self::Srgb8Alpha8 => 0x8C43,
Self::Rgba8Snorm => 0x8F97,
Self::Rgb10A2 => 0x8059,
Self::Rgba16 => 0x805B,
Self::Rgba16F => 0x881A,
Self::Rgba32F => 0x8814,
Self::R11fG11fB10f => 0x8C3A,
Self::Bgra8 => 0x93A1, Self::Depth16 => 0x81A5,
Self::Depth24Stencil8 => 0x88F0,
}
}
}
impl GpuResource {
pub fn opengl_texture_simple(name: u32) -> Self {
let h = unsafe {
GlTextureHandle::try_from_raw(
name,
GlTextureTarget::Texture2D,
GlInternalFormat::Unspecified,
core::ptr::null_mut(),
None,
None,
)
}
.expect("opengl_texture_simple: name must be non-zero");
Self::GlTextureHandle(h)
}
pub fn opengl_buffer_simple(name: u32, size: u64) -> Self {
let h = unsafe {
GlBufferHandle::try_from_raw(name, GlBufferTarget::ArrayBuffer, size, core::ptr::null_mut(), None, None)
}
.expect("opengl_buffer_simple: name and size must be non-zero");
Self::GlBufferHandle(h)
}
}