code: def __call__(
      self, *bufs, global_size, local_size, vals=(), wait=False
  ):
      assert len(bufs) <= 8, "WEBGPU only supports 8 buffers"
      binding_layouts = [
          {
              "binding": i,
              "visibility": wgpu.ShaderStage.COMPUTE,
              "buffer": {
                  "type": wgpu.BufferBindingType.uniform
                  if i >= len(bufs)
                  else wgpu.BufferBindingType.storage
              },
          }
          for i in range(len(bufs) + len(vals))
      ]  # noqa: E501
      bindings = [
          {
              "binding": i,
              "resource": {
                  "buffer": create_uniform(x) if i >= len(bufs) else x,
                  "offset": 0,
                  "size": 4 if i >= len(bufs) else x.size,
              },
          }
          for i, x in enumerate(bufs + vals)
      ]  # noqa: E501
      bind_group_layout = wgpu_device.create_bind_group_layout(
          entries=binding_layouts
      )
      pipeline_layout = wgpu_device.create_pipeline_layout(
          bind_group_layouts=[bind_group_layout]
      )
      bind_group = wgpu_device.create_bind_group(
          layout=bind_group_layout, entries=bindings
      )
      compute_pipeline = wgpu_device.create_compute_pipeline(
          layout=pipeline_layout,
          compute={"module": self.prg, "entry_point": self.name},
      )
      command_encoder = wgpu_device.create_command_encoder()
      compute_pass = command_encoder.begin_compute_pass()
      compute_pass.set_pipeline(compute_pipeline)
      compute_pass.set_bind_group(
          0, bind_group, [], 0, 999999
      )  # last 2 not used
      compute_pass.dispatch_workgroups(*global_size)  # x y z
      compute_pass.end()
      wgpu_device.queue.submit([command_encoder.finish()])
  
file_path: tinygrad/extra/backends/ops_webgpu.py
imports: from wgpu.utils.device import get_default_device
  from tinygrad.device import Compiled, Allocator
  from tinygrad.codegen.kernel import LinearizerOptions
  from tinygrad.renderer.cstyle import WGSLRenderer
  import wgpu
label_desc: Use image node_id 2 for calling the WebGPUProgram obj's underlying member method code with example usage: obj.__call__() without return types