Skip to content

Commit 0de3470

Browse files
committed
perf(server): make tiles encoding parallel with rayon
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
1 parent d0ab6b7 commit 0de3470

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/ironrdp-server/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ ironrdp-rdpsnd.workspace = true
3939
tracing.workspace = true
4040
x509-cert = { version = "0.2.5", optional = true }
4141
rustls-pemfile = { version = "2.2.0", optional = true }
42+
rayon = "1.10.0"
4243

4344
[dev-dependencies]
4445
tokio = { version = "1", features = ["sync"] }

crates/ironrdp-server/src/encoder/rfx.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,24 @@ impl RfxEncoder {
6565
let tiles_x: usize = bitmap.width.get().div_ceil(64).into();
6666
let tiles_y: usize = bitmap.height.get().div_ceil(64).into();
6767
let ntiles = tiles_x * tiles_y;
68-
let mut tiles = Vec::with_capacity(ntiles);
69-
let mut data = vec![0u8; 64 * 64 * 3 * ntiles];
70-
let mut buf = data.chunks_exact_mut(64 * 64 * 3);
7168

7269
let encoder = UpdateEncoder::new(bitmap, quant.clone(), entropy_algorithm);
7370

74-
for tile_y in 0..tiles_y {
75-
for tile_x in 0..tiles_x {
71+
use rayon::prelude::*;
72+
73+
let mut data = vec![0u8; 64 * 64 * 3 * ntiles];
74+
let chunks = data.par_chunks_mut(64 * 64 * 3);
75+
let tiles: Vec<_> = (0..tiles_y).flat_map(|y| (0..tiles_x).map(move |x| (x, y))).collect();
76+
77+
let tiles: Result<Vec<_>, _> = chunks
78+
.zip(tiles)
79+
.map(|(buf, (tile_x, tile_y))| {
7680
let EncodedTile {
7781
y_data,
7882
cb_data,
7983
cr_data,
8084
} = encoder
81-
.encode(tile_x, tile_y, buf.next().unwrap())
85+
.encode(tile_x, tile_y, buf)
8286
.map_err(|e| other_err!("rfxenc", source: e))?;
8387

8488
let tile = rfx::Tile {
@@ -91,15 +95,15 @@ impl RfxEncoder {
9195
cb_data,
9296
cr_data,
9397
};
94-
tiles.push(tile);
95-
}
96-
}
98+
Ok(tile)
99+
})
100+
.collect();
97101

98102
let quants = vec![quant];
99103
let tile_set = rfx::TileSetPdu {
100104
entropy_algorithm,
101105
quants,
102-
tiles,
106+
tiles: tiles?,
103107
};
104108
let frame_end = rfx::FrameEndPdu;
105109

0 commit comments

Comments
 (0)