Skip to content

Commit

Permalink
Cap InnerBuffer::global_ubo size
Browse files Browse the repository at this point in the history
The value of glow::MAX_UNIFORM_BLOCK_SIZE can be arbitrarily large. For
instance on Firefox on Linux with AMD GPUs tends to generate quite large
values: 2**29 on RX 500, and 2**31 on RX 7600 XT, which will result in
this function trying to create a 0.5 GB and a 2 GB buffer respectively.
Creating buffers this large will either cause a quick OOM, or at least
make the application unusably slow.

This commit caps the returned size to 2**16, which is the value returned
by Chromium in the same combination as above and results in this
function creating 64 kB buffers.
  • Loading branch information
metiulekm committed Feb 28, 2025
1 parent f74aabc commit 3ad2b23
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion crates/notan_glow/src/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ impl InnerBuffer {

#[cfg(target_arch = "wasm32")]
let global_ubo = if matches!(kind, Kind::Uniform(_, _)) {
let max = unsafe { gl.get_parameter_i32(glow::MAX_UNIFORM_BLOCK_SIZE) } as usize;
let max = (unsafe { gl.get_parameter_i32(glow::MAX_UNIFORM_BLOCK_SIZE) } as usize)
.min(1 << 16);

Some(vec![0; max])
} else {
Expand Down

0 comments on commit 3ad2b23

Please sign in to comment.