Skip to content

Commit

Permalink
Replace Rav1dFrameContext_task_thread atomics
Browse files Browse the repository at this point in the history
  • Loading branch information
rinon committed Jan 12, 2024
1 parent ef6b864 commit 220a1ba
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 182 deletions.
20 changes: 8 additions & 12 deletions src/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4852,7 +4852,7 @@ unsafe fn rav1d_decode_frame_main(f: &mut Rav1dFrameContext) -> Rav1dResult {
pub(crate) unsafe fn rav1d_decode_frame_exit(f: &mut Rav1dFrameContext, retval: Rav1dResult) {
let c = &*f.c;
if !f.sr_cur.p.data[0].is_null() {
f.task_thread.error = 0;
f.task_thread.error = AtomicI32::new(0);
}
if c.n_fc > 1 && retval.is_err() && !f.frame_thread.cf.is_null() {
slice::from_raw_parts_mut(
Expand Down Expand Up @@ -4910,7 +4910,7 @@ pub(crate) unsafe fn rav1d_decode_frame(f: &mut Rav1dFrameContext) -> Rav1dResul
pthread_mutex_lock(&mut (*f.task_thread.ttd).lock);
pthread_cond_signal(&mut (*f.task_thread.ttd).cond);
if res.is_ok() {
while f.task_thread.done[0] == 0
while f.task_thread.done[0].load(Ordering::Relaxed) == 0
// TODO(kkysen) Make `.task_counter` an `AtomicI32`, but that requires recursively removing `impl Copy`s.
|| (*(addr_of_mut!(f.task_thread.task_counter) as *mut AtomicI32))
.load(Ordering::SeqCst)
Expand Down Expand Up @@ -4958,10 +4958,7 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult {
pthread_cond_wait(&mut f.task_thread.cond, &mut c.task_thread.lock);
}
let out_delayed = &mut *c.frame_thread.out_delayed.offset(next as isize);
if !out_delayed.p.data[0].is_null()
|| ::core::intrinsics::atomic_load_seqcst(&mut f.task_thread.error as *mut atomic_int)
!= 0
{
if !out_delayed.p.data[0].is_null() || f.task_thread.error.load(Ordering::SeqCst) != 0 {
let first = ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first);
if first + 1 < c.n_fc {
::core::intrinsics::atomic_xadd_seqcst(&mut c.task_thread.first, 1);
Expand Down Expand Up @@ -5008,7 +5005,7 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult {
c: &mut Rav1dContext,
out_delayed: *mut Rav1dThreadPicture,
) {
f.task_thread.error = 1;
f.task_thread.error = AtomicI32::new(1);
rav1d_cdf_thread_unref(&mut f.in_cdf);
if f.frame_hdr.as_ref().unwrap().refresh_context != 0 {
rav1d_cdf_thread_unref(&mut f.out_cdf);
Expand Down Expand Up @@ -5210,14 +5207,13 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult {
f.sbh = f.bh + f.sb_step - 1 >> f.sb_shift;
f.b4_stride = (f.bw + 31 & !31) as ptrdiff_t;
f.bitdepth_max = (1 << f.cur.p.bpc) - 1;
*&mut f.task_thread.error = 0;
f.task_thread.error = AtomicI32::new(0);
let uses_2pass = (c.n_fc > 1) as c_int;
let cols = frame_hdr.tiling.cols;
let rows = frame_hdr.tiling.rows;
::core::intrinsics::atomic_store_seqcst(
&mut f.task_thread.task_counter,
cols * rows + f.sbh << uses_2pass,
);
f.task_thread
.task_counter
.store(cols * rows + f.sbh << uses_2pass, Ordering::SeqCst);

// ref_mvs
if frame_hdr.frame_type.is_inter_or_switch() || frame_hdr.allow_intrabc != 0 {
Expand Down
8 changes: 4 additions & 4 deletions src/internal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -428,12 +428,12 @@ pub(crate) struct Rav1dFrameContext_task_thread {
pub init_task: Rav1dTask,
pub num_tasks: c_int,
pub num_tile_tasks: c_int,
pub init_done: atomic_int,
pub done: [atomic_int; 2],
pub init_done: AtomicI32,
pub done: [AtomicI32; 2],
pub retval: Rav1dResult,
pub update_set: bool, // whether we need to update CDF reference
pub error: atomic_int,
pub task_counter: atomic_int,
pub error: AtomicI32,
pub task_counter: AtomicI32,
pub task_head: *mut Rav1dTask,
pub task_tail: *mut Rav1dTask,
// Points to the task directly before the cur pointer in the queue.
Expand Down
5 changes: 1 addition & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ use crate::include::dav1d::headers::Rav1dFilmGrainData;
use crate::include::dav1d::headers::Rav1dSequenceHeader;
use crate::include::dav1d::picture::Dav1dPicture;
use crate::include::dav1d::picture::Rav1dPicture;
use crate::include::stdatomic::atomic_int;
use crate::src::align::Align64;
use crate::src::cdf::rav1d_cdf_thread_unref;
use crate::src::cpu::rav1d_init_cpu;
Expand Down Expand Up @@ -616,9 +615,7 @@ unsafe fn drain_picture(c: &mut Rav1dContext, out: &mut Rav1dPicture) -> Rav1dRe
let out_delayed: *mut Rav1dThreadPicture =
&mut *(c.frame_thread.out_delayed).offset(next as isize) as *mut Rav1dThreadPicture;
if !((*out_delayed).p.data[0]).is_null()
|| ::core::intrinsics::atomic_load_seqcst(
&mut (*f).task_thread.error as *mut atomic_int,
) != 0
|| (*f).task_thread.error.load(Ordering::SeqCst) != 0
{
let mut first: c_uint =
::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first);
Expand Down
5 changes: 1 addition & 4 deletions src/obu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ use crate::include::dav1d::headers::RAV1D_WM_TYPE_AFFINE;
use crate::include::dav1d::headers::RAV1D_WM_TYPE_IDENTITY;
use crate::include::dav1d::headers::RAV1D_WM_TYPE_ROT_ZOOM;
use crate::include::dav1d::headers::RAV1D_WM_TYPE_TRANSLATION;
use crate::include::stdatomic::atomic_int;
use crate::src::cdf::rav1d_cdf_thread_ref;
use crate::src::cdf::rav1d_cdf_thread_unref;
use crate::src::data::rav1d_data_ref;
Expand Down Expand Up @@ -2538,9 +2537,7 @@ unsafe fn parse_obus(c: &mut Rav1dContext, r#in: &Rav1dData, global: bool) -> Ra
}
let out_delayed = &mut *c.frame_thread.out_delayed.offset(next as isize);
if !(*out_delayed).p.data[0].is_null()
|| ::core::intrinsics::atomic_load_seqcst(
&mut (*f).task_thread.error as *mut atomic_int,
) != 0
|| (*f).task_thread.error.load(Ordering::SeqCst) != 0
{
let first = ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first);
if first + 1 < c.n_fc {
Expand Down
Loading

0 comments on commit 220a1ba

Please sign in to comment.