pygfx / wgpu-py

WebGPU for Python
https://wgpu-py.readthedocs.io
BSD 2-Clause "Simplified" License
436 stars 35 forks source link

Raspberry Pi 4B setup log #438

Closed dskkato closed 10 months ago

dskkato commented 10 months ago

This is not issues, but setup log for Raspberry Pi 4B


Tentative Summary


Device info

Hardware : Raspberry Pi 4 Model B Rev 1.5

dskkato@raspberrypi:~ $ cat /sys/firmware/devicetree/base/model 
Raspberry Pi 4 Model B Rev 1.5

OS : Raspberry Pi OS (64 bit)

 dskkato@raspberrypi:~ $ cat /proc/version 
Linux version 6.1.0-rpi4-rpi-v8 (debian-kernel@lists.debian.org)
(gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40)
#1 SMP PREEMPT Debian 1:6.1.54-1+rpt2 (2023-10-05)

default Python version : 3.11.2

dskkato@raspberrypi:~ $ python --version
Python 3.11.2

Setup wgpu

clone & install

I used my own release artifact : https://github.com/dskkato/wgpu-native/releases/tag/v0.18.1.4 .

git clone https://github.com/pygfx/wgpu-py.git
cd wgpu-py
python -m venv .venv
source .venv/bin/activate
# modify upstream and version info here (omitted)
pip install -e .

Just after the installation of wgpu-py, it says some libraries are missing:

(.venv) dskkato@raspberrypi:~/workspace/wgpu-py $ python examples/cube.py 
Traceback (most recent call last):
  File "/home/dskkato/workspace/wgpu-py/examples/cube.py", line 8, in <module>
    from wgpu.gui.auto import WgpuCanvas, run
  File "/home/dskkato/workspace/wgpu-py/wgpu/gui/auto.py", line 103, in <module>
    module = _auto_load_backend()
             ^^^^^^^^^^^^^^^^^^^^
  File "/home/dskkato/workspace/wgpu-py/wgpu/gui/auto.py", line 92, in _auto_load_backend
    raise ImportError(msg) from None
ImportError: 

  Could not find either glfw or Qt framework.
  Install glfw using e.g. ``pip install -U glfw``,
  or install a qt framework using e.g. ``pip install -U pyside6``.
  You may also need to run the equivalent of ``apt install libglfw3``.

Add dependencies:

pip install numpy glfw

Still, it does not work

(.venv) dskkato@raspberrypi:~/workspace/wgpu-py $ python examples/cube.py 
    EGL context: -robust access
Max vertex shader SSBO == 0 and SSTO != 0. Interpreting as false zero.
Re-initializing Gles context due to Wayland window
    EGL context: -robust access
thread '<unnamed>' panicked at /root/.cargo/git/checkouts/wgpu-53e70f8674b08dd4/2e7fd75/wgpu-hal/src/gles/egl.rs:305:14:
called `Result::unwrap()` on an `Err` value: BadDisplay
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fatal runtime error: failed to initiate panic, error 556743984
Aborted

GLES backend seems not to work now.

Install Vulkan driver:

sudo apt install mesa-vulkan-drivers 

Now, cube appeared !!

(.venv) dskkato@raspberrypi:~/workspace/wgpu-py $ python examples/cube.py 
    EGL context: -robust access
Max vertex shader SSBO == 0 and SSTO != 0. Interpreting as false zero.
Missing downlevel flags: DownlevelFlags(FULL_DRAW_INDEX_UINT32)
The underlying API or device in use does not support enough features to be a fully compliant implementation of WebGPU. A subset of the features can still be used. If you are running this program on native and not in a browser and wish to limit the features you use to the supported subset, call Adapter::downlevel_properties or Device::downlevel_properties to get a listing of the features the current platform supports.
Re-initializing Gles context due to Wayland window
    EGL context: -robust access

But, obvious tearing was observed frequently. It may be related to that the latest Rraspberry OS uses wayland by default.

vlcsnap-2023-12-01-01h05m56s439

vlcsnap-2023-12-01-01h06m17s563

In X11, Tearing seems to be less frequent but not completely gone. See the following link how to switch wayland and X11.

https://raspberrypi.stackexchange.com/questions/144866/can-i-use-x11-on-the-new-64-bit-os-instead-of-wayland


TBA : Ubuntu version

almarklein commented 10 months ago

Thanks for the detailed setup log!

I see that it falls back to GL. Not sure if e.g. pygfx works on that backend. A quick Google search suggests that it is possible to install Vulkan on Raspberry Pi. Have you tried that?

dskkato commented 10 months ago

I've tried several combinations of X11/Wayland and OpenGL/Vulkan. With X11, both OpenGL and Vulkan worked well. However, there seem to be various issues with Wayland. Wayland + OpenGL failed to launch the cube, and Wayland + Vulkan launched but had frequent tearing.

Wayland X11
OpenGL :x: :white_check_mark:
Vulkan :warning: *1 :white_check_mark: *2

Wayland + OpenGL log

    EGL context: -robust access
Max vertex shader SSBO == 0 and SSTO != 0. Interpreting as false zero.
Re-initializing Gles context due to Wayland window
    EGL context: -robust access
thread '' panicked at /root/.cargo/git/checkouts/wgpu-53e70f8674b08dd4/2e7fd75/wgpu-hal/src/gles/egl.rs:305:14:
called `Result::unwrap()` on an `Err` value: BadDisplay
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fatal runtime error: failed to initiate panic, error 966897392

X11 + Vulkan log

    EGL context: -robust access
Max vertex shader SSBO == 0 and SSTO != 0. Interpreting as false zero.
Missing downlevel flags: DownlevelFlags(FULL_DRAW_INDEX_UINT32)
The underlying API or device in use does not support enough features to be a
fully compliant implementation of WebGPU. A subset of the features can still
be used. If you are running this program on native and not in a browser and
wish to limit the features you use to the supported subset, call
Adapter::downlevel_properties or Device::downlevel_properties to get a listing
of the features the current platform supports.

I checked drivers with wgpu-info, and verified Vuklan drivers were installed.

Default (OpenGL only) ```sh Adapter 0: Backend: Gl Name: "V3D 4.2" VendorID: 5348 DeviceID: 0 Type: IntegratedGpu Driver: "" DriverInfo: "" Compliant: false Features: DEPTH_CLIP_CONTROL: false TIMESTAMP_QUERY: false INDIRECT_FIRST_INSTANCE: false SHADER_F16: false BGRA8UNORM_STORAGE: false RG11B10UFLOAT_RENDERABLE: false DEPTH32FLOAT_STENCIL8: false TEXTURE_COMPRESSION_BC: false TEXTURE_COMPRESSION_ETC2: true TEXTURE_COMPRESSION_ASTC: true TEXTURE_FORMAT_16BIT_NORM: false TEXTURE_COMPRESSION_ASTC_HDR: false TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES: true PIPELINE_STATISTICS_QUERY: false TIMESTAMP_QUERY_INSIDE_PASSES: false MAPPABLE_PRIMARY_BUFFERS: false TEXTURE_BINDING_ARRAY: false BUFFER_BINDING_ARRAY: false STORAGE_RESOURCE_BINDING_ARRAY: false SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING: false UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING: false PARTIALLY_BOUND_BINDING_ARRAY: false MULTI_DRAW_INDIRECT: false MULTI_DRAW_INDIRECT_COUNT: false PUSH_CONSTANTS: true ADDRESS_MODE_CLAMP_TO_ZERO: true ADDRESS_MODE_CLAMP_TO_BORDER: true POLYGON_MODE_LINE: false POLYGON_MODE_POINT: false CONSERVATIVE_RASTERIZATION: false VERTEX_WRITABLE_STORAGE: true CLEAR_TEXTURE: true SPIRV_SHADER_PASSTHROUGH: false MULTIVIEW: false VERTEX_ATTRIBUTE_64BIT: false SHADER_UNUSED_VERTEX_OUTPUT: true TEXTURE_FORMAT_NV12: false SHADER_F64: false SHADER_I16: false SHADER_PRIMITIVE_INDEX: false SHADER_EARLY_DEPTH_TEST: true DUAL_SOURCE_BLENDING: false Limits: Max Texture Dimension 1d: 4096 Max Texture Dimension 2d: 4096 Max Texture Dimension 3d: 4096 Max Texture Array Layers: 2048 Max Bind Groups: 8 Max Bindings Per Bind Group: 65535 Max Dynamic Uniform Buffers Per Pipeline Layout: 15 Max Dynamic Storage Buffers Per Pipeline Layout: 16 Max Sampled Textures Per Shader Stage: 16 Max Samplers Per Shader Stage: 16 Max Storage Buffers Per Shader Stage: 16 Max Storage Textures Per Shader Stage: 32 Max Uniform Buffers Per Shader Stage: 15 Max Uniform Buffer Binding Size: 65536 Max Storage Buffer Binding Size: 134217728 Max Buffer Size: 2147483647 Max Vertex Buffers: 16 Max Vertex Attributes: 16 Max Vertex Buffer Array Stride: 2048 Max Push Constant Size: 256 Min Uniform Buffer Offset Alignment: 256 Min Storage Buffer Offset Alignment: 32 Max Inter-Stage Shader Component: 64 Max Compute Workgroup Storage Size: 32768 Max Compute Invocations Per Workgroup: 256 Max Compute Workgroup Size X: 256 Max Compute Workgroup Size Y: 256 Max Compute Workgroup Size Z: 256 Max Compute Workgroups Per Dimension: 65535 Downlevel Properties: Shader Model: Sm5 COMPUTE_SHADERS: true FRAGMENT_WRITABLE_STORAGE: true INDIRECT_EXECUTION: true BASE_VERTEX: false READ_ONLY_DEPTH_STENCIL: false NON_POWER_OF_TWO_MIPMAPPED_TEXTURES: true CUBE_ARRAY_TEXTURES: true COMPARISON_SAMPLERS: true INDEPENDENT_BLEND: true VERTEX_STORAGE: true ANISOTROPIC_FILTERING: true FRAGMENT_STORAGE: true MULTISAMPLED_SHADING: false DEPTH_TEXTURE_AND_BUFFER_COPIES: false WEBGPU_TEXTURE_FORMAT_SUPPORT: false BUFFER_BINDINGS_NOT_16_BYTE_ALIGNED: true UNRESTRICTED_INDEX_BUFFER: true FULL_DRAW_INDEX_UINT32: false DEPTH_BIAS_CLAMP: false VIEW_FORMATS: false UNRESTRICTED_EXTERNAL_TEXTURE_COPIES: true SURFACE_VIEW_FORMATS: false NONBLOCKING_QUERY_RESOLVE: false VERTEX_AND_INSTANCE_INDEX_RESPECTS_RESPECTIVE_FIRST_VALUE_IN_INDIRECT_DRAW: true Texture Format Allowed Usages: ┌──────────┬──────────┬─────────────────┬─────────────────┬───────────────────┐ R8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ R8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R16Unorm: │ │ │ │ │ │ R16Snorm: │ │ │ │ │ │ R16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Rg8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg16Unorm: │ │ │ │ │ │ Rg16Snorm: │ │ │ │ │ │ Rg16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Rgba8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Bgra8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Bgra8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb10a2Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb10a2Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg11b10Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgba16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Unorm: │ │ │ │ │ │ Rgba16Snorm: │ │ │ │ │ │ Rgba16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Stencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth32FloatStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24Plus: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24PlusStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb9e5Ufloat: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc1RgbaUnorm: │ │ │ │ │ │ Bc1RgbaUnormSrgb: │ │ │ │ │ │ Bc2RgbaUnorm: │ │ │ │ │ │ Bc2RgbaUnormSrgb: │ │ │ │ │ │ Bc3RgbaUnorm: │ │ │ │ │ │ Bc3RgbaUnormSrgb: │ │ │ │ │ │ Bc4RUnorm: │ │ │ │ │ │ Bc4RSnorm: │ │ │ │ │ │ Bc5RgUnorm: │ │ │ │ │ │ Bc5RgSnorm: │ │ │ │ │ │ Bc6hRgbUfloat: │ │ │ │ │ │ Bc6hRgbFloat: │ │ │ │ │ │ Bc7RgbaUnorm: │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ │ │ │ │ │ Etc2Rgb8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8A1Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8A1UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacR11Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacR11Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacRg11Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacRg11Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4Hdr: │ │ │ │ │ │ AstcB5x4Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x4UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x4Hdr: │ │ │ │ │ │ AstcB5x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x5Hdr: │ │ │ │ │ │ AstcB6x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x5Hdr: │ │ │ │ │ │ AstcB6x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x6Hdr: │ │ │ │ │ │ AstcB8x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x5Hdr: │ │ │ │ │ │ AstcB8x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x6Hdr: │ │ │ │ │ │ AstcB8x8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x8Hdr: │ │ │ │ │ │ AstcB10x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x5Hdr: │ │ │ │ │ │ AstcB10x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x6Hdr: │ │ │ │ │ │ AstcB10x8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x8Hdr: │ │ │ │ │ │ AstcB10x10Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x10UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x10Hdr: │ │ │ │ │ │ AstcB12x10Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x10UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x10Hdr: │ │ │ │ │ │ AstcB12x12Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x12UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x12Hdr: │ │ │ │ │ │ └──────────┴──────────┴─────────────────┴─────────────────┴───────────────────┘ Texture Format Flags: ┌────────────┬────────────────┬────────────────┬────────────────┬─────────────────┬─────────────────────┬────────────────────┬───────────┐ R8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ R8Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ R8Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R8Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R16Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R16Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R16Unorm: │ │ │ │ │ │ │ │ │ R16Snorm: │ │ │ │ │ │ │ │ │ R16Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg8Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ Rg8Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg8Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R32Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg16Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg16Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg16Unorm: │ │ │ │ │ │ │ │ │ Rg16Snorm: │ │ │ │ │ │ │ │ │ Rg16Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgba8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8UnormSrgb: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ Rgba8Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba8Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Bgra8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Bgra8UnormSrgb: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgb10a2Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rgb10a2Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg11b10Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg32Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg32Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgba16Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Unorm: │ │ │ │ │ │ │ │ │ Rgba16Snorm: │ │ │ │ │ │ │ │ │ Rgba16Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba32Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Stencil8: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth16Unorm: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth32FloatStencil8: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth24Plus: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth24PlusStencil8: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Rgb9e5Ufloat: │ FILTERABLE │ │ │ │ │ │ │ │ Bc1RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc1RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Bc2RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc2RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Bc3RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc3RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Bc4RUnorm: │ │ │ │ │ │ │ │ │ Bc4RSnorm: │ │ │ │ │ │ │ │ │ Bc5RgUnorm: │ │ │ │ │ │ │ │ │ Bc5RgSnorm: │ │ │ │ │ │ │ │ │ Bc6hRgbUfloat: │ │ │ │ │ │ │ │ │ Bc6hRgbFloat: │ │ │ │ │ │ │ │ │ Bc7RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Etc2Rgb8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgb8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgb8A1Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgb8A1UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgba8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgba8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ EacR11Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ EacR11Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ EacRg11Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ EacRg11Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB4x4Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB4x4UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB4x4Hdr: │ │ │ │ │ │ │ │ │ AstcB5x4Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x4UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x4Hdr: │ │ │ │ │ │ │ │ │ AstcB5x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x5Hdr: │ │ │ │ │ │ │ │ │ AstcB6x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x5Hdr: │ │ │ │ │ │ │ │ │ AstcB6x6Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x6UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x6Hdr: │ │ │ │ │ │ │ │ │ AstcB8x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x5Hdr: │ │ │ │ │ │ │ │ │ AstcB8x6Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x6UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x6Hdr: │ │ │ │ │ │ │ │ │ AstcB8x8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x8Hdr: │ │ │ │ │ │ │ │ │ AstcB10x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x5Hdr: │ │ │ │ │ │ │ │ │ AstcB10x6Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x6UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x6Hdr: │ │ │ │ │ │ │ │ │ AstcB10x8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x8Hdr: │ │ │ │ │ │ │ │ │ AstcB10x10Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x10UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x10Hdr: │ │ │ │ │ │ │ │ │ AstcB12x10Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x10UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x10Hdr: │ │ │ │ │ │ │ │ │ AstcB12x12Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x12UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x12Hdr: │ │ │ │ │ │ │ │ │ └────────────┴────────────────┴────────────────┴────────────────┴─────────────────┴─────────────────────┴────────────────────┴───────────┘ ```

After installation of Vulkan driver

sudo apt install mesa-vulkan-drivers
With Vulkan ```sh Adapter 0: Backend: Vulkan Name: "V3D 4.2.14" VendorID: 5348 DeviceID: 3192414163 Type: IntegratedGpu Driver: "V3DV Mesa" DriverInfo: "Mesa 23.2.1-1~bpo12+rpt2" Compliant: false Features: DEPTH_CLIP_CONTROL: false TIMESTAMP_QUERY: true INDIRECT_FIRST_INSTANCE: true SHADER_F16: false BGRA8UNORM_STORAGE: false RG11B10UFLOAT_RENDERABLE: true DEPTH32FLOAT_STENCIL8: false TEXTURE_COMPRESSION_BC: false TEXTURE_COMPRESSION_ETC2: true TEXTURE_COMPRESSION_ASTC: true TEXTURE_FORMAT_16BIT_NORM: true TEXTURE_COMPRESSION_ASTC_HDR: false TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES: true PIPELINE_STATISTICS_QUERY: false TIMESTAMP_QUERY_INSIDE_PASSES: true MAPPABLE_PRIMARY_BUFFERS: true TEXTURE_BINDING_ARRAY: false BUFFER_BINDING_ARRAY: false STORAGE_RESOURCE_BINDING_ARRAY: true SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING: false UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING: false PARTIALLY_BOUND_BINDING_ARRAY: false MULTI_DRAW_INDIRECT: false MULTI_DRAW_INDIRECT_COUNT: false PUSH_CONSTANTS: true ADDRESS_MODE_CLAMP_TO_ZERO: true ADDRESS_MODE_CLAMP_TO_BORDER: true POLYGON_MODE_LINE: true POLYGON_MODE_POINT: true CONSERVATIVE_RASTERIZATION: false VERTEX_WRITABLE_STORAGE: true CLEAR_TEXTURE: true SPIRV_SHADER_PASSTHROUGH: true MULTIVIEW: true VERTEX_ATTRIBUTE_64BIT: false SHADER_UNUSED_VERTEX_OUTPUT: true TEXTURE_FORMAT_NV12: true SHADER_F64: false SHADER_I16: false SHADER_PRIMITIVE_INDEX: true SHADER_EARLY_DEPTH_TEST: false DUAL_SOURCE_BLENDING: false Limits: Max Texture Dimension 1d: 4096 Max Texture Dimension 2d: 4096 Max Texture Dimension 3d: 4096 Max Texture Array Layers: 2048 Max Bind Groups: 8 Max Bindings Per Bind Group: 1000 Max Dynamic Uniform Buffers Per Pipeline Layout: 8 Max Dynamic Storage Buffers Per Pipeline Layout: 4 Max Sampled Textures Per Shader Stage: 16 Max Samplers Per Shader Stage: 24 Max Storage Buffers Per Shader Stage: 8 Max Storage Textures Per Shader Stage: 4 Max Uniform Buffers Per Shader Stage: 12 Max Uniform Buffer Binding Size: 1073741824 Max Storage Buffer Binding Size: 1073741824 Max Buffer Size: 2147483647 Max Vertex Buffers: 16 Max Vertex Attributes: 16 Max Vertex Buffer Array Stride: 4294967295 Max Push Constant Size: 128 Min Uniform Buffer Offset Alignment: 32 Min Storage Buffer Offset Alignment: 32 Max Inter-Stage Shader Component: 64 Max Compute Workgroup Storage Size: 16384 Max Compute Invocations Per Workgroup: 256 Max Compute Workgroup Size X: 256 Max Compute Workgroup Size Y: 256 Max Compute Workgroup Size Z: 256 Max Compute Workgroups Per Dimension: 65535 Downlevel Properties: Shader Model: Sm5 COMPUTE_SHADERS: true FRAGMENT_WRITABLE_STORAGE: true INDIRECT_EXECUTION: true BASE_VERTEX: true READ_ONLY_DEPTH_STENCIL: true NON_POWER_OF_TWO_MIPMAPPED_TEXTURES: true CUBE_ARRAY_TEXTURES: true COMPARISON_SAMPLERS: true INDEPENDENT_BLEND: true VERTEX_STORAGE: true ANISOTROPIC_FILTERING: true FRAGMENT_STORAGE: true MULTISAMPLED_SHADING: true DEPTH_TEXTURE_AND_BUFFER_COPIES: true WEBGPU_TEXTURE_FORMAT_SUPPORT: true BUFFER_BINDINGS_NOT_16_BYTE_ALIGNED: true UNRESTRICTED_INDEX_BUFFER: true FULL_DRAW_INDEX_UINT32: false DEPTH_BIAS_CLAMP: true VIEW_FORMATS: true UNRESTRICTED_EXTERNAL_TEXTURE_COPIES: true SURFACE_VIEW_FORMATS: true NONBLOCKING_QUERY_RESOLVE: true VERTEX_AND_INSTANCE_INDEX_RESPECTS_RESPECTIVE_FIRST_VALUE_IN_INDIRECT_DRAW: true Texture Format Allowed Usages: ┌──────────┬──────────┬─────────────────┬─────────────────┬───────────────────┐ R8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ R8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ R16Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ R16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ Rg8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ Rg16Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ Rg16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ Rgba8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Bgra8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Bgra8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgb10a2Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgb10a2Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg11b10Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ Rgba16Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ │ Rgba16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Stencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Depth32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Depth32FloatStencil8: │ │ │ │ │ │ Depth24Plus: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24PlusStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb9e5Ufloat: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc1RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc1RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc2RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc2RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc3RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc3RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc4RUnorm: │ │ │ │ │ │ Bc4RSnorm: │ │ │ │ │ │ Bc5RgUnorm: │ │ │ │ │ │ Bc5RgSnorm: │ │ │ │ │ │ Bc6hRgbUfloat: │ │ │ │ │ │ Bc6hRgbFloat: │ │ │ │ │ │ Bc7RgbaUnorm: │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ │ │ │ │ │ Etc2Rgb8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8A1Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8A1UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacR11Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacR11Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacRg11Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacRg11Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4Hdr: │ │ │ │ │ │ AstcB5x4Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x4UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x4Hdr: │ │ │ │ │ │ AstcB5x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x5Hdr: │ │ │ │ │ │ AstcB6x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x5Hdr: │ │ │ │ │ │ AstcB6x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x6Hdr: │ │ │ │ │ │ AstcB8x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x5Hdr: │ │ │ │ │ │ AstcB8x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x6Hdr: │ │ │ │ │ │ AstcB8x8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x8Hdr: │ │ │ │ │ │ AstcB10x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x5Hdr: │ │ │ │ │ │ AstcB10x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x6Hdr: │ │ │ │ │ │ AstcB10x8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x8Hdr: │ │ │ │ │ │ AstcB10x10Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x10UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x10Hdr: │ │ │ │ │ │ AstcB12x10Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x10UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x10Hdr: │ │ │ │ │ │ AstcB12x12Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x12UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x12Hdr: │ │ │ │ │ │ └──────────┴──────────┴─────────────────┴─────────────────┴───────────────────┘ Texture Format Flags: ┌────────────┬────────────────┬────────────────┬────────────────┬─────────────────┬─────────────────────┬────────────────────┬───────────┐ R8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ R8Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R8Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R8Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg8Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg8Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg8Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Float: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba8Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba8Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Bgra8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Bgra8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgb10a2Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgb10a2Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg11b10Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg32Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg32Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg32Float: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba32Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Float: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Stencil8: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth16Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Depth32Float: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Depth32FloatStencil8: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth24Plus: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth24PlusStencil8: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rgb9e5Ufloat: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Bc1RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc1RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc2RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc2RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc3RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc3RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc4RUnorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc4RSnorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc5RgUnorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc5RgSnorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc6hRgbUfloat: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc6hRgbFloat: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc7RgbaUnorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8A1Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8A1UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgba8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgba8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacR11Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacR11Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacRg11Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacRg11Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB4x4Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB4x4UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB4x4Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x4Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x4UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x4Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x5Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x5UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x5Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x5UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x6Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x6UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x6Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x5Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x5UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x6Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x6UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x6Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x8Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x5Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x5UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x6Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x6UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x6Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x8Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x10Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x10UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x10Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x10Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x10UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x10Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x12Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x12UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x12Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ └────────────┴────────────────┴────────────────┴────────────────┴─────────────────┴─────────────────────┴────────────────────┴───────────┘ Adapter 1: Backend: Vulkan Name: "llvmpipe (LLVM 15.0.6, 128 bits)" VendorID: 65541 DeviceID: 0 Type: Cpu Driver: "llvmpipe" DriverInfo: "Mesa 23.2.1-1~bpo12+rpt2 (LLVM 15.0.6)" Compliant: true Features: DEPTH_CLIP_CONTROL: true TIMESTAMP_QUERY: true INDIRECT_FIRST_INSTANCE: true SHADER_F16: true BGRA8UNORM_STORAGE: true RG11B10UFLOAT_RENDERABLE: true DEPTH32FLOAT_STENCIL8: true TEXTURE_COMPRESSION_BC: true TEXTURE_COMPRESSION_ETC2: false TEXTURE_COMPRESSION_ASTC: false TEXTURE_FORMAT_16BIT_NORM: true TEXTURE_COMPRESSION_ASTC_HDR: false TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES: true PIPELINE_STATISTICS_QUERY: true TIMESTAMP_QUERY_INSIDE_PASSES: true MAPPABLE_PRIMARY_BUFFERS: true TEXTURE_BINDING_ARRAY: true BUFFER_BINDING_ARRAY: true STORAGE_RESOURCE_BINDING_ARRAY: true SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING: true UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING: true PARTIALLY_BOUND_BINDING_ARRAY: true MULTI_DRAW_INDIRECT: true MULTI_DRAW_INDIRECT_COUNT: true PUSH_CONSTANTS: true ADDRESS_MODE_CLAMP_TO_ZERO: true ADDRESS_MODE_CLAMP_TO_BORDER: true POLYGON_MODE_LINE: true POLYGON_MODE_POINT: true CONSERVATIVE_RASTERIZATION: false VERTEX_WRITABLE_STORAGE: true CLEAR_TEXTURE: true SPIRV_SHADER_PASSTHROUGH: true MULTIVIEW: true VERTEX_ATTRIBUTE_64BIT: false SHADER_UNUSED_VERTEX_OUTPUT: true TEXTURE_FORMAT_NV12: false SHADER_F64: true SHADER_I16: true SHADER_PRIMITIVE_INDEX: true SHADER_EARLY_DEPTH_TEST: false DUAL_SOURCE_BLENDING: true Limits: Max Texture Dimension 1d: 16384 Max Texture Dimension 2d: 16384 Max Texture Dimension 3d: 4096 Max Texture Array Layers: 2048 Max Bind Groups: 8 Max Bindings Per Bind Group: 1000 Max Dynamic Uniform Buffers Per Pipeline Layout: 1000000 Max Dynamic Storage Buffers Per Pipeline Layout: 1000000 Max Sampled Textures Per Shader Stage: 1000000 Max Samplers Per Shader Stage: 1000000 Max Storage Buffers Per Shader Stage: 1000000 Max Storage Textures Per Shader Stage: 1000000 Max Uniform Buffers Per Shader Stage: 1000000 Max Uniform Buffer Binding Size: 65536 Max Storage Buffer Binding Size: 134217728 Max Buffer Size: 2147483647 Max Vertex Buffers: 16 Max Vertex Attributes: 32 Max Vertex Buffer Array Stride: 2048 Max Push Constant Size: 256 Min Uniform Buffer Offset Alignment: 32 Min Storage Buffer Offset Alignment: 32 Max Inter-Stage Shader Component: 128 Max Compute Workgroup Storage Size: 32768 Max Compute Invocations Per Workgroup: 1024 Max Compute Workgroup Size X: 1024 Max Compute Workgroup Size Y: 1024 Max Compute Workgroup Size Z: 1024 Max Compute Workgroups Per Dimension: 65535 Downlevel Properties: Shader Model: Sm5 COMPUTE_SHADERS: true FRAGMENT_WRITABLE_STORAGE: true INDIRECT_EXECUTION: true BASE_VERTEX: true READ_ONLY_DEPTH_STENCIL: true NON_POWER_OF_TWO_MIPMAPPED_TEXTURES: true CUBE_ARRAY_TEXTURES: true COMPARISON_SAMPLERS: true INDEPENDENT_BLEND: true VERTEX_STORAGE: true ANISOTROPIC_FILTERING: true FRAGMENT_STORAGE: true MULTISAMPLED_SHADING: true DEPTH_TEXTURE_AND_BUFFER_COPIES: true WEBGPU_TEXTURE_FORMAT_SUPPORT: true BUFFER_BINDINGS_NOT_16_BYTE_ALIGNED: true UNRESTRICTED_INDEX_BUFFER: true FULL_DRAW_INDEX_UINT32: true DEPTH_BIAS_CLAMP: true VIEW_FORMATS: true UNRESTRICTED_EXTERNAL_TEXTURE_COPIES: true SURFACE_VIEW_FORMATS: true NONBLOCKING_QUERY_RESOLVE: true VERTEX_AND_INSTANCE_INDEX_RESPECTS_RESPECTIVE_FIRST_VALUE_IN_INDIRECT_DRAW: true Texture Format Allowed Usages: ┌──────────┬──────────┬─────────────────┬─────────────────┬───────────────────┐ R8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgba8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Bgra8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Bgra8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb10a2Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgb10a2Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg11b10Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Stencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth32FloatStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24Plus: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24PlusStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb9e5Ufloat: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc1RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc1RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc2RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc2RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc3RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc3RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc4RUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc4RSnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc5RgUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc5RgSnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc6hRgbUfloat: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc6hRgbFloat: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc7RgbaUnorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc7RgbaUnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8Unorm: │ │ │ │ │ │ Etc2Rgb8UnormSrgb: │ │ │ │ │ │ Etc2Rgb8A1Unorm: │ │ │ │ │ │ Etc2Rgb8A1UnormSrgb: │ │ │ │ │ │ Etc2Rgba8Unorm: │ │ │ │ │ │ Etc2Rgba8UnormSrgb: │ │ │ │ │ │ EacR11Unorm: │ │ │ │ │ │ EacR11Snorm: │ │ │ │ │ │ EacRg11Unorm: │ │ │ │ │ │ EacRg11Snorm: │ │ │ │ │ │ AstcB4x4Unorm: │ │ │ │ │ │ AstcB4x4UnormSrgb: │ │ │ │ │ │ AstcB4x4Hdr: │ │ │ │ │ │ AstcB5x4Unorm: │ │ │ │ │ │ AstcB5x4UnormSrgb: │ │ │ │ │ │ AstcB5x4Hdr: │ │ │ │ │ │ AstcB5x5Unorm: │ │ │ │ │ │ AstcB5x5UnormSrgb: │ │ │ │ │ │ AstcB5x5Hdr: │ │ │ │ │ │ AstcB6x5Unorm: │ │ │ │ │ │ AstcB6x5UnormSrgb: │ │ │ │ │ │ AstcB6x5Hdr: │ │ │ │ │ │ AstcB6x6Unorm: │ │ │ │ │ │ AstcB6x6UnormSrgb: │ │ │ │ │ │ AstcB6x6Hdr: │ │ │ │ │ │ AstcB8x5Unorm: │ │ │ │ │ │ AstcB8x5UnormSrgb: │ │ │ │ │ │ AstcB8x5Hdr: │ │ │ │ │ │ AstcB8x6Unorm: │ │ │ │ │ │ AstcB8x6UnormSrgb: │ │ │ │ │ │ AstcB8x6Hdr: │ │ │ │ │ │ AstcB8x8Unorm: │ │ │ │ │ │ AstcB8x8UnormSrgb: │ │ │ │ │ │ AstcB8x8Hdr: │ │ │ │ │ │ AstcB10x5Unorm: │ │ │ │ │ │ AstcB10x5UnormSrgb: │ │ │ │ │ │ AstcB10x5Hdr: │ │ │ │ │ │ AstcB10x6Unorm: │ │ │ │ │ │ AstcB10x6UnormSrgb: │ │ │ │ │ │ AstcB10x6Hdr: │ │ │ │ │ │ AstcB10x8Unorm: │ │ │ │ │ │ AstcB10x8UnormSrgb: │ │ │ │ │ │ AstcB10x8Hdr: │ │ │ │ │ │ AstcB10x10Unorm: │ │ │ │ │ │ AstcB10x10UnormSrgb: │ │ │ │ │ │ AstcB10x10Hdr: │ │ │ │ │ │ AstcB12x10Unorm: │ │ │ │ │ │ AstcB12x10UnormSrgb: │ │ │ │ │ │ AstcB12x10Hdr: │ │ │ │ │ │ AstcB12x12Unorm: │ │ │ │ │ │ AstcB12x12UnormSrgb: │ │ │ │ │ │ AstcB12x12Hdr: │ │ │ │ │ │ └──────────┴──────────┴─────────────────┴─────────────────┴───────────────────┘ Texture Format Flags: ┌────────────┬────────────────┬────────────────┬────────────────┬─────────────────┬─────────────────────┬────────────────────┬───────────┐ R8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ R8Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R8Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R8Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ R16Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R16Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg8Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg8Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg8Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg16Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg16Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg16Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgba8Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba8Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba8Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Bgra8Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Bgra8UnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgb10a2Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgb10a2Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg11b10Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg32Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg32Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rg32Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba16Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba16Snorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba32Uint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Sint: │ │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Stencil8: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth16Unorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth32Float: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth32FloatStencil8: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth24Plus: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Depth24PlusStencil8: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rgb9e5Ufloat: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Bc1RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc1RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc2RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc2RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc3RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc3RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc4RUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc4RSnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc5RgUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc5RgSnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc6hRgbUfloat: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc6hRgbFloat: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc7RgbaUnorm: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ FILTERABLE │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8A1Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgb8A1UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgba8Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ Etc2Rgba8UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacR11Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacR11Snorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacRg11Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ EacRg11Snorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB4x4Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB4x4UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB4x4Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x4Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x4UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x4Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x5Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x5UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB5x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x5Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x5UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x6Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x6UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB6x6Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x5Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x5UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x6Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x6UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x6Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x8Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x8UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB8x8Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x5Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x5UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x5Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x6Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x6UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x6Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x8Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x8UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x8Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x10Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x10UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB10x10Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x10Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x10UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x10Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x12Unorm: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x12UnormSrgb: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ AstcB12x12Hdr: │ │ │ MULTISAMPLE_X4 │ │ │ │ │ │ └────────────┴────────────────┴────────────────┴────────────────┴─────────────────┴─────────────────────┴────────────────────┴───────────┘ Adapter 2: Backend: Gl Name: "V3D 4.2" VendorID: 5348 DeviceID: 0 Type: IntegratedGpu Driver: "" DriverInfo: "" Compliant: false Features: DEPTH_CLIP_CONTROL: false TIMESTAMP_QUERY: false INDIRECT_FIRST_INSTANCE: false SHADER_F16: false BGRA8UNORM_STORAGE: false RG11B10UFLOAT_RENDERABLE: false DEPTH32FLOAT_STENCIL8: false TEXTURE_COMPRESSION_BC: false TEXTURE_COMPRESSION_ETC2: true TEXTURE_COMPRESSION_ASTC: true TEXTURE_FORMAT_16BIT_NORM: false TEXTURE_COMPRESSION_ASTC_HDR: false TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES: true PIPELINE_STATISTICS_QUERY: false TIMESTAMP_QUERY_INSIDE_PASSES: false MAPPABLE_PRIMARY_BUFFERS: false TEXTURE_BINDING_ARRAY: false BUFFER_BINDING_ARRAY: false STORAGE_RESOURCE_BINDING_ARRAY: false SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING: false UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING: false PARTIALLY_BOUND_BINDING_ARRAY: false MULTI_DRAW_INDIRECT: false MULTI_DRAW_INDIRECT_COUNT: false PUSH_CONSTANTS: true ADDRESS_MODE_CLAMP_TO_ZERO: true ADDRESS_MODE_CLAMP_TO_BORDER: true POLYGON_MODE_LINE: false POLYGON_MODE_POINT: false CONSERVATIVE_RASTERIZATION: false VERTEX_WRITABLE_STORAGE: true CLEAR_TEXTURE: true SPIRV_SHADER_PASSTHROUGH: false MULTIVIEW: false VERTEX_ATTRIBUTE_64BIT: false SHADER_UNUSED_VERTEX_OUTPUT: true TEXTURE_FORMAT_NV12: false SHADER_F64: false SHADER_I16: false SHADER_PRIMITIVE_INDEX: false SHADER_EARLY_DEPTH_TEST: true DUAL_SOURCE_BLENDING: false Limits: Max Texture Dimension 1d: 4096 Max Texture Dimension 2d: 4096 Max Texture Dimension 3d: 4096 Max Texture Array Layers: 2048 Max Bind Groups: 8 Max Bindings Per Bind Group: 65535 Max Dynamic Uniform Buffers Per Pipeline Layout: 15 Max Dynamic Storage Buffers Per Pipeline Layout: 16 Max Sampled Textures Per Shader Stage: 16 Max Samplers Per Shader Stage: 16 Max Storage Buffers Per Shader Stage: 16 Max Storage Textures Per Shader Stage: 32 Max Uniform Buffers Per Shader Stage: 15 Max Uniform Buffer Binding Size: 65536 Max Storage Buffer Binding Size: 134217728 Max Buffer Size: 2147483647 Max Vertex Buffers: 16 Max Vertex Attributes: 16 Max Vertex Buffer Array Stride: 2048 Max Push Constant Size: 256 Min Uniform Buffer Offset Alignment: 256 Min Storage Buffer Offset Alignment: 32 Max Inter-Stage Shader Component: 64 Max Compute Workgroup Storage Size: 32768 Max Compute Invocations Per Workgroup: 256 Max Compute Workgroup Size X: 256 Max Compute Workgroup Size Y: 256 Max Compute Workgroup Size Z: 256 Max Compute Workgroups Per Dimension: 65535 Downlevel Properties: Shader Model: Sm5 COMPUTE_SHADERS: true FRAGMENT_WRITABLE_STORAGE: true INDIRECT_EXECUTION: true BASE_VERTEX: false READ_ONLY_DEPTH_STENCIL: false NON_POWER_OF_TWO_MIPMAPPED_TEXTURES: true CUBE_ARRAY_TEXTURES: true COMPARISON_SAMPLERS: true INDEPENDENT_BLEND: true VERTEX_STORAGE: true ANISOTROPIC_FILTERING: true FRAGMENT_STORAGE: true MULTISAMPLED_SHADING: false DEPTH_TEXTURE_AND_BUFFER_COPIES: false WEBGPU_TEXTURE_FORMAT_SUPPORT: false BUFFER_BINDINGS_NOT_16_BYTE_ALIGNED: true UNRESTRICTED_INDEX_BUFFER: true FULL_DRAW_INDEX_UINT32: false DEPTH_BIAS_CLAMP: false VIEW_FORMATS: false UNRESTRICTED_EXTERNAL_TEXTURE_COPIES: true SURFACE_VIEW_FORMATS: false NONBLOCKING_QUERY_RESOLVE: false VERTEX_AND_INSTANCE_INDEX_RESPECTS_RESPECTIVE_FIRST_VALUE_IN_INDIRECT_DRAW: true Texture Format Allowed Usages: ┌──────────┬──────────┬─────────────────┬─────────────────┬───────────────────┐ R8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ R8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R16Unorm: │ │ │ │ │ │ R16Snorm: │ │ │ │ │ │ R16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Rg8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ R32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ R32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rg16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg16Unorm: │ │ │ │ │ │ Rg16Snorm: │ │ │ │ │ │ Rg16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Rgba8Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba8Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Bgra8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Bgra8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb10a2Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb10a2Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg11b10Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rg32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgba16Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba16Unorm: │ │ │ │ │ │ Rgba16Snorm: │ │ │ │ │ │ Rgba16Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Uint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Sint: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Rgba32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ STORAGE_BINDING │ RENDER_ATTACHMENT │ Stencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth16Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth32Float: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth32FloatStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24Plus: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Depth24PlusStencil8: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ RENDER_ATTACHMENT │ Rgb9e5Ufloat: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Bc1RgbaUnorm: │ │ │ │ │ │ Bc1RgbaUnormSrgb: │ │ │ │ │ │ Bc2RgbaUnorm: │ │ │ │ │ │ Bc2RgbaUnormSrgb: │ │ │ │ │ │ Bc3RgbaUnorm: │ │ │ │ │ │ Bc3RgbaUnormSrgb: │ │ │ │ │ │ Bc4RUnorm: │ │ │ │ │ │ Bc4RSnorm: │ │ │ │ │ │ Bc5RgUnorm: │ │ │ │ │ │ Bc5RgSnorm: │ │ │ │ │ │ Bc6hRgbUfloat: │ │ │ │ │ │ Bc6hRgbFloat: │ │ │ │ │ │ Bc7RgbaUnorm: │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ │ │ │ │ │ Etc2Rgb8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8A1Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgb8A1UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgba8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ Etc2Rgba8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacR11Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacR11Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacRg11Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ EacRg11Snorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB4x4Hdr: │ │ │ │ │ │ AstcB5x4Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x4UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x4Hdr: │ │ │ │ │ │ AstcB5x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB5x5Hdr: │ │ │ │ │ │ AstcB6x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x5Hdr: │ │ │ │ │ │ AstcB6x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB6x6Hdr: │ │ │ │ │ │ AstcB8x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x5Hdr: │ │ │ │ │ │ AstcB8x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x6Hdr: │ │ │ │ │ │ AstcB8x8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB8x8Hdr: │ │ │ │ │ │ AstcB10x5Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x5UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x5Hdr: │ │ │ │ │ │ AstcB10x6Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x6UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x6Hdr: │ │ │ │ │ │ AstcB10x8Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x8UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x8Hdr: │ │ │ │ │ │ AstcB10x10Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x10UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB10x10Hdr: │ │ │ │ │ │ AstcB12x10Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x10UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x10Hdr: │ │ │ │ │ │ AstcB12x12Unorm: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x12UnormSrgb: │ COPY_SRC │ COPY_DST │ TEXTURE_BINDING │ │ │ AstcB12x12Hdr: │ │ │ │ │ │ └──────────┴──────────┴─────────────────┴─────────────────┴───────────────────┘ Texture Format Flags: ┌────────────┬────────────────┬────────────────┬────────────────┬─────────────────┬─────────────────────┬────────────────────┬───────────┐ R8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ R8Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ R8Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R8Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R16Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R16Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R16Unorm: │ │ │ │ │ │ │ │ │ R16Snorm: │ │ │ │ │ │ │ │ │ R16Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg8Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ Rg8Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg8Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ R32Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ R32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rg16Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg16Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg16Unorm: │ │ │ │ │ │ │ │ │ Rg16Snorm: │ │ │ │ │ │ │ │ │ Rg16Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgba8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8UnormSrgb: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba8Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ Rgba8Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba8Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Bgra8Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Bgra8UnormSrgb: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgb10a2Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rgb10a2Unorm: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg11b10Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rg32Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg32Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ │ Rg32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ │ BLENDABLE │ Rgba16Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba16Unorm: │ │ │ │ │ │ │ │ │ Rgba16Snorm: │ │ │ │ │ │ │ │ │ Rgba16Float: │ FILTERABLE │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Rgba32Uint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Sint: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ │ Rgba32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ MULTISAMPLE_RESOLVE │ STORAGE_READ_WRITE │ BLENDABLE │ Stencil8: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth16Unorm: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth32Float: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth32FloatStencil8: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth24Plus: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Depth24PlusStencil8: │ │ MULTISAMPLE_X2 │ MULTISAMPLE_X4 │ │ │ │ │ │ Rgb9e5Ufloat: │ FILTERABLE │ │ │ │ │ │ │ │ Bc1RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc1RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Bc2RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc2RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Bc3RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc3RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Bc4RUnorm: │ │ │ │ │ │ │ │ │ Bc4RSnorm: │ │ │ │ │ │ │ │ │ Bc5RgUnorm: │ │ │ │ │ │ │ │ │ Bc5RgSnorm: │ │ │ │ │ │ │ │ │ Bc6hRgbUfloat: │ │ │ │ │ │ │ │ │ Bc6hRgbFloat: │ │ │ │ │ │ │ │ │ Bc7RgbaUnorm: │ │ │ │ │ │ │ │ │ Bc7RgbaUnormSrgb: │ │ │ │ │ │ │ │ │ Etc2Rgb8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgb8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgb8A1Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgb8A1UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgba8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ Etc2Rgba8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ EacR11Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ EacR11Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ EacRg11Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ EacRg11Snorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB4x4Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB4x4UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB4x4Hdr: │ │ │ │ │ │ │ │ │ AstcB5x4Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x4UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x4Hdr: │ │ │ │ │ │ │ │ │ AstcB5x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB5x5Hdr: │ │ │ │ │ │ │ │ │ AstcB6x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x5Hdr: │ │ │ │ │ │ │ │ │ AstcB6x6Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x6UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB6x6Hdr: │ │ │ │ │ │ │ │ │ AstcB8x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x5Hdr: │ │ │ │ │ │ │ │ │ AstcB8x6Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x6UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x6Hdr: │ │ │ │ │ │ │ │ │ AstcB8x8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB8x8Hdr: │ │ │ │ │ │ │ │ │ AstcB10x5Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x5UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x5Hdr: │ │ │ │ │ │ │ │ │ AstcB10x6Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x6UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x6Hdr: │ │ │ │ │ │ │ │ │ AstcB10x8Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x8UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x8Hdr: │ │ │ │ │ │ │ │ │ AstcB10x10Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x10UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB10x10Hdr: │ │ │ │ │ │ │ │ │ AstcB12x10Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x10UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x10Hdr: │ │ │ │ │ │ │ │ │ AstcB12x12Unorm: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x12UnormSrgb: │ FILTERABLE │ │ │ │ │ │ │ │ AstcB12x12Hdr: │ │ │ │ │ │ │ │ │ └────────────┴────────────────┴────────────────┴────────────────┴─────────────────┴─────────────────────┴────────────────────┴───────────┘ ```
dskkato commented 10 months ago

Here is current test results on X11/OpenGL backend environment.

Test results ```sh ============================= test session starts ============================== platform linux -- Python 3.11.2, pytest-7.4.3, pluggy-1.3.0 -- /home/dskkato/workspace/wgpu-py/.venv/bin/python cachedir: .pytest_cache rootdir: /home/dskkato/workspace/wgpu-py collecting ... collected 120 items tests/test_api.py::test_basic_api PASSED [ 0%] tests/test_api.py::test_api_subpackages_are_there PASSED [ 1%] tests/test_api.py::test_logging PASSED [ 2%] tests/test_api.py::test_enums_and_flags_and_structs PASSED [ 3%] tests/test_api.py::test_base_wgpu_api PASSED [ 4%] tests/test_api.py::test_backend_is_selected_automatically PASSED [ 5%] tests/test_api.py::test_that_we_know_how_our_api_differs PASSED [ 5%] tests/test_api.py::test_that_all_docstrings_are_there PASSED [ 6%] tests/test_api.py::test_do_not_import_utils_submodules PASSED [ 7%] tests/test_api.py::test_register_backend_fails PASSED [ 8%] tests/test_diagnostics.py::test_diagnostics_meta PASSED [ 9%] tests/test_diagnostics.py::test_diagnostics_main PASSED [ 10%] tests/test_diagnostics.py::test_dict_to_text_simple PASSED [ 10%] tests/test_diagnostics.py::test_dict_to_text_table PASSED [ 11%] tests/test_diagnostics.py::test_dict_to_text_justification PASSED [ 12%] tests/test_diagnostics.py::test_dict_to_text_subdicts PASSED [ 13%] tests/test_diagnostics.py::test_dict_to_text_mix PASSED [ 14%] tests/test_diagnostics.py::test_object_tracker PASSED [ 15%] tests/test_diagnostics.py::test_int_repr PASSED [ 15%] tests/test_diagnostics.py::test_diagnostics_with_backends PASSED [ 16%] tests/test_diagnostics.py::test_texture_format_map_is_complete PASSED [ 17%] tests/test_gui_auto_offscreen.py::test_canvas_class PASSED [ 18%] tests/test_gui_auto_offscreen.py::test_event_loop PASSED [ 19%] tests/test_gui_auto_offscreen.py::test_offscreen_canvas_del PASSED [ 20%] tests/test_gui_base.py::test_base_canvas_context PASSED [ 20%] tests/test_gui_base.py::test_canvas_logging PASSED [ 21%] tests/test_gui_base.py::test_offscreen_canvas PASSED [ 22%] tests/test_gui_base.py::test_autogui_mixin PASSED [ 23%] tests/test_gui_base.py::test_weakbind PASSED [ 24%] tests/test_gui_glfw.py::test_is_autogui PASSED [ 25%] tests/test_gui_glfw.py::test_glfw_canvas_basics PASSED [ 25%] tests/test_gui_glfw.py::test_glfw_canvas_del PASSED [ 26%] tests/test_gui_glfw.py::test_glfw_canvas_render FAILED [ 27%] tests/test_gui_glfw.py::test_glfw_canvas_render_custom_canvas PASSED [ 28%] tests/test_util_compute.py::test_compute_0_1_ctype PASSED [ 29%] tests/test_util_compute.py::test_compute_0_1_tuple PASSED [ 30%] tests/test_util_compute.py::test_compute_0_1_str PASSED [ 30%] tests/test_util_compute.py::test_compute_0_1_int PASSED [ 31%] tests/test_util_compute.py::test_compute_0_1_spirv PASSED [ 32%] tests/test_util_compute.py::test_compute_1_3 PASSED [ 33%] tests/test_util_compute.py::test_compute_in_is_out PASSED [ 34%] tests/test_util_compute.py::test_compute_indirect PASSED [ 35%] tests/test_util_compute.py::test_compute_default_layout1 PASSED [ 35%] tests/test_util_compute.py::test_compute_default_layout2 PASSED [ 36%] tests/test_util_compute.py::test_compute_fails PASSED [ 37%] tests/test_util_core.py::test_error_message_hash PASSED [ 38%] tests/test_util_core.py::test_str_flag_to_int PASSED [ 39%] tests/test_util_shadertoy.py::test_shadertoy_wgsl PASSED [ 40%] tests/test_util_shadertoy.py::test_shadertoy_glsl PASSED [ 40%] tests/test_util_shadertoy.py::test_shadertoy_offscreen PASSED [ 41%] tests/test_util_shadertoy.py::test_shadertoy_snapshot PASSED [ 42%] tests/test_wgpu_native_basics.py::test_get_wgpu_version PASSED [ 43%] tests/test_wgpu_native_basics.py::test_override_wgpu_lib_path PASSED [ 44%] tests/test_wgpu_native_basics.py::test_tuple_from_tuple_or_dict PASSED [ 45%] tests/test_wgpu_native_basics.py::test_logging PASSED [ 45%] tests/test_wgpu_native_basics.py::test_wgpu_native_tracer PASSED [ 46%] tests/test_wgpu_native_basics.py::test_wgpu_native_enumerate_adapters PASSED [ 47%] tests/test_wgpu_native_basics.py::test_shader_module_creation_spirv PASSED [ 48%] tests/test_wgpu_native_basics.py::test_adapter_destroy PASSED [ 49%] tests/test_wgpu_native_basics.py::test_get_memoryview_and_address PASSED [ 50%] tests/test_wgpu_native_buffer.py::test_buffer_init1 PASSED [ 50%] tests/test_wgpu_native_buffer.py::test_buffer_init2 PASSED [ 51%] tests/test_wgpu_native_buffer.py::test_buffer_init3 PASSED [ 52%] tests/test_wgpu_native_buffer.py::test_consequitive_writes1 PASSED [ 53%] tests/test_wgpu_native_buffer.py::test_consequitive_writes2 PASSED [ 54%] tests/test_wgpu_native_buffer.py::test_consequitive_reads PASSED [ 55%] tests/test_wgpu_native_buffer.py::test_buffer_mapping_fails PASSED [ 55%] tests/test_wgpu_native_buffer.py::test_buffer_read_no_copy PASSED [ 56%] tests/test_wgpu_native_buffer.py::test_clear_buffer PASSED [ 57%] tests/test_wgpu_native_buffer.py::test_write_buffer1 PASSED [ 58%] tests/test_wgpu_native_buffer.py::test_write_buffer2 PASSED [ 59%] tests/test_wgpu_native_buffer.py::test_write_buffer3 PASSED [ 60%] tests/test_wgpu_native_buffer.py::test_buffer_map_read_and_write PASSED [ 60%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_1d_rgba8uint PASSED [ 61%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_1d_rgba16sint FAILED [ 62%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_1d_r32sint PASSED [ 63%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_1d_r32float PASSED [ 64%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_2d_rgba8uint PASSED [ 65%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_2d_rgba16sint FAILED [ 65%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_2d_r32sint PASSED [ 66%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_2d_r32float PASSED [ 67%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_rgba8uint FAILED [ 68%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_rgba16sint FAILED [ 69%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_r32sint FAILED [ 70%] tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_r32float FAILED [ 70%] tests/test_wgpu_native_errors.py::test_parse_shader_error1 PASSED [ 71%] tests/test_wgpu_native_errors.py::test_parse_shader_error2 PASSED [ 72%] tests/test_wgpu_native_errors.py::test_parse_shader_error3 PASSED [ 73%] tests/test_wgpu_native_errors.py::test_parse_shader_error4 PASSED [ 74%] tests/test_wgpu_native_errors.py::test_validate_shader_error1 PASSED [ 75%] tests/test_wgpu_native_errors.py::test_validate_shader_error2 PASSED [ 75%] tests/test_wgpu_native_render.py::test_render_orange_square PASSED [ 76%] tests/test_wgpu_native_render.py::test_render_orange_square_indexed PASSED [ 77%] tests/test_wgpu_native_render.py::test_render_orange_square_indirect PASSED [ 78%] tests/test_wgpu_native_render.py::test_render_orange_square_indexed_indirect PASSED [ 79%] tests/test_wgpu_native_render.py::test_render_orange_square_vbo PASSED [ 80%] tests/test_wgpu_native_render.py::test_render_orange_square_color_attachment1 PASSED [ 80%] tests/test_wgpu_native_render.py::test_render_orange_square_color_attachment2 PASSED [ 81%] tests/test_wgpu_native_render.py::test_render_orange_square_viewport PASSED [ 82%] tests/test_wgpu_native_render.py::test_render_orange_square_scissor PASSED [ 83%] tests/test_wgpu_native_render.py::test_render_orange_square_depth16unorm FAILED [ 84%] tests/test_wgpu_native_render.py::test_render_orange_square_depth24plus_stencil8 PASSED [ 85%] tests/test_wgpu_native_render.py::test_render_orange_square_depth32float PASSED [ 85%] tests/test_wgpu_native_render.py::test_render_orange_dots PASSED [ 86%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rgba8unorm PASSED [ 87%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rgba8uint PASSED [ 88%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rgba16sint FAILED [ 89%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rgba32float FAILED [ 90%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rg8unorm PASSED [ 90%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rg8uint PASSED [ 91%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rg16sint PASSED [ 92%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_rg32float FAILED [ 93%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_r8unorm PASSED [ 94%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_r8uint PASSED [ 95%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_r16sint PASSED [ 95%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_r32sint PASSED [ 96%] tests/test_wgpu_native_render_tex.py::test_render_textured_square_r32float PASSED [ 97%] tests/test_wgpu_native_texture.py::test_do_a_copy_roundtrip PASSED [ 98%] tests/test_wgpu_native_texture.py::test_write_texture1 PASSED [ 99%] tests/test_wgpu_native_texture.py::test_write_texture2 PASSED [100%] ``` =================================== FAILURES =================================== ___________________________ test_glfw_canvas_render ____________________________ def test_glfw_canvas_render(): """Render an orange square ... in a glfw window.""" import glfw from wgpu.gui.glfw import update_glfw_canvasses, WgpuCanvas loop = asyncio.get_event_loop() canvas = WgpuCanvas(max_fps=9999) device = wgpu.utils.get_default_device() draw_frame1 = _get_draw_function(device, canvas) frame_counter = 0 def draw_frame2(): nonlocal frame_counter frame_counter += 1 draw_frame1() canvas.request_draw(draw_frame2) # Give it a few rounds to start up async def miniloop(): for i in range(10): glfw.poll_events() update_glfw_canvasses() await asyncio.sleep(0.01) loop.run_until_complete(miniloop()) # There should have been exactly one draw now assert frame_counter == 1 # Ask for a lot of draws for i in range(5): canvas.request_draw() # Process evens for a while loop.run_until_complete(miniloop()) # We should have had just one draw assert frame_counter == 2 # Change the canvase size canvas.set_logical_size(300, 200) canvas.set_logical_size(400, 300) # We should have had just one draw loop.run_until_complete(miniloop()) > assert frame_counter == 3 E assert 5 == 3 tests/test_gui_glfw.py:151: AssertionError ________________________ test_compute_tex_1d_rgba16sint ________________________ def test_compute_tex_1d_rgba16sint(): compute_shader = """ @group(0) @binding(0) var r_tex1: texture_1d; @group(0) @binding(1) var r_tex2: texture_storage_1d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) index: vec3) { let i: i32 = i32(index.x); let color1 : vec4 = textureLoad(r_tex1, i, 0); let color2 = vec4(color1.x + i, color1.y + 1, color1.z * 2, color1.a); textureStore(r_tex2, i, color2); } """ # Generate data nx, ny, nz, nc = 128, 1, 1, 4 data1 = (ctypes.c_int16 * nc * nx)() for x in range(nx): for c in range(nc): data1[x][c] = random.randint(0, 20) # Compute and validate > _compute_texture( compute_shader, wgpu.TextureFormat.rgba16sint, wgpu.TextureDimension.d1, (nx, ny, nz, nc), data1, ) tests/test_wgpu_native_compute_tex.py:80: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_wgpu_native_compute_tex.py:522: in _compute_texture bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) wgpu/backends/wgpu_native/_api.py:1213: in create_bind_group id = libf.wgpuDeviceCreateBindGroup(self._internal, struct) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (, ) handle_error = > result = error_type = 'Validation' def proxy_func(*args): # Make the call, with error capturing on handle_error = self._handle_error self._error_handler.capture(handle_error) try: result = ob(*args) finally: self._error_handler.release(handle_error) # Handle the error. if self._error_message: error_type, message = self._error_message self._error_message = None cls = ERROR_TYPES.get(error_type, GPUError) wgpu_error = cls(message) # The line below will be the bottom line in the traceback, # so better make it informative! As far as I know there is # no way to exclude this frame from the traceback. > raise wgpu_error # the frame above is more interesting ↑↑ E wgpu._classes.GPUValidationError: Validation Error E E Caused by: E In wgpuDeviceCreateBindGroup E Texture binding 0 expects sample type = Sint, but given a view with format = Rgba16Uint wgpu/backends/wgpu_native/_helpers.py:314: GPUValidationError ________________________ test_compute_tex_2d_rgba16sint ________________________ def test_compute_tex_2d_rgba16sint(): compute_shader = """ @group(0) @binding(0) var r_tex1: texture_2d; @group(0) @binding(1) var r_tex2: texture_storage_2d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) index: vec3) { let i = vec2(index.xy); let color1: vec4 = textureLoad(r_tex1, i, 0); let color2 = vec4(color1.x + i.x, color1.y + 1, color1.z * 2, color1.a); textureStore(r_tex2, i, color2); } """ # Generate data nx, ny, nz, nc = 128, 8, 1, 4 data1 = (ctypes.c_int16 * nc * nx * ny)() for y in range(ny): for x in range(nx): for c in range(nc): data1[y][x][c] = random.randint(0, 20) # Compute and validate > _compute_texture( compute_shader, wgpu.TextureFormat.rgba16sint, wgpu.TextureDimension.d2, (nx, ny, nz, nc), data1, ) tests/test_wgpu_native_compute_tex.py:221: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_wgpu_native_compute_tex.py:522: in _compute_texture bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) wgpu/backends/wgpu_native/_api.py:1213: in create_bind_group id = libf.wgpuDeviceCreateBindGroup(self._internal, struct) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (, ) handle_error = > result = error_type = 'Validation' def proxy_func(*args): # Make the call, with error capturing on handle_error = self._handle_error self._error_handler.capture(handle_error) try: result = ob(*args) finally: self._error_handler.release(handle_error) # Handle the error. if self._error_message: error_type, message = self._error_message self._error_message = None cls = ERROR_TYPES.get(error_type, GPUError) wgpu_error = cls(message) # The line below will be the bottom line in the traceback, # so better make it informative! As far as I know there is # no way to exclude this frame from the traceback. > raise wgpu_error # the frame above is more interesting ↑↑ E wgpu._classes.GPUValidationError: Validation Error E E Caused by: E In wgpuDeviceCreateBindGroup E Texture binding 0 expects sample type = Sint, but given a view with format = Rgba16Uint wgpu/backends/wgpu_native/_helpers.py:314: GPUValidationError ________________________ test_compute_tex_3d_rgba8uint _________________________ def test_compute_tex_3d_rgba8uint(): compute_shader = """ @group(0) @binding(0) var r_tex1: texture_3d; @group(0) @binding(1) var r_tex2: texture_storage_3d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) index: vec3) { let i = vec3(index); let color1 = vec4(textureLoad(r_tex1, i, 0)); let color2 = vec4(color1.x + i.x, color1.y + 1, color1.z * 2, color1.a); textureStore(r_tex2, i, vec4(color2)); } """ # Generate data nx, ny, nz, nc = 64, 8, 6, 4 data1 = (ctypes.c_uint8 * nc * nx * ny * nz)() for z in range(nz): for y in range(ny): for x in range(nx): for c in range(nc): data1[z][y][x][c] = random.randint(0, 20) # Compute and validate > _compute_texture( compute_shader, wgpu.TextureFormat.rgba8uint, wgpu.TextureDimension.d3, (nx, ny, nz, nc), data1, ) tests/test_wgpu_native_compute_tex.py:330: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ compute_shader = '\n @group(0) @binding(0)\n var r_tex1: texture_3d;\n\n @group(0) @binding(1)\n var r... i.x, color1.y + 1, color1.z * 2, color1.a);\n textureStore(r_tex2, i, vec4(color2));\n }\n ' texture_format = 'rgba8uint', texture_dim = '3d', texture_size = (64, 8, 6, 4) data1 = def _compute_texture(compute_shader, texture_format, texture_dim, texture_size, data1): """ Apply a computation on a texture and validate the result. The shader should: * Add the x-coordinate to the red channel. * Add 1 to the green channel. * Multiply the blue channel by 2. * The alpha channel must remain equal. """ nx, ny, nz, nc = texture_size nbytes = ctypes.sizeof(data1) bpp = nbytes // (nx * ny * nz) # bytes per pixel device = get_default_device() cshader = device.create_shader_module(code=compute_shader) # Create textures and views texture1 = device.create_texture( size=(nx, ny, nz), dimension=texture_dim, format=texture_format, usage=wgpu.TextureUsage.TEXTURE_BINDING | wgpu.TextureUsage.COPY_DST, ) texture2 = device.create_texture( size=(nx, ny, nz), dimension=texture_dim, format=texture_format, usage=wgpu.TextureUsage.STORAGE_BINDING | wgpu.TextureUsage.COPY_SRC, ) texture_view1 = texture1.create_view() texture_view2 = texture2.create_view() # Create buffer that we need to upload the data buffer_usage = wgpu.BufferUsage.COPY_SRC | wgpu.BufferUsage.COPY_DST buffer = device.create_buffer_with_data(data=data1, usage=buffer_usage) assert buffer.usage == buffer_usage texture_sample_type = "unfilterable-float" if "uint" in texture_format: texture_sample_type = "uint" elif "sint" in texture_format: texture_sample_type = "sint" # Define bindings # One can see here why we need 2 textures: one is readonly, one writeonly bindings = [ {"binding": 0, "resource": texture_view1}, {"binding": 1, "resource": texture_view2}, ] binding_layouts = [ { "binding": 0, "visibility": wgpu.ShaderStage.COMPUTE, "texture": { "sample_type": texture_sample_type, "view_dimension": texture_dim, }, }, { "binding": 1, "visibility": wgpu.ShaderStage.COMPUTE, "storage_texture": { "access": wgpu.StorageTextureAccess.write_only, "format": texture_format, "view_dimension": texture_dim, }, }, ] bind_group_layout = device.create_bind_group_layout(entries=binding_layouts) pipeline_layout = device.create_pipeline_layout( bind_group_layouts=[bind_group_layout] ) bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) # Create a pipeline and run it compute_pipeline = device.create_compute_pipeline( layout=pipeline_layout, compute={"module": cshader, "entry_point": "main"}, ) command_encoder = device.create_command_encoder() if False: # Upload via alt route (that does not have 256 alignment constraint) device.queue.write_texture( {"texture": texture1}, data1, {"bytes_per_row": bpp * nx, "rows_per_image": ny}, (nx, ny, nz), ) else: command_encoder.copy_buffer_to_texture( { "buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": ny, }, {"texture": texture1, "mip_level": 0, "origin": (0, 0, 0)}, (nx, ny, nz), ) compute_pass = command_encoder.begin_compute_pass() compute_pass.push_debug_group("foo") compute_pass.insert_debug_marker("setting pipeline") compute_pass.set_pipeline(compute_pipeline) compute_pass.insert_debug_marker("setting bind group") compute_pass.set_bind_group( 0, bind_group, [], 0, 999999 ) # last 2 elements not used compute_pass.insert_debug_marker("dispatch!") compute_pass.dispatch_workgroups(nx, ny, nz) compute_pass.pop_debug_group() compute_pass.end() command_encoder.copy_texture_to_buffer( {"texture": texture2, "mip_level": 0, "origin": (0, 0, 0)}, { "buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": ny, }, (nx, ny, nz), ) device.queue.submit([command_encoder.finish()]) # Read the current data of the output buffer data2 = data1.__class__.from_buffer(device.queue.read_buffer(buffer)) # Numpy arrays are easier to work with a1 = np.ctypeslib.as_array(data1).reshape(nz, ny, nx, nc) a2 = np.ctypeslib.as_array(data2).reshape(nz, ny, nx, nc) # Validate! for x in range(nx): > assert np.all(a2[:, :, x, 0] == a1[:, :, x, 0] + x) E AssertionError: assert False E + where False = (array([[ 2, 1..., dtype=uint8) == array([[ 2, 1..., dtype=uint8) E + where = np.all E Full diff: E array([[ 2, 15, 0, 20, 20, 11, 18, 4], E - [14, 0, 18, 11, 17, 1, 4, 11], E - [ 4, 17, 14, 6, 20, 15, 5, 16], E - [12, 10, 10, 20, 11, 8, 18, 9], E ? ^ ---- ---- ^ E + [ 2, 15, 0, 20, 20, 11, 18, 4],... E E ...Full output truncated (8 lines hidden), use '-vv' to show) tests/test_wgpu_native_compute_tex.py:582: AssertionError ________________________ test_compute_tex_3d_rgba16sint ________________________ def test_compute_tex_3d_rgba16sint(): compute_shader = """ @group(0) @binding(0) var r_tex1: texture_3d; @group(0) @binding(1) var r_tex2: texture_storage_3d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) index: vec3) { let i = vec3(index); let color1: vec4 = textureLoad(r_tex1, i, 0); let color2 = vec4(color1.x + i.x, color1.y + 1, color1.z * 2, color1.a); textureStore(r_tex2, i, color2); } """ # Generate data nx, ny, nz, nc = 128, 8, 6, 4 data1 = (ctypes.c_int16 * nc * nx * ny * nz)() for z in range(nz): for y in range(ny): for x in range(nx): for c in range(nc): data1[z][y][x][c] = random.randint(0, 20) # Compute and validate > _compute_texture( compute_shader, wgpu.TextureFormat.rgba16sint, wgpu.TextureDimension.d3, (nx, ny, nz, nc), data1, ) tests/test_wgpu_native_compute_tex.py:366: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_wgpu_native_compute_tex.py:522: in _compute_texture bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) wgpu/backends/wgpu_native/_api.py:1213: in create_bind_group id = libf.wgpuDeviceCreateBindGroup(self._internal, struct) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (, ) handle_error = > result = error_type = 'Validation' def proxy_func(*args): # Make the call, with error capturing on handle_error = self._handle_error self._error_handler.capture(handle_error) try: result = ob(*args) finally: self._error_handler.release(handle_error) # Handle the error. if self._error_message: error_type, message = self._error_message self._error_message = None cls = ERROR_TYPES.get(error_type, GPUError) wgpu_error = cls(message) # The line below will be the bottom line in the traceback, # so better make it informative! As far as I know there is # no way to exclude this frame from the traceback. > raise wgpu_error # the frame above is more interesting ↑↑ E wgpu._classes.GPUValidationError: Validation Error E E Caused by: E In wgpuDeviceCreateBindGroup E Texture binding 0 expects sample type = Sint, but given a view with format = Rgba16Uint wgpu/backends/wgpu_native/_helpers.py:314: GPUValidationError _________________________ test_compute_tex_3d_r32sint __________________________ def test_compute_tex_3d_r32sint(): compute_shader = """ @group(0) @binding(0) var r_tex1: texture_3d; @group(0) @binding(1) var r_tex2: texture_storage_3d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) index: vec3) { let i = vec3(index); let color1: vec4 = textureLoad(r_tex1, i, 0); let color2 = vec4(color1.x + i.x, color1.y + 1, color1.z * 2, color1.a); textureStore(r_tex2, i, color2); } """ # Generate data nx, ny, nz, nc = 256, 8, 6, 1 data1 = (ctypes.c_int32 * nc * nx * ny * nz)() for z in range(nz): for y in range(ny): for x in range(nx): for c in range(nc): data1[z][y][x][c] = random.randint(0, 20) # Compute and validate > _compute_texture( compute_shader, wgpu.TextureFormat.r32sint, wgpu.TextureDimension.d3, (nx, ny, nz, nc), data1, ) tests/test_wgpu_native_compute_tex.py:402: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ compute_shader = '\n @group(0) @binding(0)\n var r_tex1: texture_3d;\n\n @group(0) @binding(1)\n var r...(color1.x + i.x, color1.y + 1, color1.z * 2, color1.a);\n textureStore(r_tex2, i, color2);\n }\n ' texture_format = 'r32sint', texture_dim = '3d', texture_size = (256, 8, 6, 1) data1 = def _compute_texture(compute_shader, texture_format, texture_dim, texture_size, data1): """ Apply a computation on a texture and validate the result. The shader should: * Add the x-coordinate to the red channel. * Add 1 to the green channel. * Multiply the blue channel by 2. * The alpha channel must remain equal. """ nx, ny, nz, nc = texture_size nbytes = ctypes.sizeof(data1) bpp = nbytes // (nx * ny * nz) # bytes per pixel device = get_default_device() cshader = device.create_shader_module(code=compute_shader) # Create textures and views texture1 = device.create_texture( size=(nx, ny, nz), dimension=texture_dim, format=texture_format, usage=wgpu.TextureUsage.TEXTURE_BINDING | wgpu.TextureUsage.COPY_DST, ) texture2 = device.create_texture( size=(nx, ny, nz), dimension=texture_dim, format=texture_format, usage=wgpu.TextureUsage.STORAGE_BINDING | wgpu.TextureUsage.COPY_SRC, ) texture_view1 = texture1.create_view() texture_view2 = texture2.create_view() # Create buffer that we need to upload the data buffer_usage = wgpu.BufferUsage.COPY_SRC | wgpu.BufferUsage.COPY_DST buffer = device.create_buffer_with_data(data=data1, usage=buffer_usage) assert buffer.usage == buffer_usage texture_sample_type = "unfilterable-float" if "uint" in texture_format: texture_sample_type = "uint" elif "sint" in texture_format: texture_sample_type = "sint" # Define bindings # One can see here why we need 2 textures: one is readonly, one writeonly bindings = [ {"binding": 0, "resource": texture_view1}, {"binding": 1, "resource": texture_view2}, ] binding_layouts = [ { "binding": 0, "visibility": wgpu.ShaderStage.COMPUTE, "texture": { "sample_type": texture_sample_type, "view_dimension": texture_dim, }, }, { "binding": 1, "visibility": wgpu.ShaderStage.COMPUTE, "storage_texture": { "access": wgpu.StorageTextureAccess.write_only, "format": texture_format, "view_dimension": texture_dim, }, }, ] bind_group_layout = device.create_bind_group_layout(entries=binding_layouts) pipeline_layout = device.create_pipeline_layout( bind_group_layouts=[bind_group_layout] ) bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) # Create a pipeline and run it compute_pipeline = device.create_compute_pipeline( layout=pipeline_layout, compute={"module": cshader, "entry_point": "main"}, ) command_encoder = device.create_command_encoder() if False: # Upload via alt route (that does not have 256 alignment constraint) device.queue.write_texture( {"texture": texture1}, data1, {"bytes_per_row": bpp * nx, "rows_per_image": ny}, (nx, ny, nz), ) else: command_encoder.copy_buffer_to_texture( { "buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": ny, }, {"texture": texture1, "mip_level": 0, "origin": (0, 0, 0)}, (nx, ny, nz), ) compute_pass = command_encoder.begin_compute_pass() compute_pass.push_debug_group("foo") compute_pass.insert_debug_marker("setting pipeline") compute_pass.set_pipeline(compute_pipeline) compute_pass.insert_debug_marker("setting bind group") compute_pass.set_bind_group( 0, bind_group, [], 0, 999999 ) # last 2 elements not used compute_pass.insert_debug_marker("dispatch!") compute_pass.dispatch_workgroups(nx, ny, nz) compute_pass.pop_debug_group() compute_pass.end() command_encoder.copy_texture_to_buffer( {"texture": texture2, "mip_level": 0, "origin": (0, 0, 0)}, { "buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": ny, }, (nx, ny, nz), ) device.queue.submit([command_encoder.finish()]) # Read the current data of the output buffer data2 = data1.__class__.from_buffer(device.queue.read_buffer(buffer)) # Numpy arrays are easier to work with a1 = np.ctypeslib.as_array(data1).reshape(nz, ny, nx, nc) a2 = np.ctypeslib.as_array(data2).reshape(nz, ny, nx, nc) # Validate! for x in range(nx): > assert np.all(a2[:, :, x, 0] == a1[:, :, x, 0] + x) E AssertionError: assert False E + where False = (array([[20, ..., dtype=int32) == array([[20, ..., dtype=int32) E + where = np.all E Full diff: E array([[20, 7, 17, 13, 7, 15, 1, 2], E - [10, 2, 17, 14, 8, 2, 17, 15], E - [19, 10, 14, 5, 20, 10, 19, 15], E - [12, 2, 10, 15, 16, 19, 12, 9], E - [14, 7, 9, 15, 1, 7, 8, 7], E + [20, 7, 17, 13, 7, 15, 1, 2],... E E ...Full output truncated (8 lines hidden), use '-vv' to show) tests/test_wgpu_native_compute_tex.py:582: AssertionError _________________________ test_compute_tex_3d_r32float _________________________ def test_compute_tex_3d_r32float(): compute_shader = """ @group(0) @binding(0) var r_tex1: texture_3d; @group(0) @binding(1) var r_tex2: texture_storage_3d; @compute @workgroup_size(1) fn main(@builtin(global_invocation_id) index: vec3) { let i = vec3(index); let color1: vec4 = textureLoad(r_tex1, i, 0); let color2 = vec4(color1.x + f32(i.x), color1.y + 1.0, color1.z * 2.0, color1.a); textureStore(r_tex2, i, color2); } """ # Generate data nx, ny, nz, nc = 64, 8, 6, 1 data1 = (ctypes.c_float * nc * nx * ny * nz)() for z in range(nz): for y in range(ny): for x in range(nx): for c in range(nc): data1[z][y][x][c] = random.randint(0, 20) # Compute and validate > _compute_texture( compute_shader, wgpu.TextureFormat.r32float, wgpu.TextureDimension.d3, (nx, ny, nz, nc), data1, ) tests/test_wgpu_native_compute_tex.py:438: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ compute_shader = '\n @group(0) @binding(0)\n var r_tex1: texture_3d;\n\n @group(0) @binding(1)\n var r... + f32(i.x), color1.y + 1.0, color1.z * 2.0, color1.a);\n textureStore(r_tex2, i, color2);\n }\n ' texture_format = 'r32float', texture_dim = '3d', texture_size = (64, 8, 6, 1) data1 = def _compute_texture(compute_shader, texture_format, texture_dim, texture_size, data1): """ Apply a computation on a texture and validate the result. The shader should: * Add the x-coordinate to the red channel. * Add 1 to the green channel. * Multiply the blue channel by 2. * The alpha channel must remain equal. """ nx, ny, nz, nc = texture_size nbytes = ctypes.sizeof(data1) bpp = nbytes // (nx * ny * nz) # bytes per pixel device = get_default_device() cshader = device.create_shader_module(code=compute_shader) # Create textures and views texture1 = device.create_texture( size=(nx, ny, nz), dimension=texture_dim, format=texture_format, usage=wgpu.TextureUsage.TEXTURE_BINDING | wgpu.TextureUsage.COPY_DST, ) texture2 = device.create_texture( size=(nx, ny, nz), dimension=texture_dim, format=texture_format, usage=wgpu.TextureUsage.STORAGE_BINDING | wgpu.TextureUsage.COPY_SRC, ) texture_view1 = texture1.create_view() texture_view2 = texture2.create_view() # Create buffer that we need to upload the data buffer_usage = wgpu.BufferUsage.COPY_SRC | wgpu.BufferUsage.COPY_DST buffer = device.create_buffer_with_data(data=data1, usage=buffer_usage) assert buffer.usage == buffer_usage texture_sample_type = "unfilterable-float" if "uint" in texture_format: texture_sample_type = "uint" elif "sint" in texture_format: texture_sample_type = "sint" # Define bindings # One can see here why we need 2 textures: one is readonly, one writeonly bindings = [ {"binding": 0, "resource": texture_view1}, {"binding": 1, "resource": texture_view2}, ] binding_layouts = [ { "binding": 0, "visibility": wgpu.ShaderStage.COMPUTE, "texture": { "sample_type": texture_sample_type, "view_dimension": texture_dim, }, }, { "binding": 1, "visibility": wgpu.ShaderStage.COMPUTE, "storage_texture": { "access": wgpu.StorageTextureAccess.write_only, "format": texture_format, "view_dimension": texture_dim, }, }, ] bind_group_layout = device.create_bind_group_layout(entries=binding_layouts) pipeline_layout = device.create_pipeline_layout( bind_group_layouts=[bind_group_layout] ) bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) # Create a pipeline and run it compute_pipeline = device.create_compute_pipeline( layout=pipeline_layout, compute={"module": cshader, "entry_point": "main"}, ) command_encoder = device.create_command_encoder() if False: # Upload via alt route (that does not have 256 alignment constraint) device.queue.write_texture( {"texture": texture1}, data1, {"bytes_per_row": bpp * nx, "rows_per_image": ny}, (nx, ny, nz), ) else: command_encoder.copy_buffer_to_texture( { "buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": ny, }, {"texture": texture1, "mip_level": 0, "origin": (0, 0, 0)}, (nx, ny, nz), ) compute_pass = command_encoder.begin_compute_pass() compute_pass.push_debug_group("foo") compute_pass.insert_debug_marker("setting pipeline") compute_pass.set_pipeline(compute_pipeline) compute_pass.insert_debug_marker("setting bind group") compute_pass.set_bind_group( 0, bind_group, [], 0, 999999 ) # last 2 elements not used compute_pass.insert_debug_marker("dispatch!") compute_pass.dispatch_workgroups(nx, ny, nz) compute_pass.pop_debug_group() compute_pass.end() command_encoder.copy_texture_to_buffer( {"texture": texture2, "mip_level": 0, "origin": (0, 0, 0)}, { "buffer": buffer, "offset": 0, "bytes_per_row": bpp * nx, "rows_per_image": ny, }, (nx, ny, nz), ) device.queue.submit([command_encoder.finish()]) # Read the current data of the output buffer data2 = data1.__class__.from_buffer(device.queue.read_buffer(buffer)) # Numpy arrays are easier to work with a1 = np.ctypeslib.as_array(data1).reshape(nz, ny, nx, nc) a2 = np.ctypeslib.as_array(data2).reshape(nz, ny, nx, nc) # Validate! for x in range(nx): > assert np.all(a2[:, :, x, 0] == a1[:, :, x, 0] + x) E AssertionError: assert False E + where False = (array([[ 7., ...dtype=float32) == array([[ 7., ...dtype=float32) E + where = np.all E Full diff: E array([[ 7., 3., 3., 15., 15., 0., 18., 5.], E - [18., 1., 19., 15., 7., 20., 16., 9.], E - [16., 2., 18., 1., 7., 19., 17., 13.], E - [16., 12., 9., 18., 4., 13., 2., 17.], E - [ 6., 4., 18., 15., 1., 14., 10., 16.], E - [16., 10., 19., 19., 16., 19., 1., 16.]], dtype=float32,... E E ...Full output truncated (6 lines hidden), use '-vv' to show) tests/test_wgpu_native_compute_tex.py:582: AssertionError ____________________ test_render_orange_square_depth16unorm ____________________ def test_render_orange_square_depth16unorm(): """Render an orange square, but disable half of it using a depth test using 16 bits.""" > _render_orange_square_depth(wgpu.TextureFormat.depth16unorm) tests/test_wgpu_native_render.py:453: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_wgpu_native_render.py:539: in _render_orange_square_depth a = render_to_texture( tests/renderutils.py:103: in render_to_texture render_pipeline = device.create_render_pipeline( wgpu/backends/wgpu_native/_api.py:1572: in create_render_pipeline id = libf.wgpuDeviceCreateRenderPipeline(self._internal, struct) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (, ) handle_error = > result = error_type = 'Validation' def proxy_func(*args): # Make the call, with error capturing on handle_error = self._handle_error self._error_handler.capture(handle_error) try: result = ob(*args) finally: self._error_handler.release(handle_error) # Handle the error. if self._error_message: error_type, message = self._error_message self._error_message = None cls = ERROR_TYPES.get(error_type, GPUError) wgpu_error = cls(message) # The line below will be the bottom line in the traceback, # so better make it informative! As far as I know there is # no way to exclude this frame from the traceback. > raise wgpu_error # the frame above is more interesting ↑↑ E wgpu._classes.GPUValidationError: Validation Error E E Caused by: E In wgpuDeviceCreateRenderPipeline E Depth/stencil state is invalid E Format Stencil8 does not have a depth aspect, but depth test/write is enabled wgpu/backends/wgpu_native/_helpers.py:314: GPUValidationError ____________________ test_render_textured_square_rgba16sint ____________________ def test_render_textured_square_rgba16sint(): """Test a texture with format rgba16sint.""" fragment_shader = """ @group(0) @binding(0) var r_tex: texture_2d; @group(0) @binding(1) var r_sampler: sampler; @fragment fn fs_main(in: VertexOutput, ) -> @location(0) vec4 { // let sample = textureSample(r_tex, r_sampler, in.texcoord); let texcoords_u = vec2(in.texcoord * vec2(textureDimensions(r_tex))); let sample = textureLoad(r_tex, texcoords_u, 0); return vec4(sample) / 255.0; } """ # Create texture data nx, ny, nz = 256, 256, 1 x = _create_data( (50, 50, 0, 255), (100, 100, 0, 255), (150, 150, 0, 255), (200, 200, 0, 255) ) texture_data = (ctypes.c_int16 * (4 * nx * ny))(*x) # Render and validate > render_textured_square( fragment_shader, wgpu.TextureFormat.rgba16sint, (nx, ny, nz), texture_data ) tests/test_wgpu_native_render_tex.py:148: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_wgpu_native_render_tex.py:529: in render_textured_square bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) wgpu/backends/wgpu_native/_api.py:1213: in create_bind_group id = libf.wgpuDeviceCreateBindGroup(self._internal, struct) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (, ) handle_error = > result = error_type = 'Validation' def proxy_func(*args): # Make the call, with error capturing on handle_error = self._handle_error self._error_handler.capture(handle_error) try: result = ob(*args) finally: self._error_handler.release(handle_error) # Handle the error. if self._error_message: error_type, message = self._error_message self._error_message = None cls = ERROR_TYPES.get(error_type, GPUError) wgpu_error = cls(message) # The line below will be the bottom line in the traceback, # so better make it informative! As far as I know there is # no way to exclude this frame from the traceback. > raise wgpu_error # the frame above is more interesting ↑↑ E wgpu._classes.GPUValidationError: Validation Error E E Caused by: E In wgpuDeviceCreateBindGroup E Texture binding 0 expects sample type = Sint, but given a view with format = Rgba16Uint wgpu/backends/wgpu_native/_helpers.py:314: GPUValidationError ___________________ test_render_textured_square_rgba32float ____________________ def test_render_textured_square_rgba32float(): """Test a texture with format rgba32float.""" fragment_shader = """ @group(0) @binding(0) var r_tex: texture_2d; @group(0) @binding(1) var r_sampler: sampler; @fragment fn fs_main(in: VertexOutput, ) -> @location(0) vec4 { let sample = textureSample(r_tex, r_sampler, in.texcoord); return sample / 255.0; } """ # Create texture data nx, ny, nz = 256, 256, 1 x = _create_data( (50, 50, 0, 255), (100, 100, 0, 255), (150, 150, 0, 255), (200, 200, 0, 255) ) texture_data = (ctypes.c_float * (4 * nx * ny))(*x) # Render and validate > render_textured_square( fragment_shader, wgpu.TextureFormat.rgba32float, (nx, ny, nz), texture_data ) tests/test_wgpu_native_render_tex.py:177: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ fragment_shader = '\n @group(0) @binding(0)\n var r_tex: texture_2d;\n @group(0) @binding(1)\n var r_sa... let sample = textureSample(r_tex, r_sampler, in.texcoord);\n return sample / 255.0;\n }\n ' texture_format = 'rgba32float', texture_size = (256, 256, 1) texture_data = def render_textured_square(fragment_shader, texture_format, texture_size, texture_data): """Render, and test the result. The resulting image must be a gradient on R and B, zeros on G and ones on A. """ nx, ny, nz = texture_size device = get_default_device() shader_source = default_vertex_shader + fragment_shader # Create texture texture = device.create_texture( size=(nx, ny, nz), dimension=wgpu.TextureDimension.d2, format=texture_format, usage=wgpu.TextureUsage.TEXTURE_BINDING | wgpu.TextureUsage.COPY_DST, ) upload_to_texture(device, texture, texture_data, nx, ny, nz) texture_view = texture.create_view() # or: texture_view = texture.create_view( format=texture_format, dimension=wgpu.TextureDimension.d2, ) sampler = device.create_sampler(mag_filter="nearest", min_filter="nearest") # Default sampler type. # Note that integer texture types cannot even use a sampler. sampler_type = wgpu.SamplerBindingType.filtering # Determine texture component type from the format if texture_format.endswith("norm"): # We can use a filtering sampler texture_sample_type = wgpu.TextureSampleType.float elif texture_format.endswith("float"): # On Vanilla wgpu, float32 textures cannot use a filtering # (interpolating) texture, (need to enable a feature for that). # Without it, we need to use a non-filterin sampler. texture_sample_type = wgpu.TextureSampleType.unfilterable_float sampler_type = wgpu.SamplerBindingType.non_filtering elif "uint" in texture_format: # Cannot even use a sampler (use textureLoad instwad of textureSample) texture_sample_type = wgpu.TextureSampleType.uint else: # Dito texture_sample_type = wgpu.TextureSampleType.sint # Bindings and layout bindings = [ {"binding": 0, "resource": texture_view}, {"binding": 1, "resource": sampler}, ] binding_layouts = [ { "binding": 0, "visibility": wgpu.ShaderStage.FRAGMENT, "texture": { "sample_type": texture_sample_type, "view_dimension": wgpu.TextureViewDimension.d2, }, }, { "binding": 1, "visibility": wgpu.ShaderStage.FRAGMENT, "sampler": { "type": sampler_type, }, }, ] bind_group_layout = device.create_bind_group_layout(entries=binding_layouts) pipeline_layout = device.create_pipeline_layout( bind_group_layouts=[bind_group_layout] ) bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) # Render render_args = device, shader_source, pipeline_layout, bind_group # render_to_screen(*render_args) a = render_to_texture(*render_args, size=(64, 64)) # print(a.max(), a[:,:,0].max()) # Check that the background is all zero bg = a.copy() bg[16:-16, 16:-16, :] = 0 assert np.all(bg == 0) # Check the square sq = a[16:-16, 16:-16, :] ref1 = [ [150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150], [150, 150, 150, 200, 200, 200], [200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200], ] ref2 = [ [150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150], [150, 150, 150, 50, 50, 50], [50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50], ] ref1, ref2 = sum(ref1, []), sum(ref2, []) > assert np.allclose(sq[0, :, 0], ref1, atol=1) E assert False E + where False = (array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8), [150, 150, 150, 150, 150, 150, ...], atol=1) E + where = np.allclose tests/test_wgpu_native_render_tex.py:557: AssertionError ____________________ test_render_textured_square_rg32float _____________________ def test_render_textured_square_rg32float(): """Test a texture with format rg32float. The GPU considers blue to be 0 and alpha to be 1. """ fragment_shader = """ @group(0) @binding(0) var r_tex: texture_2d; @group(0) @binding(1) var r_sampler: sampler; @fragment fn fs_main(in: VertexOutput, ) -> @location(0) vec4 { let sample = textureSample(r_tex, r_sampler, in.texcoord); return vec4(sample.rg / 255.0, 0.0, 1.0); } """ # Create texture data nx, ny, nz = 256, 256, 1 x = _create_data((50, 50), (100, 100), (150, 150), (200, 200)) texture_data = (ctypes.c_float * (2 * nx * ny))(*x) # Render and validate > render_textured_square( fragment_shader, wgpu.TextureFormat.rg32float, (nx, ny, nz), texture_data ) tests/test_wgpu_native_render_tex.py:300: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ fragment_shader = '\n @group(0) @binding(0)\n var r_tex: texture_2d;\n @group(0) @binding(1)\n var r_sa...ureSample(r_tex, r_sampler, in.texcoord);\n return vec4(sample.rg / 255.0, 0.0, 1.0);\n }\n ' texture_format = 'rg32float', texture_size = (256, 256, 1) texture_data = def render_textured_square(fragment_shader, texture_format, texture_size, texture_data): """Render, and test the result. The resulting image must be a gradient on R and B, zeros on G and ones on A. """ nx, ny, nz = texture_size device = get_default_device() shader_source = default_vertex_shader + fragment_shader # Create texture texture = device.create_texture( size=(nx, ny, nz), dimension=wgpu.TextureDimension.d2, format=texture_format, usage=wgpu.TextureUsage.TEXTURE_BINDING | wgpu.TextureUsage.COPY_DST, ) upload_to_texture(device, texture, texture_data, nx, ny, nz) texture_view = texture.create_view() # or: texture_view = texture.create_view( format=texture_format, dimension=wgpu.TextureDimension.d2, ) sampler = device.create_sampler(mag_filter="nearest", min_filter="nearest") # Default sampler type. # Note that integer texture types cannot even use a sampler. sampler_type = wgpu.SamplerBindingType.filtering # Determine texture component type from the format if texture_format.endswith("norm"): # We can use a filtering sampler texture_sample_type = wgpu.TextureSampleType.float elif texture_format.endswith("float"): # On Vanilla wgpu, float32 textures cannot use a filtering # (interpolating) texture, (need to enable a feature for that). # Without it, we need to use a non-filterin sampler. texture_sample_type = wgpu.TextureSampleType.unfilterable_float sampler_type = wgpu.SamplerBindingType.non_filtering elif "uint" in texture_format: # Cannot even use a sampler (use textureLoad instwad of textureSample) texture_sample_type = wgpu.TextureSampleType.uint else: # Dito texture_sample_type = wgpu.TextureSampleType.sint # Bindings and layout bindings = [ {"binding": 0, "resource": texture_view}, {"binding": 1, "resource": sampler}, ] binding_layouts = [ { "binding": 0, "visibility": wgpu.ShaderStage.FRAGMENT, "texture": { "sample_type": texture_sample_type, "view_dimension": wgpu.TextureViewDimension.d2, }, }, { "binding": 1, "visibility": wgpu.ShaderStage.FRAGMENT, "sampler": { "type": sampler_type, }, }, ] bind_group_layout = device.create_bind_group_layout(entries=binding_layouts) pipeline_layout = device.create_pipeline_layout( bind_group_layouts=[bind_group_layout] ) bind_group = device.create_bind_group(layout=bind_group_layout, entries=bindings) # Render render_args = device, shader_source, pipeline_layout, bind_group # render_to_screen(*render_args) a = render_to_texture(*render_args, size=(64, 64)) # print(a.max(), a[:,:,0].max()) # Check that the background is all zero bg = a.copy() bg[16:-16, 16:-16, :] = 0 assert np.all(bg == 0) # Check the square sq = a[16:-16, 16:-16, :] ref1 = [ [150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150], [150, 150, 150, 200, 200, 200], [200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200], ] ref2 = [ [150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150], [150, 150, 150, 50, 50, 50], [50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50], ] ref1, ref2 = sum(ref1, []), sum(ref2, []) > assert np.allclose(sq[0, :, 0], ref1, atol=1) E assert False E + where False = (array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8), [150, 150, 150, 150, 150, 150, ...], atol=1) E + where = np.allclose tests/test_wgpu_native_render_tex.py:557: AssertionError ```sh =========================== short test summary info ============================ FAILED tests/test_gui_glfw.py::test_glfw_canvas_render - assert 5 == 3 FAILED tests/test_wgpu_native_compute_tex.py::test_compute_tex_1d_rgba16sint - wgpu._classes.GPUValidationError: Validation Error FAILED tests/test_wgpu_native_compute_tex.py::test_compute_tex_2d_rgba16sint - wgpu._classes.GPUValidationError: Validation Error FAILED tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_rgba8uint - AssertionError: assert False FAILED tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_rgba16sint - wgpu._classes.GPUValidationError: Validation Error FAILED tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_r32sint - AssertionError: assert False FAILED tests/test_wgpu_native_compute_tex.py::test_compute_tex_3d_r32float - AssertionError: assert False FAILED tests/test_wgpu_native_render.py::test_render_orange_square_depth16unorm - wgpu._classes.GPUValidationError: Validation Error FAILED tests/test_wgpu_native_render_tex.py::test_render_textured_square_rgba16sint - wgpu._classes.GPUValidationError: Validation Error FAILED tests/test_wgpu_native_render_tex.py::test_render_textured_square_rgba32float - assert False FAILED tests/test_wgpu_native_render_tex.py::test_render_textured_square_rg32float - assert False ======================= 11 failed, 109 passed in 21.26s ======================== ```
dskkato commented 10 months ago

For Wayland, it may be knowe issues. See https://github.com/pygfx/wgpu-py/issues/92 for example.

dskkato commented 10 months ago

I believe all that's left is (as mentioned elsewhare) to wait for the release on CI, so I will close this issue. There is still the pending task of building for armv7, it seems like it would be quite labor-intensive, involving preparations for armv7 container image (manylinux or Raspberry Pi base).

almarklein commented 10 months ago

Thanks for this!

It looks like the hardware of the Pi is just not good enough to meet the requirements to be wgpu standard compliant. What it does then is move to "downlevel", which is a set of easier requirements. Most test failures seem to be related to unsupported texture formats (or no filtering supported for certain textures).

I'm curious to see how well pygfx still runs on it, but we can try that another day.

There is still the pending task of building for armv7,

I think what we have now is probably enough for now.

dskkato commented 10 months ago

Here is test logs running on Raspberry Pi 4B. I have no knowledge of the pygfx test cases and have not checked the logs.

Test logs


Short summaries

Vulkan backend

=========================== short test summary info ============================
FAILED examples/tests/test_examples.py::test_examples_run[offscreen] - TypeEr...
FAILED tests/renderers/test_reactivity.py::test_reactivity_mesh3 - wgpu._clas...
====== 2 failed, 278 passed, 21 skipped, 3 warnings in 743.31s (0:12:23) =======

OpenGL backend

=========================== short test summary info ============================
FAILED examples/tests/test_examples.py::test_examples_run[offscreen] - TypeEr...
FAILED tests/renderers/test_reactivity.py::test_reactivity_mesh1 - wgpu._clas...
FAILED tests/renderers/test_reactivity.py::test_reactivity_mesh2 - wgpu._clas...
FAILED tests/renderers/test_reactivity.py::test_reactivity_mesh3 - wgpu._clas...
FAILED tests/renderers/test_reactivity.py::test_change_blend_mode - wgpu._cla...
FAILED tests/renderers/test_reactivity.py::test_two_renders_with_same_blend_modes
FAILED tests/renderers/test_reactivity.py::test_two_renders_with_different_blend_modes
====== 7 failed, 273 passed, 21 skipped, 3 warnings in 715.57s (0:11:55) =======