wgpu-mipmap

Crates.iowgpu-mipmap
lib.rswgpu-mipmap
version0.1.0
sourcesrc
created_at2020-09-20 17:51:52.790636
updated_at2020-09-20 17:51:52.790636
descriptionGenerate mipmaps for wgpu textures
homepage
repositoryhttps://github.com/jshrake/wgpu-mipmap
max_upload_size
id290867
size149,303
Justin Shrake (jshrake)

documentation

README

wgpu-mipmap

ci

Generate mipmaps for wgpu textures.

Usage

Add this to your Cargo.toml:

[dependencies]
wgpu-mipmap = "0.1"

Example usage:

use wgpu_mipmap::*;
fn example(device: &wgpu::Device, queue: &wgpu::Queue) -> Result<(), Error> {
    // create a recommended generator
    let generator = RecommendedMipmapGenerator::new(&device);
    // create and upload data to a texture
    let texture_descriptor = wgpu::TextureDescriptor {
        size: wgpu::Extent3d {
            width: 512,
            height: 512,
            depth: 1,
        },
        mip_level_count: 10, // 1 + log2(512)
        sample_count: 1,
        format: wgpu::TextureFormat::Rgba8Unorm,
        dimension: wgpu::TextureDimension::D2,
        usage: wgpu::TextureUsage::STORAGE,
        label: None,
    };
    let texture = device.create_texture(&texture_descriptor);
    // upload_data_to_texture(&texture);
    // create an encoder and generate mipmaps for the texture
    let mut encoder = device.create_command_encoder(&Default::default());
    generator.generate(&device, &mut encoder, &texture, &texture_descriptor)?;
    queue.submit(std::iter::once(encoder.finish()));
    Ok(())
}

Features

wgpu-mipmap is in the early stages of development and can only generate mipmaps for 2D textures with floating-point formats. The library implements several backends in order to support various texture usage patterns:

  • ComputeMipmapGenerator: For power of two textures with with usage TextureUsage::STORAGE. Uses a compute pipeline to generate mipmaps.
  • RenderMipmapGenerator: For textures with usage TextureUsage::OUTPUT_ATTACHMENT. Uses a render pipeline to generate mipmaps.
  • CopyMipmapGenerator: For textures with usage TextureUsage::SAMPLED. Allocates a new texture, uses a render pipeline to generate mipmaps in the new texture, then copies the result back to the original texture.
  • RecommendedMipmapGenerator: Uses one of the above implementations depending on texture usage (prefers the compute backend, followed by the render backend, and finally the copy backend).

Development

Run the examples

The examples test various use cases and generate images for manual inspection and comparsion.

$ cargo run --example cat
$ cargo run --example checkerboard

Run the tests

$ cargo test

How to compile the shaders

$ make build-shaders

See src/shaders/README.md for dependencies and more information.

Benchmarks

TODO

Resources

Commit count: 5

cargo fmt