Skip to content

Commit 02246aa

Browse files
committed
feat(server): benchmark the remotefx tile encoder
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
1 parent 2f98acf commit 02246aa

File tree

6 files changed

+250
-6
lines changed

6 files changed

+250
-6
lines changed

Cargo.lock

Lines changed: 195 additions & 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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ test = false
1717

1818
[features]
1919
helper = ["dep:x509-cert", "dep:rustls-pemfile"]
20+
bench = []
2021

2122
[dependencies]
2223
anyhow = "1.0"
@@ -41,6 +42,13 @@ rustls-pemfile = { version = "2.2.0", optional = true }
4142

4243
[dev-dependencies]
4344
tokio = { version = "1", features = ["sync"] }
45+
criterion = "0.5"
46+
47+
[[bench]]
48+
name = "bench"
49+
path = "benches/bench.rs"
50+
required-features = ["bench"]
51+
harness = false
4452

4553
[lints]
4654
workspace = true
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use std::num::NonZero;
2+
3+
use criterion::{criterion_group, criterion_main, Criterion};
4+
use ironrdp_pdu::codecs::rfx::{EntropyAlgorithm, Quant};
5+
use ironrdp_server::{bench::encoder::*, BitmapUpdate};
6+
7+
pub fn criterion_benchmark(c: &mut Criterion) {
8+
let quant = Quant::default();
9+
let algo = EntropyAlgorithm::Rlgr3;
10+
let bitmap = BitmapUpdate {
11+
top: 0,
12+
left: 0,
13+
width: NonZero::new(64).unwrap(),
14+
height: NonZero::new(64).unwrap(),
15+
format: ironrdp_server::PixelFormat::ARgb32,
16+
data: vec![0; 64 * 64 * 4],
17+
order: ironrdp_server::PixelOrder::BottomToTop,
18+
stride: 64 * 4,
19+
};
20+
let enc = rfx::UpdateEncoder::new(&bitmap, quant, algo);
21+
let mut buf = vec![0; 64 * 64 * 3];
22+
c.bench_function("rfxenc", |b| {
23+
b.iter(|| {
24+
let _ = enc.encode(0, 0, &mut buf);
25+
})
26+
});
27+
}
28+
29+
criterion_group!(benches, criterion_benchmark);
30+
criterion_main!(benches);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
pub(crate) mod bitmap;
2-
pub(crate) mod rfx;
1+
#![allow(unreachable_pub)]
2+
3+
pub mod bitmap;
4+
pub mod rfx;
35

46
use std::{cmp, mem};
57

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![allow(unreachable_pub)]
2+
13
use ironrdp_core::{cast_length, other_err, EncodeResult};
24
use ironrdp_graphics::color_conversion::to_64x64_ycbcr_tile;
35
use ironrdp_graphics::rfx_encode_component;
@@ -130,28 +132,28 @@ impl RfxEncoder {
130132
}
131133
}
132134

133-
struct UpdateEncoder<'a> {
135+
pub struct UpdateEncoder<'a> {
134136
bitmap: &'a BitmapUpdate,
135137
quant: rfx::Quant,
136138
entropy_algorithm: rfx::EntropyAlgorithm,
137139
}
138140

139-
struct EncodedTile<'a> {
141+
pub struct EncodedTile<'a> {
140142
y_data: &'a [u8],
141143
cb_data: &'a [u8],
142144
cr_data: &'a [u8],
143145
}
144146

145147
impl<'a> UpdateEncoder<'a> {
146-
fn new(bitmap: &'a BitmapUpdate, quant: rfx::Quant, entropy_algorithm: rfx::EntropyAlgorithm) -> Self {
148+
pub fn new(bitmap: &'a BitmapUpdate, quant: rfx::Quant, entropy_algorithm: rfx::EntropyAlgorithm) -> Self {
147149
Self {
148150
bitmap,
149151
quant,
150152
entropy_algorithm,
151153
}
152154
}
153155

154-
fn encode<'b>(&self, tile_x: usize, tile_y: usize, buf: &'b mut [u8]) -> Result<EncodedTile<'b>, RlgrError> {
156+
pub fn encode<'b>(&self, tile_x: usize, tile_y: usize, buf: &'b mut [u8]) -> Result<EncodedTile<'b>, RlgrError> {
155157
assert!(buf.len() >= 4096 * 3);
156158

157159
let bpp: usize = self.bitmap.format.bytes_per_pixel().into();

0 commit comments

Comments
 (0)