这是indexloc提供的服务,不要输入任何密码
Skip to content

[proposal] consider having compatible APIs for textureLoad on different types (texture_2d, texture_storage_2d, etc.) #5387

@EriKWDev

Description

@EriKWDev

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 arguments

And 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 arguments

Would 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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    wgslWebGPU Shading Language Issues

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions