all: warn on unsafe-op-in-unsafe-fn
This commit is contained in:
parent
ce7488aa86
commit
73a6e0d5c2
25 changed files with 435 additions and 340 deletions
|
|
@ -83,12 +83,12 @@ unsafe extern "C" fn egl_log(
|
|||
_ => Level::Warn,
|
||||
};
|
||||
let command = if !command.is_null() {
|
||||
CStr::from_ptr(command).to_bytes()
|
||||
unsafe { CStr::from_ptr(command).to_bytes() }
|
||||
} else {
|
||||
b"none"
|
||||
};
|
||||
let message = if !message.is_null() {
|
||||
CStr::from_ptr(message).to_bytes()
|
||||
unsafe { CStr::from_ptr(message).to_bytes() }
|
||||
} else {
|
||||
b"none"
|
||||
};
|
||||
|
|
|
|||
|
|
@ -76,24 +76,30 @@ impl EglContext {
|
|||
&self,
|
||||
f: F,
|
||||
) -> Result<T, RenderError> {
|
||||
if (self.dpy.egl.eglMakeCurrent)(
|
||||
self.dpy.dpy,
|
||||
EGLSurface::none(),
|
||||
EGLSurface::none(),
|
||||
self.ctx,
|
||||
) == EGL_FALSE
|
||||
{
|
||||
return Err(RenderError::MakeCurrent);
|
||||
unsafe {
|
||||
if (self.dpy.egl.eglMakeCurrent)(
|
||||
self.dpy.dpy,
|
||||
EGLSurface::none(),
|
||||
EGLSurface::none(),
|
||||
self.ctx,
|
||||
) == EGL_FALSE
|
||||
{
|
||||
return Err(RenderError::MakeCurrent);
|
||||
}
|
||||
let prev = CURRENT.get();
|
||||
CURRENT.set(self.ctx);
|
||||
let res = f();
|
||||
if (self.dpy.egl.eglMakeCurrent)(
|
||||
self.dpy.dpy,
|
||||
EGLSurface::none(),
|
||||
EGLSurface::none(),
|
||||
prev,
|
||||
) == EGL_FALSE
|
||||
{
|
||||
panic!("Could not restore EGLContext");
|
||||
}
|
||||
CURRENT.set(prev);
|
||||
res
|
||||
}
|
||||
let prev = CURRENT.get();
|
||||
CURRENT.set(self.ctx);
|
||||
let res = f();
|
||||
if (self.dpy.egl.eglMakeCurrent)(self.dpy.dpy, EGLSurface::none(), EGLSurface::none(), prev)
|
||||
== EGL_FALSE
|
||||
{
|
||||
panic!("Could not restore EGLContext");
|
||||
}
|
||||
CURRENT.set(prev);
|
||||
res
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -312,21 +312,23 @@ unsafe fn query_formats(
|
|||
) -> Result<AHashMap<u32, EglFormat>, RenderError> {
|
||||
let mut vec = vec![];
|
||||
let mut num = 0;
|
||||
let res = procs.eglQueryDmaBufFormatsEXT(dpy, num, ptr::null_mut(), &mut num);
|
||||
let res = unsafe { procs.eglQueryDmaBufFormatsEXT(dpy, num, ptr::null_mut(), &mut num) };
|
||||
if res != EGL_TRUE {
|
||||
return Err(RenderError::QueryDmaBufFormats);
|
||||
}
|
||||
vec.reserve_exact(num as usize);
|
||||
let res = procs.eglQueryDmaBufFormatsEXT(dpy, num, vec.as_mut_ptr(), &mut num);
|
||||
let res = unsafe { procs.eglQueryDmaBufFormatsEXT(dpy, num, vec.as_mut_ptr(), &mut num) };
|
||||
if res != EGL_TRUE {
|
||||
return Err(RenderError::QueryDmaBufFormats);
|
||||
}
|
||||
vec.set_len(num as usize);
|
||||
unsafe {
|
||||
vec.set_len(num as usize);
|
||||
}
|
||||
let mut res = AHashMap::new();
|
||||
let formats = formats();
|
||||
for fmt in vec {
|
||||
if let Some(format) = formats.get(&(fmt as u32)) {
|
||||
let (modifiers, external_only) = query_modifiers(procs, dpy, fmt, format)?;
|
||||
let (modifiers, external_only) = unsafe { query_modifiers(procs, dpy, fmt, format)? };
|
||||
res.insert(
|
||||
format.drm,
|
||||
EglFormat {
|
||||
|
|
@ -349,32 +351,38 @@ unsafe fn query_modifiers(
|
|||
let mut mods = vec![];
|
||||
let mut ext_only = vec![];
|
||||
let mut num = 0;
|
||||
let res = procs.eglQueryDmaBufModifiersEXT(
|
||||
dpy,
|
||||
gl_format,
|
||||
num,
|
||||
ptr::null_mut(),
|
||||
ptr::null_mut(),
|
||||
&mut num,
|
||||
);
|
||||
let res = unsafe {
|
||||
procs.eglQueryDmaBufModifiersEXT(
|
||||
dpy,
|
||||
gl_format,
|
||||
num,
|
||||
ptr::null_mut(),
|
||||
ptr::null_mut(),
|
||||
&mut num,
|
||||
)
|
||||
};
|
||||
if res != EGL_TRUE {
|
||||
return Err(RenderError::QueryDmaBufModifiers);
|
||||
}
|
||||
mods.reserve_exact(num as usize);
|
||||
ext_only.reserve_exact(num as usize);
|
||||
let res = procs.eglQueryDmaBufModifiersEXT(
|
||||
dpy,
|
||||
gl_format,
|
||||
num,
|
||||
mods.as_mut_ptr(),
|
||||
ext_only.as_mut_ptr(),
|
||||
&mut num,
|
||||
);
|
||||
let res = unsafe {
|
||||
procs.eglQueryDmaBufModifiersEXT(
|
||||
dpy,
|
||||
gl_format,
|
||||
num,
|
||||
mods.as_mut_ptr(),
|
||||
ext_only.as_mut_ptr(),
|
||||
&mut num,
|
||||
)
|
||||
};
|
||||
if res != EGL_TRUE {
|
||||
return Err(RenderError::QueryDmaBufModifiers);
|
||||
}
|
||||
mods.set_len(num as usize);
|
||||
ext_only.set_len(num as usize);
|
||||
unsafe {
|
||||
mods.set_len(num as usize);
|
||||
ext_only.set_len(num as usize);
|
||||
}
|
||||
let mut res = IndexMap::new();
|
||||
for (modifier, ext_only) in mods.iter().copied().zip(ext_only.iter().copied()) {
|
||||
res.insert(
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ unsafe fn get_extensions(ext: *const c::c_char) -> Option<AHashSet<String>> {
|
|||
return None;
|
||||
}
|
||||
let mut res = AHashSet::new();
|
||||
let ext = CStr::from_ptr(ext).to_bytes();
|
||||
let ext = unsafe { CStr::from_ptr(ext).to_bytes() };
|
||||
for part in ext.split_str(" ") {
|
||||
let name = part.trim();
|
||||
if name.len() > 0 {
|
||||
|
|
@ -32,8 +32,10 @@ unsafe fn get_extensions(ext: *const c::c_char) -> Option<AHashSet<String>> {
|
|||
}
|
||||
|
||||
unsafe fn get_dpy_extensions(dpy: EGLDisplay) -> Option<AHashSet<String>> {
|
||||
let ext = (EGL.as_ref()?.eglQueryString)(dpy, EGL_EXTENSIONS);
|
||||
get_extensions(ext)
|
||||
unsafe {
|
||||
let ext = (EGL.as_ref()?.eglQueryString)(dpy, EGL_EXTENSIONS);
|
||||
get_extensions(ext)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_typed_ext<T>(exts: &AHashSet<String>, mut base: T, map: &[(&str, T)]) -> T
|
||||
|
|
@ -103,7 +105,7 @@ pub(crate) unsafe fn get_display_ext(dpy: EGLDisplay) -> DisplayExt {
|
|||
("EGL_KHR_wait_sync", KHR_WAIT_SYNC),
|
||||
("EGL_ANDROID_native_fence_sync", ANDROID_NATIVE_FENCE_SYNC),
|
||||
];
|
||||
match get_dpy_extensions(dpy) {
|
||||
match unsafe { get_dpy_extensions(dpy) } {
|
||||
Some(exts) => get_typed_ext(&exts, DisplayExt::none(), &map),
|
||||
_ => DisplayExt::none(),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,41 +21,45 @@ impl GlProgram {
|
|||
vert: &str,
|
||||
frag: &str,
|
||||
) -> Result<Self, RenderError> {
|
||||
let vert = GlShader::compile(ctx, GL_VERTEX_SHADER, vert)?;
|
||||
let frag = GlShader::compile(ctx, GL_FRAGMENT_SHADER, frag)?;
|
||||
Self::link(&vert, &frag)
|
||||
unsafe {
|
||||
let vert = GlShader::compile(ctx, GL_VERTEX_SHADER, vert)?;
|
||||
let frag = GlShader::compile(ctx, GL_FRAGMENT_SHADER, frag)?;
|
||||
Self::link(&vert, &frag)
|
||||
}
|
||||
}
|
||||
|
||||
pub(in crate::gfx_apis::gl) unsafe fn link(
|
||||
vert: &GlShader,
|
||||
frag: &GlShader,
|
||||
) -> Result<Self, RenderError> {
|
||||
let gles = vert.ctx.dpy.gles;
|
||||
let res = GlProgram {
|
||||
ctx: vert.ctx.clone(),
|
||||
prog: (gles.glCreateProgram)(),
|
||||
};
|
||||
(gles.glAttachShader)(res.prog, vert.shader);
|
||||
(gles.glAttachShader)(res.prog, frag.shader);
|
||||
(gles.glLinkProgram)(res.prog);
|
||||
(gles.glDetachShader)(res.prog, vert.shader);
|
||||
(gles.glDetachShader)(res.prog, frag.shader);
|
||||
unsafe {
|
||||
let gles = vert.ctx.dpy.gles;
|
||||
let res = GlProgram {
|
||||
ctx: vert.ctx.clone(),
|
||||
prog: (gles.glCreateProgram)(),
|
||||
};
|
||||
(gles.glAttachShader)(res.prog, vert.shader);
|
||||
(gles.glAttachShader)(res.prog, frag.shader);
|
||||
(gles.glLinkProgram)(res.prog);
|
||||
(gles.glDetachShader)(res.prog, vert.shader);
|
||||
(gles.glDetachShader)(res.prog, frag.shader);
|
||||
|
||||
let mut ok = 0;
|
||||
(gles.glGetProgramiv)(res.prog, GL_LINK_STATUS, &mut ok);
|
||||
if ok == GL_FALSE as GLint {
|
||||
return Err(RenderError::ProgramLink);
|
||||
let mut ok = 0;
|
||||
(gles.glGetProgramiv)(res.prog, GL_LINK_STATUS, &mut ok);
|
||||
if ok == GL_FALSE as GLint {
|
||||
return Err(RenderError::ProgramLink);
|
||||
}
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
pub unsafe fn get_uniform_location(&self, name: &CStr) -> GLint {
|
||||
(self.ctx.dpy.gles.glGetUniformLocation)(self.prog, name.as_ptr() as _)
|
||||
unsafe { (self.ctx.dpy.gles.glGetUniformLocation)(self.prog, name.as_ptr() as _) }
|
||||
}
|
||||
|
||||
pub unsafe fn get_attrib_location(&self, name: &CStr) -> GLint {
|
||||
(self.ctx.dpy.gles.glGetAttribLocation)(self.prog, name.as_ptr() as _)
|
||||
unsafe { (self.ctx.dpy.gles.glGetAttribLocation)(self.prog, name.as_ptr() as _) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,10 +39,17 @@ impl GlRenderBuffer {
|
|||
};
|
||||
let gles = &ctx.dpy.gles;
|
||||
let mut rbo = 0;
|
||||
(gles.glGenRenderbuffers)(1, &mut rbo);
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, rbo);
|
||||
(gles.glRenderbufferStorage)(GL_RENDERBUFFER, shm_info.gl_internal_format, width, height);
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, 0);
|
||||
unsafe {
|
||||
(gles.glGenRenderbuffers)(1, &mut rbo);
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, rbo);
|
||||
(gles.glRenderbufferStorage)(
|
||||
GL_RENDERBUFFER,
|
||||
shm_info.gl_internal_format,
|
||||
width,
|
||||
height,
|
||||
);
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, 0);
|
||||
}
|
||||
Ok(Rc::new(GlRenderBuffer {
|
||||
_img: None,
|
||||
ctx: ctx.clone(),
|
||||
|
|
@ -63,12 +70,14 @@ impl GlRenderBuffer {
|
|||
}
|
||||
let gles = ctx.dpy.gles;
|
||||
let mut rbo = 0;
|
||||
(gles.glGenRenderbuffers)(1, &mut rbo);
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, rbo);
|
||||
ctx.dpy
|
||||
.procs
|
||||
.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, GLeglImageOES(img.img.0));
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, 0);
|
||||
unsafe {
|
||||
(gles.glGenRenderbuffers)(1, &mut rbo);
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, rbo);
|
||||
ctx.dpy
|
||||
.procs
|
||||
.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, GLeglImageOES(img.img.0));
|
||||
(gles.glBindRenderbuffer)(GL_RENDERBUFFER, 0);
|
||||
}
|
||||
Ok(Rc::new(GlRenderBuffer {
|
||||
_img: Some(img.clone()),
|
||||
ctx: ctx.clone(),
|
||||
|
|
@ -85,28 +94,30 @@ impl GlRenderBuffer {
|
|||
) -> Result<GlFrameBuffer, RenderError> {
|
||||
let gles = self.ctx.dpy.gles;
|
||||
let mut fbo = 0;
|
||||
(gles.glGenFramebuffers)(1, &mut fbo);
|
||||
(gles.glBindFramebuffer)(GL_FRAMEBUFFER, fbo);
|
||||
(gles.glFramebufferRenderbuffer)(
|
||||
GL_FRAMEBUFFER,
|
||||
GL_COLOR_ATTACHMENT0,
|
||||
GL_RENDERBUFFER,
|
||||
self.rbo,
|
||||
);
|
||||
let status = (gles.glCheckFramebufferStatus)(GL_FRAMEBUFFER);
|
||||
(gles.glBindFramebuffer)(GL_FRAMEBUFFER, 0);
|
||||
let fb = GlFrameBuffer {
|
||||
rb: self.clone(),
|
||||
_tex: None,
|
||||
ctx: self.ctx.clone(),
|
||||
fbo,
|
||||
width: self.width,
|
||||
height: self.height,
|
||||
};
|
||||
if status != GL_FRAMEBUFFER_COMPLETE {
|
||||
return Err(RenderError::CreateFramebuffer);
|
||||
unsafe {
|
||||
(gles.glGenFramebuffers)(1, &mut fbo);
|
||||
(gles.glBindFramebuffer)(GL_FRAMEBUFFER, fbo);
|
||||
(gles.glFramebufferRenderbuffer)(
|
||||
GL_FRAMEBUFFER,
|
||||
GL_COLOR_ATTACHMENT0,
|
||||
GL_RENDERBUFFER,
|
||||
self.rbo,
|
||||
);
|
||||
let status = (gles.glCheckFramebufferStatus)(GL_FRAMEBUFFER);
|
||||
(gles.glBindFramebuffer)(GL_FRAMEBUFFER, 0);
|
||||
let fb = GlFrameBuffer {
|
||||
rb: self.clone(),
|
||||
_tex: None,
|
||||
ctx: self.ctx.clone(),
|
||||
fbo,
|
||||
width: self.width,
|
||||
height: self.height,
|
||||
};
|
||||
if status != GL_FRAMEBUFFER_COMPLETE {
|
||||
return Err(RenderError::CreateFramebuffer);
|
||||
}
|
||||
Ok(fb)
|
||||
}
|
||||
Ok(fb)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,17 +20,21 @@ impl GlShader {
|
|||
src: &str,
|
||||
) -> Result<Self, RenderError> {
|
||||
let gles = ctx.dpy.gles;
|
||||
let shader = (gles.glCreateShader)(ty);
|
||||
let shader = unsafe { (gles.glCreateShader)(ty) };
|
||||
let res = GlShader {
|
||||
ctx: ctx.clone(),
|
||||
shader,
|
||||
};
|
||||
let len = src.len() as _;
|
||||
(gles.glShaderSource)(shader, 1, &(src.as_ptr() as _), &len);
|
||||
(gles.glCompileShader)(shader);
|
||||
unsafe {
|
||||
(gles.glShaderSource)(shader, 1, &(src.as_ptr() as _), &len);
|
||||
(gles.glCompileShader)(shader);
|
||||
}
|
||||
|
||||
let mut ok = 0;
|
||||
(gles.glGetShaderiv)(shader, GL_COMPILE_STATUS, &mut ok);
|
||||
unsafe {
|
||||
(gles.glGetShaderiv)(shader, GL_COMPILE_STATUS, &mut ok);
|
||||
}
|
||||
if ok == GL_FALSE as GLint {
|
||||
return Err(RenderError::ShaderCompileFailed);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,16 +44,18 @@ pub(crate) struct TexProg {
|
|||
|
||||
impl TexProg {
|
||||
unsafe fn from(prog: GlProgram, alpha_multiplier: bool) -> Self {
|
||||
let alpha = match alpha_multiplier {
|
||||
true => prog.get_uniform_location(c"alpha"),
|
||||
false => 0,
|
||||
};
|
||||
Self {
|
||||
pos: prog.get_attrib_location(c"pos"),
|
||||
texcoord: prog.get_attrib_location(c"texcoord"),
|
||||
tex: prog.get_uniform_location(c"tex"),
|
||||
alpha,
|
||||
prog,
|
||||
unsafe {
|
||||
let alpha = match alpha_multiplier {
|
||||
true => prog.get_uniform_location(c"alpha"),
|
||||
false => 0,
|
||||
};
|
||||
Self {
|
||||
pos: prog.get_attrib_location(c"pos"),
|
||||
texcoord: prog.get_attrib_location(c"texcoord"),
|
||||
tex: prog.get_uniform_location(c"tex"),
|
||||
alpha,
|
||||
prog,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -129,8 +131,10 @@ impl GlRenderContext {
|
|||
tex_frac_src.push_str("#define ALPHA\n");
|
||||
}
|
||||
tex_frac_src.push_str(tex_frag);
|
||||
let prog = GlProgram::from_shaders(ctx, tex_vert, &tex_frac_src)?;
|
||||
Ok::<_, RenderError>(TexProg::from(prog, alpha_multiplier))
|
||||
unsafe {
|
||||
let prog = GlProgram::from_shaders(ctx, tex_vert, &tex_frac_src)?;
|
||||
Ok::<_, RenderError>(TexProg::from(prog, alpha_multiplier))
|
||||
}
|
||||
};
|
||||
Ok::<_, RenderError>(enum_map! {
|
||||
TexCopyType::Identity => enum_map! {
|
||||
|
|
@ -149,11 +153,13 @@ impl GlRenderContext {
|
|||
} else {
|
||||
None
|
||||
};
|
||||
let fill_prog = GlProgram::from_shaders(
|
||||
ctx,
|
||||
include_str!("../shaders/fill.vert.glsl"),
|
||||
include_str!("../shaders/fill.frag.glsl"),
|
||||
)?;
|
||||
let fill_prog = unsafe {
|
||||
GlProgram::from_shaders(
|
||||
ctx,
|
||||
include_str!("../shaders/fill.vert.glsl"),
|
||||
include_str!("../shaders/fill.frag.glsl"),
|
||||
)?
|
||||
};
|
||||
Ok(Self {
|
||||
ctx: ctx.clone(),
|
||||
gbm: ctx.dpy.gbm.clone(),
|
||||
|
|
@ -164,8 +170,8 @@ impl GlRenderContext {
|
|||
tex_internal,
|
||||
tex_external,
|
||||
|
||||
fill_prog_pos: fill_prog.get_attrib_location(c"pos"),
|
||||
fill_prog_color: fill_prog.get_uniform_location(c"color"),
|
||||
fill_prog_pos: unsafe { fill_prog.get_attrib_location(c"pos") },
|
||||
fill_prog_color: unsafe { fill_prog.get_uniform_location(c"color") },
|
||||
fill_prog,
|
||||
|
||||
gl_state: Default::default(),
|
||||
|
|
|
|||
|
|
@ -67,7 +67,9 @@ impl VulkanAllocation {
|
|||
) {
|
||||
allocator.total.fetch_sub(self.size);
|
||||
let block = self.block.take().unwrap();
|
||||
do_free(gpu, &device.device, block, self.mem);
|
||||
unsafe {
|
||||
do_free(gpu, &device.device, block, self.mem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -363,12 +365,14 @@ unsafe fn do_free(
|
|||
mut block: MemoryBlock<DeviceMemory>,
|
||||
ptr: Option<*mut u8>,
|
||||
) {
|
||||
let device = AshMemoryDevice::wrap(device);
|
||||
if let Some(_ptr) = ptr {
|
||||
// log::info!("free = {:?} - {:?} ({})", ptr, ptr.add(block.size() as usize), block.size());
|
||||
block.unmap(device);
|
||||
unsafe {
|
||||
let device = AshMemoryDevice::wrap(device);
|
||||
if let Some(_ptr) = ptr {
|
||||
// log::info!("free = {:?} - {:?} ({})", ptr, ptr.add(block.size() as usize), block.size());
|
||||
block.unmap(device);
|
||||
}
|
||||
gpu.dealloc(device, block);
|
||||
}
|
||||
gpu.dealloc(device, block);
|
||||
}
|
||||
|
||||
impl Drop for UnsyncAllocatorStorage {
|
||||
|
|
|
|||
|
|
@ -671,7 +671,7 @@ impl Drop for VulkanBoMapping {
|
|||
|
||||
impl MappedBuffer for VulkanBoMapping {
|
||||
unsafe fn data(&self) -> &[u8] {
|
||||
&*self.data
|
||||
unsafe { &*self.data }
|
||||
}
|
||||
|
||||
fn data_ptr(&self) -> *mut u8 {
|
||||
|
|
|
|||
|
|
@ -190,12 +190,12 @@ unsafe extern "system" fn debug_callback(
|
|||
DebugUtilsMessageSeverityFlagsEXT::VERBOSE => Level::Trace,
|
||||
_ => Level::Warn,
|
||||
};
|
||||
let data = &*p_callback_data;
|
||||
let message = Ustr::from_ptr(data.p_message);
|
||||
let data = unsafe { &*p_callback_data };
|
||||
let message = unsafe { Ustr::from_ptr(data.p_message) };
|
||||
let message_id_name = if data.p_message_id_name.is_null() {
|
||||
ustr!("<null>")
|
||||
} else {
|
||||
Ustr::from_ptr(data.p_message_id_name)
|
||||
unsafe { Ustr::from_ptr(data.p_message_id_name) }
|
||||
};
|
||||
log::log!(
|
||||
Level::Info,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue