0adf3505ec
This doesn't cause an API break in the C API but we don't actually make an attempt to verify that it's safe to access any of the device contexts.
76 lines
2.1 KiB
Rust
76 lines
2.1 KiB
Rust
use gl::types::{GLenum, GLuint};
|
|
|
|
use crate::error;
|
|
use crate::error::FilterChainError;
|
|
use librashader_reflect::back::cross::GlslVersion;
|
|
|
|
pub unsafe fn gl_compile_shader(stage: GLenum, source: &str) -> error::Result<GLuint> {
|
|
let (shader, compile_status) = unsafe {
|
|
let shader = gl::CreateShader(stage);
|
|
gl::ShaderSource(
|
|
shader,
|
|
1,
|
|
&source.as_bytes().as_ptr().cast(),
|
|
std::ptr::null(),
|
|
);
|
|
gl::CompileShader(shader);
|
|
let mut compile_status = 0;
|
|
gl::GetShaderiv(shader, gl::COMPILE_STATUS, &mut compile_status);
|
|
(shader, compile_status)
|
|
};
|
|
|
|
if compile_status == 0 {
|
|
Err(FilterChainError::GlCompileError)
|
|
} else {
|
|
Ok(shader)
|
|
}
|
|
}
|
|
|
|
pub fn gl_get_version() -> GlslVersion {
|
|
let mut maj_ver = 0;
|
|
let mut min_ver = 0;
|
|
unsafe {
|
|
gl::GetIntegerv(gl::MAJOR_VERSION, &mut maj_ver);
|
|
gl::GetIntegerv(gl::MINOR_VERSION, &mut min_ver);
|
|
}
|
|
|
|
match maj_ver {
|
|
3 => match min_ver {
|
|
3 => GlslVersion::V3_30,
|
|
2 => GlslVersion::V1_50,
|
|
1 => GlslVersion::V1_40,
|
|
0 => GlslVersion::V1_30,
|
|
_ => GlslVersion::V1_50,
|
|
},
|
|
4 => match min_ver {
|
|
6 => GlslVersion::V4_60,
|
|
5 => GlslVersion::V4_50,
|
|
4 => GlslVersion::V4_40,
|
|
3 => GlslVersion::V4_30,
|
|
2 => GlslVersion::V4_20,
|
|
1 => GlslVersion::V4_10,
|
|
0 => GlslVersion::V4_00,
|
|
_ => GlslVersion::V1_50,
|
|
},
|
|
_ => GlslVersion::V1_50,
|
|
}
|
|
}
|
|
|
|
pub fn gl_u16_to_version(version: u16) -> GlslVersion {
|
|
match version {
|
|
0 => gl_get_version(),
|
|
300 => GlslVersion::V1_30,
|
|
310 => GlslVersion::V1_40,
|
|
320 => GlslVersion::V1_50,
|
|
330 => GlslVersion::V3_30,
|
|
400 => GlslVersion::V4_00,
|
|
410 => GlslVersion::V4_10,
|
|
420 => GlslVersion::V4_20,
|
|
430 => GlslVersion::V4_30,
|
|
440 => GlslVersion::V4_40,
|
|
450 => GlslVersion::V4_50,
|
|
460 => GlslVersion::V4_60,
|
|
_ => GlslVersion::V1_50,
|
|
}
|
|
}
|