-
Notifications
You must be signed in to change notification settings - Fork 345
Description
While developing algorithms it can be common to both share code between lots of shaders, but also to experiment with dispatch in compute shader vs fragment shader. Some hardware have different performance on compute vs fragment so one might even need to ship parallel implementations.
I just ran into this while experimenting with compute vs fragment implementation of a fluid simulation in our game and have similar experience with our bloom shader which also has two parallel implementations.
It felt silly that I was not allowed to specify the level '0' in the compute textureLoad (or alternatively for the level to implicitly be 0 in the fragment shader case)
(using naga)
// ..
#ifdef COMPUTE
var fluid_sim_texture_source: texture_storage_2d<rgba16float, read>;
#else
var fluid_sim_texture_source: texture_2d<f32>;
#endif
// ..
fn the_fluid_solver(
uv: vec2<f32>,
step_size: vec2<f32>,
) -> vec4<f32> {
// ...
let size = textureDimensions(fluid_sim_texture_source);
#ifdef COMPUTE
var fluid_data = textureLoad(fluid_sim_texture_source, uv_to_texel(uv, size));
let fr = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_r, size));
let fl = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_l, size));
let ft = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_t, size));
let fd = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_d, size));
#else
var fluid_data = textureLoad(fluid_sim_texture_source, uv_to_texel(uv, size), 0);
let fr = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_r, size), 0);
let fl = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_l, size), 0);
let ft = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_t, size), 0);
let fd = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_d, size), 0);
#endif
// ...
}If I try to add a level of 0 in compute, I get
error: wrong number of arguments: expected 2, found 3
┌─ :5214:22
│
5214 │ var fluid_data = textureLoad(fluid_sim_texture_source, uv_to_texel(uv, size), 0);
│ ^^^^^^^^^^^ wrong number of argumentsAnd if I try to not specify the level of 0 in the fragment shader, I get
error: wrong number of arguments: expected 3, found 2
┌─ :3238:18
│
3238 │ let sample = textureLoad(fluid_sim_texture_source, uv_to_texel(uv_history, size));
│ ^^^^^^^^^^^ wrong number of argumentsWould you consider allowing textureLoad to either have a default level of 0 when none is specified or to require/allow an explicit level of 0 in compute shaders as well for easier code sharing?