mallumo-gls 0.43.0

Small low level library for modern (4.5 Core) OpenGL
Documentation
use super::*;
use super::errors::*;

use std::os::raw::c_void;

#[repr(C, packed)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct DrawElementsIndirectCommand {
    pub count: u32,
    pub instance_count: u32,
    pub first_index: u32,
    pub base_vertex: u32,
    pub base_instance: u32,
}

#[repr(C, packed)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct DrawArraysIndirectCommand {
    pub count: u32,
    pub instance_count: u32,
    pub first: u32,
    pub base_instance: u32,
}

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum DrawMode {
    Points,
    LineStrip,
    LineLoop,
    Lines,
    LineStripAdjacency,
    LinesAdjacency,
    TriangleStrip,
    TriangleFan,
    Triangles,
    TriangleStripAdjacency,
    TrianglesAdjacency,
    Patches,
}

impl From<DrawMode> for gl::types::GLenum {
    fn from(draw_mode: DrawMode) -> gl::types::GLenum {
        match draw_mode {
            DrawMode::Points => gl::POINTS,
            DrawMode::LineStrip => gl::LINE_STRIP,
            DrawMode::LineLoop => gl::LINE_LOOP,
            DrawMode::Lines => gl::LINES,
            DrawMode::LineStripAdjacency => gl::LINE_STRIP_ADJACENCY,
            DrawMode::LinesAdjacency => gl::LINES_ADJACENCY,
            DrawMode::TriangleStrip => gl::TRIANGLE_STRIP,
            DrawMode::TriangleFan => gl::TRIANGLE_FAN,
            DrawMode::Triangles => gl::TRIANGLES,
            DrawMode::TriangleStripAdjacency => gl::TRIANGLE_STRIP_ADJACENCY,
            DrawMode::TrianglesAdjacency => gl::TRIANGLES_ADJACENCY,
            DrawMode::Patches => gl::PATCHES,
        }
    }
}

pub unsafe fn draw_arrays(mode: DrawMode, first: usize, count: usize) -> Result<()> {
    gl::DrawArrays(mode.into(), first as i32, count as i32);

    get_error(())
}

pub unsafe fn draw_arrays_indirect(mode: DrawMode, offset: usize) -> Result<()> {
    gl::DrawArraysIndirect(mode.into(), offset as *const usize as *const c_void);

    get_error(())
}

pub unsafe fn draw_arrays_instanced(mode: DrawMode, first: usize, count: usize, primitive_count: usize) -> Result<()> {
    gl::DrawArraysInstanced(
        mode.into(),
        first as i32,
        count as i32,
        primitive_count as i32,
    );

    get_error(())
}

pub unsafe fn draw_arrays_instanced_base_instace(
    mode: DrawMode,
    first: usize,
    count: usize,
    primitive_count: usize,
    base_instance: usize,
) -> Result<()> {
    gl::DrawArraysInstancedBaseInstance(
        mode.into(),
        first as i32,
        count as i32,
        primitive_count as i32,
        base_instance as u32,
    );

    get_error(())
}

pub unsafe fn multi_draw_arrays(mode: DrawMode, first: &[u32], count: &[u32], draw_count: usize) -> Result<()> {
    gl::MultiDrawArrays(
        mode.into(),
        first.as_ptr() as *const i32,
        count.as_ptr() as *const i32,
        draw_count as i32,
    );

    get_error(())
}

pub unsafe fn multi_draw_arrays_indirect(mode: DrawMode, draw_count: usize, stride: usize) -> Result<()> {
    gl::MultiDrawArraysIndirect(
        mode.into(),
        0 as *const ::std::os::raw::c_void,
        draw_count as i32,
        stride as i32,
    );

    get_error(())
}

pub unsafe fn multi_draw_elements_indirect(mode: DrawMode, draw_count: usize, stride: usize) -> Result<()> {
    gl::MultiDrawElementsIndirect(
        mode.into(),
        gl::UNSIGNED_INT,
        0 as *const ::std::os::raw::c_void,
        draw_count as i32,
        stride as i32,
    );

    get_error(())
}