Skip to content

Commit e91165e

Browse files
committed
backends: Use CStr literals everywhere possible
This addition to the 2021 edition makes it possible to generate a &CStr at compile-time, with no need for unwrap()/expect() or unsafe, making it much more ergonomic to pass to C APIs.
1 parent e3b6eb1 commit e91165e

File tree

4 files changed

+43
-64
lines changed

4 files changed

+43
-64
lines changed

examples/buffer_test.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{ffi::CStr, fmt, fs::File, os::unix::io::OwnedFd, path::PathBuf};
1+
use std::{fmt, fs::File, os::unix::io::OwnedFd, path::PathBuf};
22

33
use clap::{Args, Parser, Subcommand, ValueEnum};
44
use smithay::{
@@ -189,11 +189,7 @@ fn buffer_test(args: TestArgs) {
189189
Instance::new(Version::VERSION_1_2, None).expect("Unable to create vulkan instance");
190190
let physical_device = PhysicalDevice::enumerate(&instance)
191191
.expect("Failed to enumerate physical devices")
192-
.filter(|phd| {
193-
phd.has_device_extension(unsafe {
194-
CStr::from_bytes_with_nul_unchecked(b"VK_EXT_physical_device_drm\0")
195-
})
196-
})
192+
.filter(|phd| phd.has_device_extension(c"VK_EXT_physical_device_drm"))
197193
.find(|phd| {
198194
phd.primary_node().unwrap() == Some(node) || phd.render_node().unwrap() == Some(node)
199195
})

src/backend/renderer/gles/mod.rs

+16-23
Original file line numberDiff line numberDiff line change
@@ -1848,36 +1848,28 @@ impl GlesRenderer {
18481848
let debug_shader = format!("#version 100\n#define {}\n{}", shaders::DEBUG_FLAGS, src.as_ref());
18491849
let debug_program = unsafe { link_program(&self.gl, shaders::VERTEX_SHADER, &debug_shader)? };
18501850

1851-
let vert = CStr::from_bytes_with_nul(b"vert\0").expect("NULL terminated");
1852-
let vert_position = CStr::from_bytes_with_nul(b"vert_position\0").expect("NULL terminated");
1853-
let matrix = CStr::from_bytes_with_nul(b"matrix\0").expect("NULL terminated");
1854-
let tex_matrix = CStr::from_bytes_with_nul(b"tex_matrix\0").expect("NULL terminated");
1855-
let size = CStr::from_bytes_with_nul(b"size\0").expect("NULL terminated");
1856-
let alpha = CStr::from_bytes_with_nul(b"alpha\0").expect("NULL terminated");
1857-
let tint = CStr::from_bytes_with_nul(b"tint\0").expect("NULL terminated");
1858-
18591851
unsafe {
18601852
Ok(GlesPixelProgram(Rc::new(GlesPixelProgramInner {
18611853
normal: GlesPixelProgramInternal {
18621854
program,
18631855
uniform_matrix: self
18641856
.gl
1865-
.GetUniformLocation(program, matrix.as_ptr() as *const ffi::types::GLchar),
1857+
.GetUniformLocation(program, c"matrix".as_ptr() as *const ffi::types::GLchar),
18661858
uniform_tex_matrix: self
18671859
.gl
1868-
.GetUniformLocation(program, tex_matrix.as_ptr() as *const ffi::types::GLchar),
1860+
.GetUniformLocation(program, c"tex_matrix".as_ptr() as *const ffi::types::GLchar),
18691861
uniform_alpha: self
18701862
.gl
1871-
.GetUniformLocation(program, alpha.as_ptr() as *const ffi::types::GLchar),
1863+
.GetUniformLocation(program, c"alpha".as_ptr() as *const ffi::types::GLchar),
18721864
uniform_size: self
18731865
.gl
1874-
.GetUniformLocation(program, size.as_ptr() as *const ffi::types::GLchar),
1866+
.GetUniformLocation(program, c"size".as_ptr() as *const ffi::types::GLchar),
18751867
attrib_vert: self
18761868
.gl
1877-
.GetAttribLocation(program, vert.as_ptr() as *const ffi::types::GLchar),
1869+
.GetAttribLocation(program, c"vert".as_ptr() as *const ffi::types::GLchar),
18781870
attrib_position: self
18791871
.gl
1880-
.GetAttribLocation(program, vert_position.as_ptr() as *const ffi::types::GLchar),
1872+
.GetAttribLocation(program, c"vert_position".as_ptr() as *const ffi::types::GLchar),
18811873
additional_uniforms: additional_uniforms
18821874
.iter()
18831875
.map(|uniform| {
@@ -1899,22 +1891,23 @@ impl GlesRenderer {
18991891
program: debug_program,
19001892
uniform_matrix: self
19011893
.gl
1902-
.GetUniformLocation(debug_program, matrix.as_ptr() as *const ffi::types::GLchar),
1903-
uniform_tex_matrix: self
1904-
.gl
1905-
.GetUniformLocation(debug_program, tex_matrix.as_ptr() as *const ffi::types::GLchar),
1894+
.GetUniformLocation(debug_program, c"matrix".as_ptr() as *const ffi::types::GLchar),
1895+
uniform_tex_matrix: self.gl.GetUniformLocation(
1896+
debug_program,
1897+
c"tex_matrix".as_ptr() as *const ffi::types::GLchar,
1898+
),
19061899
uniform_alpha: self
19071900
.gl
1908-
.GetUniformLocation(debug_program, alpha.as_ptr() as *const ffi::types::GLchar),
1901+
.GetUniformLocation(debug_program, c"alpha".as_ptr() as *const ffi::types::GLchar),
19091902
uniform_size: self
19101903
.gl
1911-
.GetUniformLocation(debug_program, size.as_ptr() as *const ffi::types::GLchar),
1904+
.GetUniformLocation(debug_program, c"size".as_ptr() as *const ffi::types::GLchar),
19121905
attrib_vert: self
19131906
.gl
1914-
.GetAttribLocation(debug_program, vert.as_ptr() as *const ffi::types::GLchar),
1907+
.GetAttribLocation(debug_program, c"vert".as_ptr() as *const ffi::types::GLchar),
19151908
attrib_position: self.gl.GetAttribLocation(
19161909
debug_program,
1917-
vert_position.as_ptr() as *const ffi::types::GLchar,
1910+
c"vert_position".as_ptr() as *const ffi::types::GLchar,
19181911
),
19191912
additional_uniforms: additional_uniforms
19201913
.iter()
@@ -1937,7 +1930,7 @@ impl GlesRenderer {
19371930
destruction_callback_sender: self.destruction_callback_sender.clone(),
19381931
uniform_tint: self
19391932
.gl
1940-
.GetUniformLocation(debug_program, tint.as_ptr() as *const ffi::types::GLchar),
1933+
.GetUniformLocation(debug_program, c"tint".as_ptr() as *const ffi::types::GLchar),
19411934
})))
19421935
}
19431936
}

src/backend/renderer/gles/shaders/mod.rs

+23-31
Original file line numberDiff line numberDiff line change
@@ -142,25 +142,18 @@ pub(super) unsafe fn texture_program(
142142
let program = unsafe { link_program(gl, shaders::VERTEX_SHADER, &shader)? };
143143
let debug_program = unsafe { link_program(gl, shaders::VERTEX_SHADER, debug_shader.as_ref())? };
144144

145-
let vert = CStr::from_bytes_with_nul(b"vert\0").expect("NULL terminated");
146-
let vert_position = CStr::from_bytes_with_nul(b"vert_position\0").expect("NULL terminated");
147-
let tex = CStr::from_bytes_with_nul(b"tex\0").expect("NULL terminated");
148-
let matrix = CStr::from_bytes_with_nul(b"matrix\0").expect("NULL terminated");
149-
let tex_matrix = CStr::from_bytes_with_nul(b"tex_matrix\0").expect("NULL terminated");
150-
let alpha = CStr::from_bytes_with_nul(b"alpha\0").expect("NULL terminated");
151-
let tint = CStr::from_bytes_with_nul(b"tint\0").expect("NULL terminated");
152-
153145
Ok(GlesTexProgramVariant {
154146
normal: GlesTexProgramInternal {
155147
program,
156-
uniform_tex: gl.GetUniformLocation(program, tex.as_ptr() as *const ffi::types::GLchar),
157-
uniform_matrix: gl.GetUniformLocation(program, matrix.as_ptr() as *const ffi::types::GLchar),
148+
uniform_tex: gl.GetUniformLocation(program, c"tex".as_ptr() as *const ffi::types::GLchar),
149+
uniform_matrix: gl
150+
.GetUniformLocation(program, c"matrix".as_ptr() as *const ffi::types::GLchar),
158151
uniform_tex_matrix: gl
159-
.GetUniformLocation(program, tex_matrix.as_ptr() as *const ffi::types::GLchar),
160-
uniform_alpha: gl.GetUniformLocation(program, alpha.as_ptr() as *const ffi::types::GLchar),
161-
attrib_vert: gl.GetAttribLocation(program, vert.as_ptr() as *const ffi::types::GLchar),
152+
.GetUniformLocation(program, c"tex_matrix".as_ptr() as *const ffi::types::GLchar),
153+
uniform_alpha: gl.GetUniformLocation(program, c"alpha".as_ptr() as *const ffi::types::GLchar),
154+
attrib_vert: gl.GetAttribLocation(program, c"vert".as_ptr() as *const ffi::types::GLchar),
162155
attrib_vert_position: gl
163-
.GetAttribLocation(program, vert_position.as_ptr() as *const ffi::types::GLchar),
156+
.GetAttribLocation(program, c"vert_position".as_ptr() as *const ffi::types::GLchar),
164157
additional_uniforms: additional_uniforms
165158
.iter()
166159
.map(|uniform| {
@@ -179,16 +172,20 @@ pub(super) unsafe fn texture_program(
179172
},
180173
debug: GlesTexProgramInternal {
181174
program: debug_program,
182-
uniform_tex: gl.GetUniformLocation(debug_program, tex.as_ptr() as *const ffi::types::GLchar),
175+
uniform_tex: gl
176+
.GetUniformLocation(debug_program, c"tex".as_ptr() as *const ffi::types::GLchar),
183177
uniform_matrix: gl
184-
.GetUniformLocation(debug_program, matrix.as_ptr() as *const ffi::types::GLchar),
178+
.GetUniformLocation(debug_program, c"matrix".as_ptr() as *const ffi::types::GLchar),
185179
uniform_tex_matrix: gl
186-
.GetUniformLocation(debug_program, tex_matrix.as_ptr() as *const ffi::types::GLchar),
180+
.GetUniformLocation(debug_program, c"tex_matrix".as_ptr() as *const ffi::types::GLchar),
187181
uniform_alpha: gl
188-
.GetUniformLocation(debug_program, alpha.as_ptr() as *const ffi::types::GLchar),
189-
attrib_vert: gl.GetAttribLocation(debug_program, vert.as_ptr() as *const ffi::types::GLchar),
190-
attrib_vert_position: gl
191-
.GetAttribLocation(debug_program, vert_position.as_ptr() as *const ffi::types::GLchar),
182+
.GetUniformLocation(debug_program, c"alpha".as_ptr() as *const ffi::types::GLchar),
183+
attrib_vert: gl
184+
.GetAttribLocation(debug_program, c"vert".as_ptr() as *const ffi::types::GLchar),
185+
attrib_vert_position: gl.GetAttribLocation(
186+
debug_program,
187+
c"vert_position".as_ptr() as *const ffi::types::GLchar,
188+
),
192189
additional_uniforms: additional_uniforms
193190
.iter()
194191
.map(|uniform| {
@@ -206,7 +203,7 @@ pub(super) unsafe fn texture_program(
206203
.collect(),
207204
},
208205
// debug flags
209-
uniform_tint: gl.GetUniformLocation(debug_program, tint.as_ptr() as *const ffi::types::GLchar),
206+
uniform_tint: gl.GetUniformLocation(debug_program, c"tint".as_ptr() as *const ffi::types::GLchar),
210207
})
211208
};
212209

@@ -223,16 +220,11 @@ pub(super) unsafe fn texture_program(
223220
pub(super) unsafe fn solid_program(gl: &ffi::Gles2) -> Result<GlesSolidProgram, GlesError> {
224221
let program = link_program(gl, shaders::VERTEX_SHADER_SOLID, shaders::FRAGMENT_SHADER_SOLID)?;
225222

226-
let matrix = CStr::from_bytes_with_nul(b"matrix\0").expect("NULL terminated");
227-
let color = CStr::from_bytes_with_nul(b"color\0").expect("NULL terminated");
228-
let vert = CStr::from_bytes_with_nul(b"vert\0").expect("NULL terminated");
229-
let position = CStr::from_bytes_with_nul(b"position\0").expect("NULL terminated");
230-
231223
Ok(GlesSolidProgram {
232224
program,
233-
uniform_matrix: gl.GetUniformLocation(program, matrix.as_ptr() as *const ffi::types::GLchar),
234-
uniform_color: gl.GetUniformLocation(program, color.as_ptr() as *const ffi::types::GLchar),
235-
attrib_vert: gl.GetAttribLocation(program, vert.as_ptr() as *const ffi::types::GLchar),
236-
attrib_position: gl.GetAttribLocation(program, position.as_ptr() as *const ffi::types::GLchar),
225+
uniform_matrix: gl.GetUniformLocation(program, c"matrix".as_ptr() as *const ffi::types::GLchar),
226+
uniform_color: gl.GetUniformLocation(program, c"color".as_ptr() as *const ffi::types::GLchar),
227+
attrib_vert: gl.GetAttribLocation(program, c"vert".as_ptr() as *const ffi::types::GLchar),
228+
attrib_position: gl.GetAttribLocation(program, c"position".as_ptr() as *const ffi::types::GLchar),
237229
})
238230
}

src/backend/vulkan/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,7 @@ impl Instance {
219219

220220
// Enable debug layers if present and debug assertions are enabled.
221221
if cfg!(debug_assertions) {
222-
const VALIDATION: &CStr =
223-
unsafe { CStr::from_bytes_with_nul_unchecked(b"VK_LAYER_KHRONOS_validation\0") };
222+
const VALIDATION: &CStr = c"VK_LAYER_KHRONOS_validation";
224223

225224
if available_layers
226225
.iter()
@@ -256,8 +255,7 @@ impl Instance {
256255
app_info.map(|info| CString::new(info.name).expect("app name contains null terminator"));
257256
let mut app_info = vk::ApplicationInfo::default()
258257
.api_version(api_version.to_raw())
259-
// SAFETY: null terminated with no interior null bytes.
260-
.engine_name(unsafe { CStr::from_bytes_with_nul_unchecked(b"Smithay\0") })
258+
.engine_name(c"Smithay")
261259
.engine_version(Version::SMITHAY.to_raw());
262260

263261
if let Some(app_version) = app_version {

0 commit comments

Comments
 (0)