Skip to content

Commit c447e40

Browse files
committed
rt: redesign parameters to be thread-safe across FFI using arcswap and atomicusize
This should allow C FFI consumers to modify frame parameters from a different thread without it being UB.
1 parent ae76bf9 commit c447e40

File tree

26 files changed

+216
-310
lines changed

26 files changed

+216
-310
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

librashader-capi/src/runtime/d3d11/filter_chain.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,14 @@ extern_fn! {
260260
chain: *mut libra_d3d11_filter_chain_t,
261261
param_name: *const c_char,
262262
value: f32
263-
) mut |chain| {
264-
assert_some_ptr!(mut chain);
263+
) |chain| {
264+
assert_some_ptr!(chain);
265265
assert_non_null!(param_name);
266266
unsafe {
267267
let name = CStr::from_ptr(param_name);
268268
let name = name.to_str()?;
269269

270-
if chain.set_parameter(name, value).is_none() {
270+
if chain.parameters().set_parameter(name, value).is_none() {
271271
return LibrashaderError::UnknownShaderParameter(param_name).export()
272272
}
273273
}
@@ -282,17 +282,17 @@ extern_fn! {
282282
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_d3d11_filter_chain_t`.
283283
/// - `param_name` must be either null or a null terminated string.
284284
fn libra_d3d11_filter_chain_get_param(
285-
chain: *mut libra_d3d11_filter_chain_t,
285+
chain: *const libra_d3d11_filter_chain_t,
286286
param_name: *const c_char,
287287
out: *mut MaybeUninit<f32>
288-
) mut |chain| {
289-
assert_some_ptr!(mut chain);
288+
) |chain| {
289+
assert_some_ptr!(chain);
290290
assert_non_null!(param_name);
291291
unsafe {
292292
let name = CStr::from_ptr(param_name);
293293
let name = name.to_str()?;
294294

295-
let Some(value) = chain.get_parameter(name) else {
295+
let Some(value) = chain.parameters().get_parameter(name) else {
296296
return LibrashaderError::UnknownShaderParameter(param_name).export()
297297
};
298298

@@ -309,9 +309,9 @@ extern_fn! {
309309
fn libra_d3d11_filter_chain_set_active_pass_count(
310310
chain: *mut libra_d3d11_filter_chain_t,
311311
value: u32
312-
) mut |chain| {
313-
assert_some_ptr!(mut chain);
314-
chain.set_enabled_pass_count(value as usize);
312+
) |chain| {
313+
assert_some_ptr!(chain);
314+
chain.parameters().set_passes_enabled(value as usize);
315315
}
316316
}
317317

@@ -321,12 +321,12 @@ extern_fn! {
321321
/// ## Safety
322322
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_d3d11_filter_chain_t`.
323323
fn libra_d3d11_filter_chain_get_active_pass_count(
324-
chain: *mut libra_d3d11_filter_chain_t,
324+
chain: *const libra_d3d11_filter_chain_t,
325325
out: *mut MaybeUninit<u32>
326-
) mut |chain| {
327-
assert_some_ptr!(mut chain);
326+
) |chain| {
327+
assert_some_ptr!(chain);
328328
unsafe {
329-
let value = chain.get_enabled_pass_count();
329+
let value = chain.parameters().passes_enabled();
330330
out.write(MaybeUninit::new(value as u32))
331331
}
332332
}

librashader-capi/src/runtime/d3d12/filter_chain.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -280,14 +280,14 @@ extern_fn! {
280280
chain: *mut libra_d3d12_filter_chain_t,
281281
param_name: *const c_char,
282282
value: f32
283-
) mut |chain| {
284-
assert_some_ptr!(mut chain);
283+
) |chain| {
284+
assert_some_ptr!(chain);
285285
assert_non_null!(param_name);
286286
unsafe {
287287
let name = CStr::from_ptr(param_name);
288288
let name = name.to_str()?;
289289

290-
if chain.set_parameter(name, value).is_none() {
290+
if chain.parameters().set_parameter(name, value).is_none() {
291291
return LibrashaderError::UnknownShaderParameter(param_name).export()
292292
}
293293
}
@@ -302,17 +302,17 @@ extern_fn! {
302302
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_d3d12_filter_chain_t`.
303303
/// - `param_name` must be either null or a null terminated string.
304304
fn libra_d3d12_filter_chain_get_param(
305-
chain: *mut libra_d3d12_filter_chain_t,
305+
chain: *const libra_d3d12_filter_chain_t,
306306
param_name: *const c_char,
307307
out: *mut MaybeUninit<f32>
308-
) mut |chain| {
309-
assert_some_ptr!(mut chain);
308+
) |chain| {
309+
assert_some_ptr!(chain);
310310
assert_non_null!(param_name);
311311
unsafe {
312312
let name = CStr::from_ptr(param_name);
313313
let name = name.to_str()?;
314314

315-
let Some(value) = chain.get_parameter(name) else {
315+
let Some(value) = chain.parameters().get_parameter(name) else {
316316
return LibrashaderError::UnknownShaderParameter(param_name).export()
317317
};
318318

@@ -329,9 +329,9 @@ extern_fn! {
329329
fn libra_d3d12_filter_chain_set_active_pass_count(
330330
chain: *mut libra_d3d12_filter_chain_t,
331331
value: u32
332-
) mut |chain| {
333-
assert_some_ptr!(mut chain);
334-
chain.set_enabled_pass_count(value as usize);
332+
) |chain| {
333+
assert_some_ptr!(chain);
334+
chain.parameters().set_passes_enabled(value as usize);
335335
}
336336
}
337337

@@ -341,12 +341,12 @@ extern_fn! {
341341
/// ## Safety
342342
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_d3d12_filter_chain_t`.
343343
fn libra_d3d12_filter_chain_get_active_pass_count(
344-
chain: *mut libra_d3d12_filter_chain_t,
344+
chain: *const libra_d3d12_filter_chain_t,
345345
out: *mut MaybeUninit<u32>
346-
) mut |chain| {
347-
assert_some_ptr!(mut chain);
346+
) |chain| {
347+
assert_some_ptr!(chain);
348348
unsafe {
349-
let value = chain.get_enabled_pass_count();
349+
let value = chain.parameters().passes_enabled();
350350
out.write(MaybeUninit::new(value as u32))
351351
}
352352
}

librashader-capi/src/runtime/d3d9/filter_chain.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,14 @@ extern_fn! {
170170
chain: *mut libra_d3d9_filter_chain_t,
171171
param_name: *const c_char,
172172
value: f32
173-
) mut |chain| {
174-
assert_some_ptr!(mut chain);
173+
) |chain| {
174+
assert_some_ptr!(chain);
175175
assert_non_null!(param_name);
176176
unsafe {
177177
let name = CStr::from_ptr(param_name);
178178
let name = name.to_str()?;
179179

180-
if chain.set_parameter(name, value).is_none() {
180+
if chain.parameters().set_parameter(name, value).is_none() {
181181
return LibrashaderError::UnknownShaderParameter(param_name).export()
182182
}
183183
}
@@ -192,17 +192,17 @@ extern_fn! {
192192
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_d3d9_filter_chain_t`.
193193
/// - `param_name` must be either null or a null terminated string.
194194
fn libra_d3d9_filter_chain_get_param(
195-
chain: *mut libra_d3d9_filter_chain_t,
195+
chain: *const libra_d3d9_filter_chain_t,
196196
param_name: *const c_char,
197197
out: *mut MaybeUninit<f32>
198-
) mut |chain| {
199-
assert_some_ptr!(mut chain);
198+
) |chain| {
199+
assert_some_ptr!(chain);
200200
assert_non_null!(param_name);
201201
unsafe {
202202
let name = CStr::from_ptr(param_name);
203203
let name = name.to_str()?;
204204

205-
let Some(value) = chain.get_parameter(name) else {
205+
let Some(value) = chain.parameters().get_parameter(name) else {
206206
return LibrashaderError::UnknownShaderParameter(param_name).export()
207207
};
208208

@@ -219,9 +219,9 @@ extern_fn! {
219219
fn libra_d3d9_filter_chain_set_active_pass_count(
220220
chain: *mut libra_d3d9_filter_chain_t,
221221
value: u32
222-
) mut |chain| {
223-
assert_some_ptr!(mut chain);
224-
chain.set_enabled_pass_count(value as usize);
222+
) |chain| {
223+
assert_some_ptr!(chain);
224+
chain.parameters().set_passes_enabled(value as usize);
225225
}
226226
}
227227

@@ -231,12 +231,12 @@ extern_fn! {
231231
/// ## Safety
232232
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_d3d9_filter_chain_t`.
233233
fn libra_d3d9_filter_chain_get_active_pass_count(
234-
chain: *mut libra_d3d9_filter_chain_t,
234+
chain: *const libra_d3d9_filter_chain_t,
235235
out: *mut MaybeUninit<u32>
236-
) mut |chain| {
237-
assert_some_ptr!(mut chain);
236+
) |chain| {
237+
assert_some_ptr!(chain);
238238
unsafe {
239-
let value = chain.get_enabled_pass_count();
239+
let value = chain.parameters().passes_enabled();
240240
out.write(MaybeUninit::new(value as u32))
241241
}
242242
}

librashader-capi/src/runtime/gl/filter_chain.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,14 @@ extern_fn! {
227227
chain: *mut libra_gl_filter_chain_t,
228228
param_name: *const c_char,
229229
value: f32
230-
) mut |chain| {
231-
assert_some_ptr!(mut chain);
230+
) |chain| {
231+
assert_some_ptr!(chain);
232232
assert_non_null!(param_name);
233233
unsafe {
234234
let name = CStr::from_ptr(param_name);
235235
let name = name.to_str()?;
236236

237-
if chain.set_parameter(name, value).is_none() {
237+
if chain.parameters().set_parameter(name, value).is_none() {
238238
return LibrashaderError::UnknownShaderParameter(param_name).export()
239239
}
240240
}
@@ -249,17 +249,17 @@ extern_fn! {
249249
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_gl_filter_chain_t`.
250250
/// - `param_name` must be either null or a null terminated string.
251251
fn libra_gl_filter_chain_get_param(
252-
chain: *mut libra_gl_filter_chain_t,
252+
chain: *const libra_gl_filter_chain_t,
253253
param_name: *const c_char,
254254
out: *mut MaybeUninit<f32>
255-
) mut |chain| {
256-
assert_some_ptr!(mut chain);
255+
) |chain| {
256+
assert_some_ptr!(chain);
257257
assert_non_null!(param_name);
258258
unsafe {
259259
let name = CStr::from_ptr(param_name);
260260
let name = name.to_str()?;
261261

262-
let Some(value) = chain.get_parameter(name) else {
262+
let Some(value) = chain.parameters().get_parameter(name) else {
263263
return LibrashaderError::UnknownShaderParameter(param_name).export()
264264
};
265265

@@ -276,9 +276,9 @@ extern_fn! {
276276
fn libra_gl_filter_chain_set_active_pass_count(
277277
chain: *mut libra_gl_filter_chain_t,
278278
value: u32
279-
) mut |chain| {
280-
assert_some_ptr!(mut chain);
281-
chain.set_enabled_pass_count(value as usize);
279+
) |chain| {
280+
assert_some_ptr!(chain);
281+
chain.parameters().set_passes_enabled(value as usize);
282282
}
283283
}
284284

@@ -292,7 +292,7 @@ extern_fn! {
292292
out: *mut MaybeUninit<u32>
293293
) mut |chain| {
294294
assert_some_ptr!(mut chain);
295-
let value = chain.get_enabled_pass_count();
295+
let value = chain.parameters().passes_enabled();
296296
unsafe {
297297
out.write(MaybeUninit::new(value as u32))
298298
}

librashader-capi/src/runtime/mtl/filter_chain.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -229,13 +229,13 @@ extern_fn! {
229229
chain: *mut libra_mtl_filter_chain_t,
230230
param_name: *const c_char,
231231
value: f32
232-
) mut |chain| {
233-
assert_some_ptr!(mut chain);
232+
) |chain| {
233+
assert_some_ptr!(chain);
234234
unsafe {
235235
let name = CStr::from_ptr(param_name);
236236
let name = name.to_str()?;
237237

238-
if chain.set_parameter(name, value).is_none() {
238+
if chain.parameters().set_parameter(name, value).is_none() {
239239
return LibrashaderError::UnknownShaderParameter(param_name).export()
240240
}
241241
}
@@ -250,17 +250,17 @@ extern_fn! {
250250
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_mtl_filter_chain_t`.
251251
/// - `param_name` must be either null or a null terminated string.
252252
fn libra_mtl_filter_chain_get_param(
253-
chain: *mut libra_mtl_filter_chain_t,
253+
chain: *const libra_mtl_filter_chain_t,
254254
param_name: *const c_char,
255255
out: *mut MaybeUninit<f32>
256-
) mut |chain| {
257-
assert_some_ptr!(mut chain);
256+
) |chain| {
257+
assert_some_ptr!(chain);
258258

259259
unsafe {
260260
let name = CStr::from_ptr(param_name);
261261
let name = name.to_str()?;
262262

263-
let Some(value) = chain.get_parameter(name) else {
263+
let Some(value) = chain.parameters().get_parameter(name) else {
264264
return LibrashaderError::UnknownShaderParameter(param_name).export()
265265
};
266266

@@ -277,9 +277,9 @@ extern_fn! {
277277
fn libra_mtl_filter_chain_set_active_pass_count(
278278
chain: *mut libra_mtl_filter_chain_t,
279279
value: u32
280-
) mut |chain| {
281-
assert_some_ptr!(mut chain);
282-
chain.set_enabled_pass_count(value as usize);
280+
) |chain| {
281+
assert_some_ptr!(chain);
282+
chain.parameters().set_passes_enabled(value as usize);
283283
}
284284
}
285285

@@ -289,11 +289,11 @@ extern_fn! {
289289
/// ## Safety
290290
/// - `chain` must be either null or a valid and aligned pointer to an initialized `libra_mtl_filter_chain_t`.
291291
fn libra_mtl_filter_chain_get_active_pass_count(
292-
chain: *mut libra_mtl_filter_chain_t,
292+
chain: *const libra_mtl_filter_chain_t,
293293
out: *mut MaybeUninit<u32>
294-
) mut |chain| {
295-
assert_some_ptr!(mut chain);
296-
let value = chain.get_enabled_pass_count();
294+
) |chain| {
295+
assert_some_ptr!(chain);
296+
let value = chain.parameters().passes_enabled();
297297
unsafe {
298298
out.write(MaybeUninit::new(value as u32))
299299
}

0 commit comments

Comments
 (0)