import { core, primordials } from "ext:core/mod.js";
const {
  isDataView,
  isTypedArray,
} = core;
const {
  op_webgpu_buffer_get_map_async,
  op_webgpu_buffer_get_mapped_range,
  op_webgpu_buffer_unmap,
  op_webgpu_command_encoder_begin_compute_pass,
  op_webgpu_command_encoder_begin_render_pass,
  op_webgpu_command_encoder_clear_buffer,
  op_webgpu_command_encoder_copy_buffer_to_buffer,
  op_webgpu_command_encoder_copy_buffer_to_texture,
  op_webgpu_command_encoder_copy_texture_to_buffer,
  op_webgpu_command_encoder_copy_texture_to_texture,
  op_webgpu_command_encoder_finish,
  op_webgpu_command_encoder_insert_debug_marker,
  op_webgpu_command_encoder_pop_debug_group,
  op_webgpu_command_encoder_push_debug_group,
  op_webgpu_command_encoder_resolve_query_set,
  op_webgpu_command_encoder_write_timestamp,
  op_webgpu_compute_pass_dispatch_workgroups,
  op_webgpu_compute_pass_dispatch_workgroups_indirect,
  op_webgpu_compute_pass_end,
  op_webgpu_compute_pass_insert_debug_marker,
  op_webgpu_compute_pass_pop_debug_group,
  op_webgpu_compute_pass_push_debug_group,
  op_webgpu_compute_pass_set_bind_group,
  op_webgpu_compute_pass_set_pipeline,
  op_webgpu_compute_pipeline_get_bind_group_layout,
  op_webgpu_create_bind_group,
  op_webgpu_create_bind_group_layout,
  op_webgpu_create_buffer,
  op_webgpu_create_command_encoder,
  op_webgpu_create_compute_pipeline,
  op_webgpu_create_pipeline_layout,
  op_webgpu_create_query_set,
  op_webgpu_create_render_bundle_encoder,
  op_webgpu_create_render_pipeline,
  op_webgpu_create_sampler,
  op_webgpu_create_shader_module,
  op_webgpu_create_texture,
  op_webgpu_create_texture_view,
  op_webgpu_queue_submit,
  op_webgpu_render_bundle_encoder_draw,
  op_webgpu_render_bundle_encoder_draw_indexed,
  op_webgpu_render_bundle_encoder_draw_indirect,
  op_webgpu_render_bundle_encoder_finish,
  op_webgpu_render_bundle_encoder_insert_debug_marker,
  op_webgpu_render_bundle_encoder_pop_debug_group,
  op_webgpu_render_bundle_encoder_push_debug_group,
  op_webgpu_render_bundle_encoder_set_bind_group,
  op_webgpu_render_bundle_encoder_set_index_buffer,
  op_webgpu_render_bundle_encoder_set_pipeline,
  op_webgpu_render_bundle_encoder_set_vertex_buffer,
  op_webgpu_render_pass_begin_occlusion_query,
  op_webgpu_render_pass_draw,
  op_webgpu_render_pass_draw_indexed,
  op_webgpu_render_pass_draw_indexed_indirect,
  op_webgpu_render_pass_draw_indirect,
  op_webgpu_render_pass_end,
  op_webgpu_render_pass_end_occlusion_query,
  op_webgpu_render_pass_execute_bundles,
  op_webgpu_render_pass_insert_debug_marker,
  op_webgpu_render_pass_pop_debug_group,
  op_webgpu_render_pass_push_debug_group,
  op_webgpu_render_pass_set_bind_group,
  op_webgpu_render_pass_set_blend_constant,
  op_webgpu_render_pass_set_index_buffer,
  op_webgpu_render_pass_set_pipeline,
  op_webgpu_render_pass_set_scissor_rect,
  op_webgpu_render_pass_set_stencil_reference,
  op_webgpu_render_pass_set_vertex_buffer,
  op_webgpu_render_pass_set_viewport,
  op_webgpu_render_pipeline_get_bind_group_layout,
  op_webgpu_request_adapter,
  op_webgpu_request_adapter_info,
  op_webgpu_request_device,
  op_webgpu_write_buffer,
  op_webgpu_write_texture,
} = core.ensureFastOps();
const {
  ArrayBuffer,
  ArrayBufferPrototypeGetByteLength,
  ArrayIsArray,
  ArrayPrototypeFilter,
  ArrayPrototypeIncludes,
  ArrayPrototypeMap,
  ArrayPrototypePop,
  ArrayPrototypePush,
  DataViewPrototypeGetBuffer,
  Error,
  MathMax,
  ObjectDefineProperty,
  ObjectHasOwn,
  ObjectPrototypeIsPrototypeOf,
  Promise,
  PromisePrototypeCatch,
  PromisePrototypeThen,
  PromiseReject,
  PromiseResolve,
  SafeArrayIterator,
  SafePromiseAll,
  SafeSet,
  SafeWeakRef,
  SetPrototypeHas,
  Symbol,
  SymbolFor,
  SymbolIterator,
  TypeError,
  TypedArrayPrototypeGetBuffer,
  TypedArrayPrototypeGetSymbolToStringTag,
  Uint32Array,
  Uint8Array,
} = primordials;
import * as webidl from "ext:deno_webidl/00_webidl.js";
import { EventTarget } from "ext:deno_web/02_event.js";
import { DOMException } from "ext:deno_web/01_dom_exception.js";
import { createFilteredInspectProxy } from "ext:deno_console/01_console.js";
const _rid = Symbol("[[rid]]");
const _size = Symbol("[[size]]");
const _usage = Symbol("[[usage]]");
const _state = Symbol("[[state]]");
const _mappingRange = Symbol("[[mapping_range]]");
const _mappedRanges = Symbol("[[mapped_ranges]]");
const _mapMode = Symbol("[[map_mode]]");
const _adapter = Symbol("[[adapter]]");
const _cleanup = Symbol("[[cleanup]]");
const _vendor = Symbol("[[vendor]]");
const _architecture = Symbol("[[architecture]]");
const _description = Symbol("[[description]]");
const _limits = Symbol("[[limits]]");
const _reason = Symbol("[[reason]]");
const _message = Symbol("[[message]]");
const _label = Symbol("[[label]]");
const _device = Symbol("[[device]]");
const _queue = Symbol("[[queue]]");
const _views = Symbol("[[views]]");
const _texture = Symbol("[[texture]]");
const _encoders = Symbol("[[encoders]]");
const _encoder = Symbol("[[encoder]]");
const _descriptor = Symbol("[[descriptor]]");
const _width = Symbol("[[width]]");
const _height = Symbol("[[height]]");
const _depthOrArrayLayers = Symbol("[[depthOrArrayLayers]]");
const _mipLevelCount = Symbol("[[mipLevelCount]]");
const _sampleCount = Symbol("[[sampleCount]]");
const _dimension = Symbol("[[dimension]]");
const _format = Symbol("[[format]]");
const _type = Symbol("[[type]]");
const _count = Symbol("[[count]]");
function assertDevice(self, prefix, context) {
  const device = self[_device];
  const deviceRid = device?.rid;
  if (deviceRid === undefined) {
    throw new DOMException(
      `${prefix}: ${context} references an invalid or destroyed device.`,
      "OperationError",
    );
  }
  return device;
}
function assertDeviceMatch(
  self,
  resource,
  { prefix, resourceContext, selfContext },
) {
  const resourceDevice = assertDevice(resource, prefix, resourceContext);
  if (resourceDevice.rid !== self.rid) {
    throw new DOMException(
      `${prefix}: ${resourceContext} belongs to a diffent device than ${selfContext}.`,
      "OperationError",
    );
  }
  return { ...resourceDevice, rid: resourceDevice.rid };
}
function assertResource(self, prefix, context) {
  const rid = self[_rid];
  if (rid === undefined) {
    throw new DOMException(
      `${prefix}: ${context} an invalid or destroyed resource.`,
      "OperationError",
    );
  }
  return rid;
}
function normalizeGPUExtent3D(data) {
  if (ArrayIsArray(data)) {
    return {
      width: data[0],
      height: data[1] ?? 1,
      depthOrArrayLayers: data[2] ?? 1,
    };
  } else {
    return {
      width: data.width,
      height: data.height ?? 1,
      depthOrArrayLayers: data.depthOrArrayLayers ?? 1,
    };
  }
}
function normalizeGPUOrigin3D(data) {
  if (ArrayIsArray(data)) {
    return {
      x: data[0],
      y: data[1],
      z: data[2],
    };
  } else {
    return data;
  }
}
function normalizeGPUColor(data) {
  if (ArrayIsArray(data)) {
    return {
      r: data[0],
      g: data[1],
      b: data[2],
      a: data[3],
    };
  } else {
    return data;
  }
}
const illegalConstructorKey = Symbol("illegalConstructorKey");
class GPUError extends Error {
  constructor(key = null) {
    super();
    if (key !== illegalConstructorKey) {
      webidl.illegalConstructor();
    }
  }
  [_message];
  get message() {
    webidl.assertBranded(this, GPUErrorPrototype);
    return this[_message];
  }
}
const GPUErrorPrototype = GPUError.prototype;
class GPUValidationError extends GPUError {
  name = "GPUValidationError";
  
  constructor(message) {
    const prefix = "Failed to construct 'GPUValidationError'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    message = webidl.converters.DOMString(message, prefix, "Argument 1");
    super(illegalConstructorKey);
    this[webidl.brand] = webidl.brand;
    this[_message] = message;
  }
}
const GPUValidationErrorPrototype = GPUValidationError.prototype;
class GPUOutOfMemoryError extends GPUError {
  name = "GPUOutOfMemoryError";
  constructor(message) {
    const prefix = "Failed to construct 'GPUOutOfMemoryError'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    message = webidl.converters.DOMString(message, prefix, "Argument 1");
    super(illegalConstructorKey);
    this[webidl.brand] = webidl.brand;
    this[_message] = message;
  }
}
const GPUOutOfMemoryErrorPrototype = GPUOutOfMemoryError.prototype;
class GPU {
  [webidl.brand] = webidl.brand;
  constructor() {
    webidl.illegalConstructor();
  }
  
  async requestAdapter(options = {}) {
    webidl.assertBranded(this, GPUPrototype);
    options = webidl.converters.GPURequestAdapterOptions(
      options,
      "Failed to execute 'requestAdapter' on 'GPU'",
      "Argument 1",
    );
    const { err, ...data } = await op_webgpu_request_adapter(
      options.powerPreference,
      options.forceFallbackAdapter,
    );
    if (err) {
      return null;
    } else {
      return createGPUAdapter(data);
    }
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return `${this.constructor.name} ${inspect({}, inspectOptions)}`;
  }
}
const GPUPrototype = GPU.prototype;
function createGPUAdapter(inner) {
  
  const adapter = webidl.createBranded(GPUAdapter);
  adapter[_adapter] = {
    ...inner,
    features: createGPUSupportedFeatures(inner.features),
    limits: createGPUSupportedLimits(inner.limits),
  };
  return adapter;
}
class GPUAdapter {
  
  [_adapter];
  
  get features() {
    webidl.assertBranded(this, GPUAdapterPrototype);
    return this[_adapter].features;
  }
  
  get limits() {
    webidl.assertBranded(this, GPUAdapterPrototype);
    return this[_adapter].limits;
  }
  
  get isFallbackAdapter() {
    webidl.assertBranded(this, GPUAdapterPrototype);
    return this[_adapter].isFallbackAdapter;
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  async requestDevice(descriptor = {}) {
    webidl.assertBranded(this, GPUAdapterPrototype);
    const prefix = "Failed to execute 'requestDevice' on 'GPUAdapter'";
    descriptor = webidl.converters.GPUDeviceDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const requiredFeatures = descriptor.requiredFeatures ?? [];
    for (let i = 0; i < requiredFeatures.length; ++i) {
      const feature = requiredFeatures[i];
      if (
        !SetPrototypeHas(this[_adapter].features[webidl.setlikeInner], feature)
      ) {
        throw new TypeError(
          `${prefix}: requiredFeatures must be a subset of the adapter features.`,
        );
      }
    }
    const { rid, features, limits } = await op_webgpu_request_device(
      this[_adapter].rid,
      descriptor.label,
      requiredFeatures,
      descriptor.requiredLimits,
    );
    const inner = new InnerGPUDevice({
      rid,
      adapter: this,
      features: createGPUSupportedFeatures(features),
      limits: createGPUSupportedLimits(limits),
    });
    return createGPUDevice(
      descriptor.label,
      inner,
      createGPUQueue(descriptor.label, inner),
    );
  }
  
  async requestAdapterInfo(unmaskHints = []) {
    webidl.assertBranded(this, GPUAdapterPrototype);
    const prefix = "Failed to execute 'requestAdapterInfo' on 'GPUAdapter'";
    unmaskHints = webidl.converters["sequence<DOMString>"](
      unmaskHints,
      prefix,
      "Argument 1",
    );
    const {
      vendor,
      architecture,
      device,
      description,
    } = await op_webgpu_request_adapter_info(
      this[_adapter].rid,
    );
    const adapterInfo = webidl.createBranded(GPUAdapterInfo);
    adapterInfo[_vendor] = ArrayPrototypeIncludes(unmaskHints, "vendor")
      ? vendor
      : "";
    adapterInfo[_architecture] =
      ArrayPrototypeIncludes(unmaskHints, "architecture") ? architecture : "";
    adapterInfo[_device] = ArrayPrototypeIncludes(unmaskHints, "device")
      ? device
      : "";
    adapterInfo[_description] =
      ArrayPrototypeIncludes(unmaskHints, "description") ? description : "";
    return adapterInfo;
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUAdapterPrototype, this),
        keys: [
          "features",
          "limits",
          "isFallbackAdapter",
        ],
      }),
      inspectOptions,
    );
  }
}
const GPUAdapterPrototype = GPUAdapter.prototype;
class GPUAdapterInfo {
  
  [_vendor];
  
  get vendor() {
    webidl.assertBranded(this, GPUAdapterInfoPrototype);
    return this[_vendor];
  }
  
  [_architecture];
  
  get architecture() {
    webidl.assertBranded(this, GPUAdapterInfoPrototype);
    return this[_architecture];
  }
  
  [_device];
  
  get device() {
    webidl.assertBranded(this, GPUAdapterInfoPrototype);
    return this[_device];
  }
  
  [_description];
  
  get description() {
    webidl.assertBranded(this, GPUAdapterInfoPrototype);
    return this[_description];
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUAdapterInfoPrototype, this),
        keys: [
          "vendor",
          "architecture",
          "device",
          "description",
        ],
      }),
      inspectOptions,
    );
  }
}
const GPUAdapterInfoPrototype = GPUAdapterInfo.prototype;
function createGPUSupportedLimits(limits) {
  
  const adapterFeatures = webidl.createBranded(GPUSupportedLimits);
  adapterFeatures[_limits] = limits;
  return adapterFeatures;
}
class GPUSupportedLimits {
  
  [_limits];
  constructor() {
    webidl.illegalConstructor();
  }
  get maxTextureDimension1D() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxTextureDimension1D;
  }
  get maxTextureDimension2D() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxTextureDimension2D;
  }
  get maxTextureDimension3D() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxTextureDimension3D;
  }
  get maxTextureArrayLayers() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxTextureArrayLayers;
  }
  get maxBindGroups() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxBindGroups;
  }
  get maxBindingsPerBindGroup() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxBindingsPerBindGroup;
  }
  get maxBufferSize() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxBufferSize;
  }
  get maxDynamicUniformBuffersPerPipelineLayout() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxDynamicUniformBuffersPerPipelineLayout;
  }
  get maxDynamicStorageBuffersPerPipelineLayout() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxDynamicStorageBuffersPerPipelineLayout;
  }
  get maxSampledTexturesPerShaderStage() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxSampledTexturesPerShaderStage;
  }
  get maxSamplersPerShaderStage() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxSamplersPerShaderStage;
  }
  get maxStorageBuffersPerShaderStage() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxStorageBuffersPerShaderStage;
  }
  get maxStorageTexturesPerShaderStage() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxStorageTexturesPerShaderStage;
  }
  get maxUniformBuffersPerShaderStage() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxUniformBuffersPerShaderStage;
  }
  get maxUniformBufferBindingSize() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxUniformBufferBindingSize;
  }
  get maxStorageBufferBindingSize() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxStorageBufferBindingSize;
  }
  get minUniformBufferOffsetAlignment() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].minUniformBufferOffsetAlignment;
  }
  get minStorageBufferOffsetAlignment() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].minStorageBufferOffsetAlignment;
  }
  get maxVertexBuffers() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxVertexBuffers;
  }
  get maxVertexAttributes() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxVertexAttributes;
  }
  get maxVertexBufferArrayStride() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxVertexBufferArrayStride;
  }
  get maxInterStageShaderComponents() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxInterStageShaderComponents;
  }
  get maxComputeWorkgroupStorageSize() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxComputeWorkgroupStorageSize;
  }
  get maxComputeInvocationsPerWorkgroup() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxComputeInvocationsPerWorkgroup;
  }
  get maxComputeWorkgroupSizeX() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxComputeWorkgroupSizeX;
  }
  get maxComputeWorkgroupSizeY() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxComputeWorkgroupSizeY;
  }
  get maxComputeWorkgroupSizeZ() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxComputeWorkgroupSizeZ;
  }
  get maxComputeWorkgroupsPerDimension() {
    webidl.assertBranded(this, GPUSupportedLimitsPrototype);
    return this[_limits].maxComputeWorkgroupsPerDimension;
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUSupportedLimitsPrototype,
          this,
        ),
        keys: [
          "maxTextureDimension1D",
          "maxTextureDimension2D",
          "maxTextureDimension3D",
          "maxTextureArrayLayers",
          "maxBindGroups",
          "maxBindingsPerBindGroup",
          "maxBufferSize",
          "maxDynamicUniformBuffersPerPipelineLayout",
          "maxDynamicStorageBuffersPerPipelineLayout",
          "maxSampledTexturesPerShaderStage",
          "maxSamplersPerShaderStage",
          "maxStorageBuffersPerShaderStage",
          "maxStorageTexturesPerShaderStage",
          "maxUniformBuffersPerShaderStage",
          "maxUniformBufferBindingSize",
          "maxStorageBufferBindingSize",
          "minUniformBufferOffsetAlignment",
          "minStorageBufferOffsetAlignment",
          "maxVertexBuffers",
          "maxVertexAttributes",
          "maxVertexBufferArrayStride",
          "maxInterStageShaderComponents",
          "maxComputeWorkgroupStorageSize",
          "maxComputeInvocationsPerWorkgroup",
          "maxComputeWorkgroupSizeX",
          "maxComputeWorkgroupSizeY",
          "maxComputeWorkgroupSizeZ",
          "maxComputeWorkgroupsPerDimension",
        ],
      }),
      inspectOptions,
    );
  }
}
const GPUSupportedLimitsPrototype = GPUSupportedLimits.prototype;
function createGPUSupportedFeatures(features) {
  
  const supportedFeatures = webidl.createBranded(GPUSupportedFeatures);
  supportedFeatures[webidl.setlikeInner] = new SafeSet(features);
  webidl.setlike(
    supportedFeatures,
    GPUSupportedFeaturesPrototype,
    true,
  );
  return supportedFeatures;
}
class GPUSupportedFeatures {
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    if (ObjectPrototypeIsPrototypeOf(GPUSupportedFeaturesPrototype, this)) {
      return `${this.constructor.name} ${
                inspect([...this], inspectOptions)}`;
    } else {
      return `${this.constructor.name} ${inspect({}, inspectOptions)}`;
    }
  }
}
const GPUSupportedFeaturesPrototype = GPUSupportedFeatures.prototype;
function createGPUDeviceLostInfo(reason, message) {
  
  const deviceLostInfo = webidl.createBranded(GPUDeviceLostInfo);
  deviceLostInfo[_reason] = reason ?? "unknown";
  deviceLostInfo[_message] = message;
  return deviceLostInfo;
}
class GPUDeviceLostInfo {
  
  [_reason];
  
  [_message];
  constructor() {
    webidl.illegalConstructor();
  }
  get reason() {
    webidl.assertBranded(this, GPUDeviceLostInfoPrototype);
    return this[_reason];
  }
  get message() {
    webidl.assertBranded(this, GPUDeviceLostInfoPrototype);
    return this[_message];
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUDeviceLostInfoPrototype,
          this,
        ),
        keys: [
          "reason",
          "message",
        ],
      }),
      inspectOptions,
    );
  }
}
const GPUDeviceLostInfoPrototype = GPUDeviceLostInfo.prototype;
function GPUObjectBaseMixin(name, type) {
  type.prototype[_label] = null;
  ObjectDefineProperty(type.prototype, "label", {
    
    get() {
      webidl.assertBranded(this, type.prototype);
      return this[_label];
    },
    
    set(label) {
      webidl.assertBranded(this, type.prototype);
      label = webidl.converters["UVString?"](
        label,
        `Failed to set 'label' on '${name}'`,
        "Argument 1",
      );
      this[_label] = label;
    },
  });
}
class InnerGPUDevice {
  
  adapter;
  
  rid;
  
  features;
  
  limits;
  
  resources;
  
  isLost;
  
  lost;
  
  resolveLost;
  
  errorScopeStack;
  
  constructor(options) {
    this.adapter = options.adapter;
    this.rid = options.rid;
    this.features = options.features;
    this.limits = options.limits;
    this.resources = [];
    this.isLost = false;
    this.resolveLost = () => {};
    this.lost = new Promise((resolve) => {
      this.resolveLost = resolve;
    });
    this.errorScopeStack = [];
  }
  
  trackResource(resource) {
    ArrayPrototypePush(this.resources, new SafeWeakRef(resource));
  }
  
  pushError(err) {
    this.pushErrorPromise(PromiseResolve(err));
  }
  
  pushErrorPromise(promise) {
    const operation = PromisePrototypeThen(promise, (err) => {
      if (err) {
        switch (err.type) {
          case "lost":
            this.isLost = true;
            this.resolveLost(
              createGPUDeviceLostInfo(undefined, "device was lost"),
            );
            break;
          case "validation":
            return PromiseReject(
              new GPUValidationError(err.value ?? "validation error"),
            );
          case "out-of-memory":
            return PromiseReject(new GPUOutOfMemoryError());
        }
      }
    });
    const validationStack = ArrayPrototypeFilter(
      this.errorScopeStack,
      ({ filter }) => filter == "validation",
    );
    const validationScope = validationStack[validationStack.length - 1];
    const validationFilteredPromise = PromisePrototypeCatch(
      operation,
      (err) => {
        if (ObjectPrototypeIsPrototypeOf(GPUValidationErrorPrototype, err)) {
          return PromiseReject(err);
        }
        return PromiseResolve();
      },
    );
    if (validationScope) {
      ArrayPrototypePush(
        validationScope.operations,
        validationFilteredPromise,
      );
    } else {
      PromisePrototypeCatch(validationFilteredPromise, () => {
              });
    }
        PromisePrototypeCatch(validationFilteredPromise, (_err) => {});
    const oomStack = ArrayPrototypeFilter(
      this.errorScopeStack,
      ({ filter }) => filter == "out-of-memory",
    );
    const oomScope = oomStack[oomStack.length - 1];
    const oomFilteredPromise = PromisePrototypeCatch(operation, (err) => {
      if (ObjectPrototypeIsPrototypeOf(GPUOutOfMemoryErrorPrototype, err)) {
        return PromiseReject(err);
      }
      return PromiseResolve();
    });
    if (oomScope) {
      ArrayPrototypePush(oomScope.operations, oomFilteredPromise);
    } else {
      PromisePrototypeCatch(oomFilteredPromise, () => {
              });
    }
        PromisePrototypeCatch(oomFilteredPromise, (_err) => {});
  }
}
function createGPUDevice(label, inner, queue) {
  
  const device = webidl.createBranded(GPUDevice);
  device[_label] = label;
  device[_device] = inner;
  device[_queue] = queue;
  return device;
}
class GPUDevice extends EventTarget {
  
  [_device];
  
  [_queue];
  [_cleanup]() {
    const device = this[_device];
    const resources = device.resources;
    while (resources.length > 0) {
      const resource = ArrayPrototypePop(resources)?.deref();
      if (resource) {
        resource[_cleanup]();
      }
    }
    const rid = device.rid;
    if (rid !== undefined) {
      core.close(rid);
      
      device.rid = undefined;
    }
  }
  get features() {
    webidl.assertBranded(this, GPUDevicePrototype);
    return this[_device].features;
  }
  get limits() {
    webidl.assertBranded(this, GPUDevicePrototype);
    return this[_device].limits;
  }
  get queue() {
    webidl.assertBranded(this, GPUDevicePrototype);
    return this[_queue];
  }
  constructor() {
    webidl.illegalConstructor();
    super();
  }
  destroy() {
    webidl.assertBranded(this, GPUDevicePrototype);
    this[_cleanup]();
  }
  
  createBuffer(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createBuffer' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUBufferDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_buffer(
      device.rid,
      descriptor.label,
      descriptor.size,
      descriptor.usage,
      descriptor.mappedAtCreation,
    );
    device.pushError(err);
    
    let options;
    if (descriptor.mappedAtCreation) {
      options = {
        mapping: new ArrayBuffer(descriptor.size),
        mappingRange: [0, descriptor.size],
        mappedRanges: [],
        state: "mapped at creation",
      };
    } else {
      options = {
        mapping: null,
        mappedRanges: null,
        mappingRange: null,
        state: "unmapped",
      };
    }
    const buffer = createGPUBuffer(
      descriptor.label,
      device,
      rid,
      descriptor.size,
      descriptor.usage,
      options,
    );
    device.trackResource(buffer);
    return buffer;
  }
  
  createTexture(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createTexture' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUTextureDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_texture({
      deviceRid: device.rid,
      ...descriptor,
      size: normalizeGPUExtent3D(descriptor.size),
    });
    device.pushError(err);
    const texture = createGPUTexture(
      descriptor,
      device,
      rid,
    );
    device.trackResource(texture);
    return texture;
  }
  
  createSampler(descriptor = {}) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createSampler' on 'GPUDevice'";
    descriptor = webidl.converters.GPUSamplerDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_sampler({
      deviceRid: device.rid,
      ...descriptor,
    });
    device.pushError(err);
    const sampler = createGPUSampler(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(sampler);
    return sampler;
  }
  
  createBindGroupLayout(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createBindGroupLayout' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUBindGroupLayoutDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    for (let i = 0; i < descriptor.entries.length; ++i) {
      const entry = descriptor.entries[i];
      let j = 0;
            if (entry.buffer) j++;
      if (entry.sampler) j++;
      if (entry.texture) j++;
      if (entry.storageTexture) j++;
      if (j !== 1) {
        throw new Error();       }
    }
    const { rid, err } = op_webgpu_create_bind_group_layout(
      device.rid,
      descriptor.label,
      descriptor.entries,
    );
    device.pushError(err);
    const bindGroupLayout = createGPUBindGroupLayout(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(bindGroupLayout);
    return bindGroupLayout;
  }
  
  createPipelineLayout(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createPipelineLayout' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUPipelineLayoutDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const bindGroupLayouts = ArrayPrototypeMap(
      descriptor.bindGroupLayouts,
      (layout, i) => {
        const context = `bind group layout ${i + 1}`;
        const rid = assertResource(layout, prefix, context);
        assertDeviceMatch(device, layout, {
          prefix,
          selfContext: "this",
          resourceContext: context,
        });
        return rid;
      },
    );
    const { rid, err } = op_webgpu_create_pipeline_layout(
      device.rid,
      descriptor.label,
      bindGroupLayouts,
    );
    device.pushError(err);
    const pipelineLayout = createGPUPipelineLayout(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(pipelineLayout);
    return pipelineLayout;
  }
  
  createBindGroup(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createBindGroup' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUBindGroupDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const layout = assertResource(descriptor.layout, prefix, "layout");
    assertDeviceMatch(device, descriptor.layout, {
      prefix,
      resourceContext: "layout",
      selfContext: "this",
    });
    const entries = ArrayPrototypeMap(descriptor.entries, (entry, i) => {
      const context = `entry ${i + 1}`;
      const resource = entry.resource;
      if (ObjectPrototypeIsPrototypeOf(GPUSamplerPrototype, resource)) {
        const rid = assertResource(resource, prefix, context);
        assertDeviceMatch(device, resource, {
          prefix,
          resourceContext: context,
          selfContext: "this",
        });
        return {
          binding: entry.binding,
          kind: "GPUSampler",
          resource: rid,
        };
      } else if (
        ObjectPrototypeIsPrototypeOf(GPUTextureViewPrototype, resource)
      ) {
        const rid = assertResource(resource, prefix, context);
        assertResource(resource[_texture], prefix, context);
        assertDeviceMatch(device, resource[_texture], {
          prefix,
          resourceContext: context,
          selfContext: "this",
        });
        return {
          binding: entry.binding,
          kind: "GPUTextureView",
          resource: rid,
        };
      } else {
                const rid = assertResource(resource.buffer, prefix, context);
                assertDeviceMatch(device, resource.buffer, {
          prefix,
          resourceContext: context,
          selfContext: "this",
        });
        return {
          binding: entry.binding,
          kind: "GPUBufferBinding",
          resource: rid,
          offset: entry.resource.offset,
          size: entry.resource.size,
        };
      }
    });
    const { rid, err } = op_webgpu_create_bind_group(
      device.rid,
      descriptor.label,
      layout,
      entries,
    );
    device.pushError(err);
    const bindGroup = createGPUBindGroup(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(bindGroup);
    return bindGroup;
  }
  
  createShaderModule(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createShaderModule' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUShaderModuleDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_shader_module(
      device.rid,
      descriptor.label,
      descriptor.code,
    );
    device.pushError(err);
    const shaderModule = createGPUShaderModule(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(shaderModule);
    return shaderModule;
  }
  
  createComputePipeline(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createComputePipeline' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUComputePipelineDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    let layout = descriptor.layout;
    if (typeof descriptor.layout !== "string") {
      const context = "layout";
      layout = assertResource(descriptor.layout, prefix, context);
      assertDeviceMatch(device, descriptor.layout, {
        prefix,
        resourceContext: context,
        selfContext: "this",
      });
    }
    const module = assertResource(
      descriptor.compute.module,
      prefix,
      "compute shader module",
    );
    assertDeviceMatch(device, descriptor.compute.module, {
      prefix,
      resourceContext: "compute shader module",
      selfContext: "this",
    });
    const { rid, err } = op_webgpu_create_compute_pipeline(
      device.rid,
      descriptor.label,
      layout,
      {
        module,
        entryPoint: descriptor.compute.entryPoint,
        constants: descriptor.compute.constants,
      },
    );
    device.pushError(err);
    const computePipeline = createGPUComputePipeline(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(computePipeline);
    return computePipeline;
  }
  
  createRenderPipeline(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createRenderPipeline' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPURenderPipelineDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    let layout = descriptor.layout;
    if (typeof descriptor.layout !== "string") {
      const context = "layout";
      layout = assertResource(descriptor.layout, prefix, context);
      assertDeviceMatch(device, descriptor.layout, {
        prefix,
        resourceContext: context,
        selfContext: "this",
      });
    }
    const module = assertResource(
      descriptor.vertex.module,
      prefix,
      "vertex shader module",
    );
    assertDeviceMatch(device, descriptor.vertex.module, {
      prefix,
      resourceContext: "vertex shader module",
      selfContext: "this",
    });
    let fragment = undefined;
    if (descriptor.fragment) {
      const module = assertResource(
        descriptor.fragment.module,
        prefix,
        "fragment shader module",
      );
      assertDeviceMatch(device, descriptor.fragment.module, {
        prefix,
        resourceContext: "fragment shader module",
        selfContext: "this",
      });
      fragment = {
        module,
        entryPoint: descriptor.fragment.entryPoint,
        targets: descriptor.fragment.targets,
      };
    }
    const { rid, err } = op_webgpu_create_render_pipeline({
      deviceRid: device.rid,
      label: descriptor.label,
      layout,
      vertex: {
        module,
        entryPoint: descriptor.vertex.entryPoint,
        buffers: descriptor.vertex.buffers,
      },
      primitive: descriptor.primitive,
      depthStencil: descriptor.depthStencil,
      multisample: descriptor.multisample,
      fragment,
    });
    device.pushError(err);
    const renderPipeline = createGPURenderPipeline(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(renderPipeline);
    return renderPipeline;
  }
  createComputePipelineAsync(descriptor) {
        return PromiseResolve(this.createComputePipeline(descriptor));
  }
  createRenderPipelineAsync(descriptor) {
        return PromiseResolve(this.createRenderPipeline(descriptor));
  }
  
  createCommandEncoder(descriptor = {}) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createCommandEncoder' on 'GPUDevice'";
    descriptor = webidl.converters.GPUCommandEncoderDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_command_encoder(
      device.rid,
      descriptor.label,
    );
    device.pushError(err);
    const commandEncoder = createGPUCommandEncoder(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(commandEncoder);
    return commandEncoder;
  }
  
  createRenderBundleEncoder(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix =
      "Failed to execute 'createRenderBundleEncoder' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, { prefix });
    descriptor = webidl.converters.GPURenderBundleEncoderDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_render_bundle_encoder({
      deviceRid: device.rid,
      ...descriptor,
    });
    device.pushError(err);
    const renderBundleEncoder = createGPURenderBundleEncoder(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(renderBundleEncoder);
    return renderBundleEncoder;
  }
  
  createQuerySet(descriptor) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'createQuerySet' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPUQuerySetDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const { rid, err } = op_webgpu_create_query_set({
      deviceRid: device.rid,
      ...descriptor,
    });
    device.pushError(err);
    const querySet = createGPUQuerySet(
      descriptor.label,
      device,
      rid,
      descriptor,
    );
    device.trackResource(querySet);
    return querySet;
  }
  get lost() {
    webidl.assertBranded(this, GPUDevicePrototype);
    const device = this[_device];
    if (!device) {
      return PromiseResolve(true);
    }
    if (device.rid === undefined) {
      return PromiseResolve(true);
    }
    return device.lost;
  }
  
  pushErrorScope(filter) {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'pushErrorScope' on 'GPUDevice'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    filter = webidl.converters.GPUErrorFilter(filter, prefix, "Argument 1");
    const device = assertDevice(this, prefix, "this");
    ArrayPrototypePush(device.errorScopeStack, { filter, operations: [] });
  }
  
    async popErrorScope() {
    webidl.assertBranded(this, GPUDevicePrototype);
    const prefix = "Failed to execute 'popErrorScope' on 'GPUDevice'";
    const device = assertDevice(this, prefix, "this");
    if (device.isLost) {
      throw new DOMException("Device has been lost.", "OperationError");
    }
    const scope = ArrayPrototypePop(device.errorScopeStack);
    if (!scope) {
      throw new DOMException(
        "There are no error scopes on the error scope stack.",
        "OperationError",
      );
    }
    const operations = SafePromiseAll(scope.operations);
    return PromisePrototypeThen(
      operations,
      () => PromiseResolve(null),
      (err) => PromiseResolve(err),
    );
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUDevicePrototype, this),
        keys: [
          "features",
          "label",
          "limits",
          "lost",
          "queue",
                            ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUDevice", GPUDevice);
const GPUDevicePrototype = GPUDevice.prototype;
function createGPUQueue(label, device) {
  
  const queue = webidl.createBranded(GPUQueue);
  queue[_label] = label;
  queue[_device] = device;
  return queue;
}
class GPUQueue {
  
  [_device];
  constructor() {
    webidl.illegalConstructor();
  }
  
  submit(commandBuffers) {
    webidl.assertBranded(this, GPUQueuePrototype);
    const prefix = "Failed to execute 'submit' on 'GPUQueue'";
    webidl.requiredArguments(arguments.length, 1, {
      prefix,
    });
    commandBuffers = webidl.converters["sequence<GPUCommandBuffer>"](
      commandBuffers,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const commandBufferRids = ArrayPrototypeMap(
      commandBuffers,
      (buffer, i) => {
        const context = `command buffer ${i + 1}`;
        const rid = assertResource(buffer, prefix, context);
        assertDeviceMatch(device, buffer, {
          prefix,
          selfContext: "this",
          resourceContext: context,
        });
        return rid;
      },
    );
    const { err } = op_webgpu_queue_submit(device.rid, commandBufferRids);
    for (let i = 0; i < commandBuffers.length; ++i) {
      commandBuffers[i][_rid] = undefined;
    }
    device.pushError(err);
  }
  onSubmittedWorkDone() {
    webidl.assertBranded(this, GPUQueuePrototype);
    return PromiseResolve();
  }
  
  writeBuffer(buffer, bufferOffset, data, dataOffset = 0, size) {
    webidl.assertBranded(this, GPUQueuePrototype);
    const prefix = "Failed to execute 'writeBuffer' on 'GPUQueue'";
    webidl.requiredArguments(arguments.length, 3, prefix);
    buffer = webidl.converters["GPUBuffer"](buffer, prefix, "Argument 1");
    bufferOffset = webidl.converters["GPUSize64"](
      bufferOffset,
      prefix,
      "Argument 2",
    );
    data = webidl.converters.BufferSource(data, prefix, "Argument 3");
    dataOffset = webidl.converters["GPUSize64"](
      dataOffset,
      prefix,
      "Argument 4",
    );
    size = size === undefined
      ? undefined
      : webidl.converters.GPUSize64(size, prefix, "Argument 5");
    const device = assertDevice(this, prefix, "this");
    const bufferRid = assertResource(buffer, prefix, "Argument 1");
    assertDeviceMatch(device, buffer, {
      prefix,
      selfContext: "this",
      resourceContext: "Argument 1",
    });
    
    let abLike = data;
    if (isTypedArray(data)) {
      abLike = TypedArrayPrototypeGetBuffer(
         (data),
      );
    } else if (isDataView(data)) {
      abLike = DataViewPrototypeGetBuffer( (data));
    }
    const { err } = op_webgpu_write_buffer(
      device.rid,
      bufferRid,
      bufferOffset,
      dataOffset,
      size,
      new Uint8Array(abLike),
    );
    device.pushError(err);
  }
  
  writeTexture(destination, data, dataLayout, size) {
    webidl.assertBranded(this, GPUQueuePrototype);
    const prefix = "Failed to execute 'writeTexture' on 'GPUQueue'";
    webidl.requiredArguments(arguments.length, 4, prefix);
    destination = webidl.converters.GPUImageCopyTexture(
      destination,
      prefix,
      "Argument 1",
    );
    data = webidl.converters.BufferSource(data, prefix, "Argument 2");
    dataLayout = webidl.converters.GPUImageDataLayout(
      dataLayout,
      prefix,
      "Argument 3",
    );
    size = webidl.converters.GPUExtent3D(size, prefix, "Argument 4");
    const device = assertDevice(this, prefix, "this");
    const textureRid = assertResource(destination.texture, prefix, "texture");
    assertDeviceMatch(device, destination.texture, {
      prefix,
      selfContext: "this",
      resourceContext: "texture",
    });
    
    let abLike = data;
    if (isTypedArray(data)) {
      abLike = TypedArrayPrototypeGetBuffer(
         (data),
      );
    } else if (isDataView(data)) {
      abLike = DataViewPrototypeGetBuffer( (data));
    }
    const { err } = op_webgpu_write_texture(
      device.rid,
      {
        texture: textureRid,
        mipLevel: destination.mipLevel,
        origin: destination.origin
          ? normalizeGPUOrigin3D(destination.origin)
          : undefined,
        aspect: destination.aspect,
      },
      dataLayout,
      normalizeGPUExtent3D(size),
      new Uint8Array(abLike),
    );
    device.pushError(err);
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUQueuePrototype, this),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUQueue", GPUQueue);
const GPUQueuePrototype = GPUQueue.prototype;
function createGPUBuffer(label, device, rid, size, usage, options) {
  
  const buffer = webidl.createBranded(GPUBuffer);
  buffer[_label] = label;
  buffer[_device] = device;
  buffer[_rid] = rid;
  buffer[_size] = size;
  buffer[_usage] = usage;
  buffer[_mappingRange] = options.mappingRange;
  buffer[_mappedRanges] = options.mappedRanges;
  buffer[_state] = options.state;
  return buffer;
}
class GPUBuffer {
  
  [_device];
  
  [_rid];
  
  [_size];
  
  [_usage];
  
  [_state];
  
  [_mappingRange];
  
  [_mappedRanges];
  
  [_mapMode];
  [_cleanup]() {
    const mappedRanges = this[_mappedRanges];
    if (mappedRanges) {
      while (mappedRanges.length > 0) {
        const mappedRange = ArrayPrototypePop(mappedRanges);
        if (mappedRange !== undefined) {
          core.close(mappedRange[1]);
        }
      }
    }
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
    this[_state] = "destroy";
  }
  constructor() {
    webidl.illegalConstructor();
  }
  get size() {
    webidl.assertBranded(this, GPUBufferPrototype);
    return this[_size];
  }
  get usage() {
    webidl.assertBranded(this, GPUBufferPrototype);
    return this[_usage];
  }
  get mapState() {
    webidl.assertBranded(this, GPUBufferPrototype);
    const state = this[_state];
    if (state === "mapped at creation") {
      return "mapped";
    } else {
      return state;
    }
  }
  
  async mapAsync(mode, offset = 0, size) {
    webidl.assertBranded(this, GPUBufferPrototype);
    const prefix = "Failed to execute 'mapAsync' on 'GPUBuffer'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    mode = webidl.converters.GPUMapModeFlags(mode, prefix, "Argument 1");
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 2");
    size = size === undefined
      ? undefined
      : webidl.converters.GPUSize64(size, prefix, "Argument 3");
    const device = assertDevice(this, prefix, "this");
    const bufferRid = assertResource(this, prefix, "this");
    
    let rangeSize;
    if (size === undefined) {
      rangeSize = MathMax(0, this[_size] - offset);
    } else {
      rangeSize = this[_size];
    }
    if ((offset % 8) !== 0) {
      throw new DOMException(
        `${prefix}: offset must be a multiple of 8.`,
        "OperationError",
      );
    }
    if ((rangeSize % 4) !== 0) {
      throw new DOMException(
        `${prefix}: rangeSize must be a multiple of 4.`,
        "OperationError",
      );
    }
    if ((offset + rangeSize) > this[_size]) {
      throw new DOMException(
        `${prefix}: offset + rangeSize must be less than or equal to buffer size.`,
        "OperationError",
      );
    }
    if (this[_state] !== "unmapped") {
      throw new DOMException(
        `${prefix}: GPUBuffer is not currently unmapped.`,
        "OperationError",
      );
    }
    const readMode = (mode & 0x0001) === 0x0001;
    const writeMode = (mode & 0x0002) === 0x0002;
    if ((readMode && writeMode) || (!readMode && !writeMode)) {
      throw new DOMException(
        `${prefix}: exactly one of READ or WRITE map mode must be set.`,
        "OperationError",
      );
    }
    if (readMode && !((this[_usage] && 0x0001) === 0x0001)) {
      throw new DOMException(
        `${prefix}: READ map mode not valid because buffer does not have MAP_READ usage.`,
        "OperationError",
      );
    }
    if (writeMode && !((this[_usage] && 0x0002) === 0x0002)) {
      throw new DOMException(
        `${prefix}: WRITE map mode not valid because buffer does not have MAP_WRITE usage.`,
        "OperationError",
      );
    }
    this[_mapMode] = mode;
    this[_state] = "pending";
    const promise = PromisePrototypeThen(
      op_webgpu_buffer_get_map_async(
        bufferRid,
        device.rid,
        mode,
        offset,
        rangeSize,
      ),
      ({ err }) => err,
    );
    device.pushErrorPromise(promise);
    const err = await promise;
    if (err) {
      throw new DOMException("validation error occured", "OperationError");
    }
    this[_state] = "mapped";
    this[_mappingRange] = [offset, offset + rangeSize];
    
    this[_mappedRanges] = [];
  }
  
  getMappedRange(offset = 0, size) {
    webidl.assertBranded(this, GPUBufferPrototype);
    const prefix = "Failed to execute 'getMappedRange' on 'GPUBuffer'";
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 1");
    if (size !== undefined) {
      size = webidl.converters.GPUSize64(size, prefix, "Argument 2");
    }
    assertDevice(this, prefix, "this");
    const bufferRid = assertResource(this, prefix, "this");
    
    let rangeSize;
    if (size === undefined) {
      rangeSize = MathMax(0, this[_size] - offset);
    } else {
      rangeSize = size;
    }
    const mappedRanges = this[_mappedRanges];
    if (!mappedRanges) {
      throw new DOMException(`${prefix}: invalid state.`, "OperationError");
    }
    for (let i = 0; i < mappedRanges.length; ++i) {
      const { 0: buffer, 1: _rid, 2: start } = mappedRanges[i];
            const end = start + ArrayBufferPrototypeGetByteLength(buffer);
      if (
        (start >= offset && start < (offset + rangeSize)) ||
        (end >= offset && end < (offset + rangeSize))
      ) {
        throw new DOMException(
          `${prefix}: requested buffer overlaps with another mapped range.`,
          "OperationError",
        );
      }
    }
    const buffer = new ArrayBuffer(rangeSize);
    const { rid } = op_webgpu_buffer_get_mapped_range(
      bufferRid,
      offset,
      size,
      new Uint8Array(buffer),
    );
    ArrayPrototypePush(mappedRanges, [buffer, rid, offset]);
    return buffer;
  }
  unmap() {
    webidl.assertBranded(this, GPUBufferPrototype);
    const prefix = "Failed to execute 'unmap' on 'GPUBuffer'";
    const device = assertDevice(this, prefix, "this");
    const bufferRid = assertResource(this, prefix, "this");
    if (this[_state] === "unmapped" || this[_state] === "destroyed") {
      throw new DOMException(
        `${prefix}: buffer is not ready to be unmapped.`,
        "OperationError",
      );
    }
    if (this[_state] === "pending") {
            throw new DOMException(
        `${prefix}: can not unmap while mapping. This is a Deno limitation.`,
        "OperationError",
      );
    } else if (
      this[_state] === "mapped" || this[_state] === "mapped at creation"
    ) {
      
      let write = false;
      if (this[_state] === "mapped at creation") {
        write = true;
      } else if (this[_state] === "mapped") {
        const mapMode = this[_mapMode];
        if (mapMode === undefined) {
          throw new DOMException(
            `${prefix}: invalid state.`,
            "OperationError",
          );
        }
        if ((mapMode & 0x0002) === 0x0002) {
          write = true;
        }
      }
      const mappedRanges = this[_mappedRanges];
      if (!mappedRanges) {
        throw new DOMException(`${prefix}: invalid state.`, "OperationError");
      }
      for (let i = 0; i < mappedRanges.length; ++i) {
        const { 0: buffer, 1: mappedRid } = mappedRanges[i];
        const { err } = op_webgpu_buffer_unmap(
          bufferRid,
          mappedRid,
          ...new SafeArrayIterator(write ? [new Uint8Array(buffer)] : []),
        );
        device.pushError(err);
        if (err) return;
      }
      this[_mappingRange] = null;
      this[_mappedRanges] = null;
    }
    this[_state] = "unmapped";
  }
  destroy() {
    webidl.assertBranded(this, GPUBufferPrototype);
    this[_cleanup]();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUBufferPrototype, this),
        keys: [
          "label",
          "mapState",
          "size",
          "usage",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUBuffer", GPUBuffer);
const GPUBufferPrototype = GPUBuffer.prototype;
class GPUBufferUsage {
  constructor() {
    webidl.illegalConstructor();
  }
  static get MAP_READ() {
    return 0x0001;
  }
  static get MAP_WRITE() {
    return 0x0002;
  }
  static get COPY_SRC() {
    return 0x0004;
  }
  static get COPY_DST() {
    return 0x0008;
  }
  static get INDEX() {
    return 0x0010;
  }
  static get VERTEX() {
    return 0x0020;
  }
  static get UNIFORM() {
    return 0x0040;
  }
  static get STORAGE() {
    return 0x0080;
  }
  static get INDIRECT() {
    return 0x0100;
  }
  static get QUERY_RESOLVE() {
    return 0x0200;
  }
}
class GPUMapMode {
  constructor() {
    webidl.illegalConstructor();
  }
  static get READ() {
    return 0x0001;
  }
  static get WRITE() {
    return 0x0002;
  }
}
function createGPUTexture(descriptor, device, rid) {
  
  const texture = webidl.createBranded(GPUTexture);
  texture[_label] = descriptor.label;
  texture[_device] = device;
  texture[_rid] = rid;
  texture[_views] = [];
  texture[_width] = descriptor.size.width;
  texture[_height] = descriptor.size.height;
  texture[_depthOrArrayLayers] = descriptor.size.depthOrArrayLayers;
  texture[_mipLevelCount] = descriptor.mipLevelCount;
  texture[_sampleCount] = descriptor.sampleCount;
  texture[_dimension] = descriptor.dimension;
  texture[_format] = descriptor.format;
  texture[_usage] = descriptor.usage;
  return texture;
}
class GPUTexture {
  
  [_device];
  
  [_rid];
  
  [_views];
  
  [_width];
  
  [_height];
  
  [_depthOrArrayLayers];
  
  [_mipLevelCount];
  
  [_sampleCount];
  
  [_dimension];
  
  [_format];
  
  [_usage];
  [_cleanup]() {
    const views = this[_views];
    while (views.length > 0) {
      const view = ArrayPrototypePop(views)?.deref();
      if (view) {
        view[_cleanup]();
      }
    }
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  createView(descriptor = {}) {
    webidl.assertBranded(this, GPUTexturePrototype);
    const prefix = "Failed to execute 'createView' on 'GPUTexture'";
    webidl.requiredArguments(arguments.length, 0, prefix);
    descriptor = webidl.converters.GPUTextureViewDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const textureRid = assertResource(this, prefix, "this");
    const { rid, err } = op_webgpu_create_texture_view({
      textureRid,
      ...descriptor,
    });
    device.pushError(err);
    const textureView = createGPUTextureView(
      descriptor.label,
      this,
      rid,
    );
    ArrayPrototypePush(this[_views], new SafeWeakRef(textureView));
    return textureView;
  }
  destroy() {
    webidl.assertBranded(this, GPUTexturePrototype);
    this[_cleanup]();
  }
  get width() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_width];
  }
  get height() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_height];
  }
  get depthOrArrayLayers() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_depthOrArrayLayers];
  }
  get mipLevelCount() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_mipLevelCount];
  }
  get sampleCount() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_sampleCount];
  }
  get dimension() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_dimension];
  }
  get format() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_format];
  }
  get usage() {
    webidl.assertBranded(this, GPUTexturePrototype);
    return this[_usage];
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUTexturePrototype, this),
        keys: [
          "label",
          "width",
          "height",
          "depthOrArrayLayers",
          "mipLevelCount",
          "sampleCount",
          "dimension",
          "format",
          "usage",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUTexture", GPUTexture);
const GPUTexturePrototype = GPUTexture.prototype;
class GPUTextureUsage {
  constructor() {
    webidl.illegalConstructor();
  }
  static get COPY_SRC() {
    return 0x01;
  }
  static get COPY_DST() {
    return 0x02;
  }
  static get TEXTURE_BINDING() {
    return 0x04;
  }
  static get STORAGE_BINDING() {
    return 0x08;
  }
  static get RENDER_ATTACHMENT() {
    return 0x10;
  }
}
function createGPUTextureView(label, texture, rid) {
  
  const textureView = webidl.createBranded(GPUTextureView);
  textureView[_label] = label;
  textureView[_texture] = texture;
  textureView[_rid] = rid;
  return textureView;
}
class GPUTextureView {
  
  [_texture];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUTextureViewPrototype, this),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUTextureView", GPUTextureView);
const GPUTextureViewPrototype = GPUTextureView.prototype;
function createGPUSampler(label, device, rid) {
  
  const sampler = webidl.createBranded(GPUSampler);
  sampler[_label] = label;
  sampler[_device] = device;
  sampler[_rid] = rid;
  return sampler;
}
class GPUSampler {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect) {
    return `${this.constructor.name} ${
      inspect({
        label: this.label,
      })
    }`;
  }
}
GPUObjectBaseMixin("GPUSampler", GPUSampler);
const GPUSamplerPrototype = GPUSampler.prototype;
function createGPUBindGroupLayout(label, device, rid) {
  
  const bindGroupLayout = webidl.createBranded(GPUBindGroupLayout);
  bindGroupLayout[_label] = label;
  bindGroupLayout[_device] = device;
  bindGroupLayout[_rid] = rid;
  return bindGroupLayout;
}
class GPUBindGroupLayout {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUBindGroupLayoutPrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUBindGroupLayout", GPUBindGroupLayout);
const GPUBindGroupLayoutPrototype = GPUBindGroupLayout.prototype;
function createGPUPipelineLayout(label, device, rid) {
  
  const pipelineLayout = webidl.createBranded(GPUPipelineLayout);
  pipelineLayout[_label] = label;
  pipelineLayout[_device] = device;
  pipelineLayout[_rid] = rid;
  return pipelineLayout;
}
class GPUPipelineLayout {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUPipelineLayoutPrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUPipelineLayout", GPUPipelineLayout);
const GPUPipelineLayoutPrototype = GPUPipelineLayout.prototype;
function createGPUBindGroup(label, device, rid) {
  
  const bindGroup = webidl.createBranded(GPUBindGroup);
  bindGroup[_label] = label;
  bindGroup[_device] = device;
  bindGroup[_rid] = rid;
  return bindGroup;
}
class GPUBindGroup {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUBindGroupPrototype, this),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUBindGroup", GPUBindGroup);
const GPUBindGroupPrototype = GPUBindGroup.prototype;
function createGPUShaderModule(label, device, rid) {
  
  const bindGroup = webidl.createBranded(GPUShaderModule);
  bindGroup[_label] = label;
  bindGroup[_device] = device;
  bindGroup[_rid] = rid;
  return bindGroup;
}
class GPUShaderModule {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUShaderModulePrototype, this),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUShaderModule", GPUShaderModule);
const GPUShaderModulePrototype = GPUShaderModule.prototype;
class GPUShaderStage {
  constructor() {
    webidl.illegalConstructor();
  }
  static get VERTEX() {
    return 0x1;
  }
  static get FRAGMENT() {
    return 0x2;
  }
  static get COMPUTE() {
    return 0x4;
  }
}
function createGPUComputePipeline(label, device, rid) {
  
  const pipeline = webidl.createBranded(GPUComputePipeline);
  pipeline[_label] = label;
  pipeline[_device] = device;
  pipeline[_rid] = rid;
  return pipeline;
}
class GPUComputePipeline {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  getBindGroupLayout(index) {
    webidl.assertBranded(this, GPUComputePipelinePrototype);
    const prefix =
      "Failed to execute 'getBindGroupLayout' on 'GPUComputePipeline'";
    webidl.requiredArguments(arguments.length, 1, { prefix });
    index = webidl.converters["unsigned long"](index, prefix, "Argument 1");
    const device = assertDevice(this, prefix, "this");
    const computePipelineRid = assertResource(this, prefix, "this");
    const { rid, label, err } =
      op_webgpu_compute_pipeline_get_bind_group_layout(
        computePipelineRid,
        index,
      );
    device.pushError(err);
    const bindGroupLayout = createGPUBindGroupLayout(
      label,
      device,
      rid,
    );
    device.trackResource(bindGroupLayout);
    return bindGroupLayout;
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUComputePipelinePrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUComputePipeline", GPUComputePipeline);
const GPUComputePipelinePrototype = GPUComputePipeline.prototype;
function createGPURenderPipeline(label, device, rid) {
  
  const pipeline = webidl.createBranded(GPURenderPipeline);
  pipeline[_label] = label;
  pipeline[_device] = device;
  pipeline[_rid] = rid;
  return pipeline;
}
class GPURenderPipeline {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  getBindGroupLayout(index) {
    webidl.assertBranded(this, GPURenderPipelinePrototype);
    const prefix =
      "Failed to execute 'getBindGroupLayout' on 'GPURenderPipeline'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    index = webidl.converters["unsigned long"](index, prefix, "Argument 1");
    const device = assertDevice(this, prefix, "this");
    const renderPipelineRid = assertResource(this, prefix, "this");
    const { rid, label, err } = op_webgpu_render_pipeline_get_bind_group_layout(
      renderPipelineRid,
      index,
    );
    device.pushError(err);
    const bindGroupLayout = createGPUBindGroupLayout(
      label,
      device,
      rid,
    );
    device.trackResource(bindGroupLayout);
    return bindGroupLayout;
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPURenderPipelinePrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPURenderPipeline", GPURenderPipeline);
const GPURenderPipelinePrototype = GPURenderPipeline.prototype;
class GPUColorWrite {
  constructor() {
    webidl.illegalConstructor();
  }
  static get RED() {
    return 0x1;
  }
  static get GREEN() {
    return 0x2;
  }
  static get BLUE() {
    return 0x4;
  }
  static get ALPHA() {
    return 0x8;
  }
  static get ALL() {
    return 0xF;
  }
}
function createGPUCommandEncoder(label, device, rid) {
  
  const encoder = webidl.createBranded(GPUCommandEncoder);
  encoder[_label] = label;
  encoder[_device] = device;
  encoder[_rid] = rid;
  encoder[_encoders] = [];
  return encoder;
}
class GPUCommandEncoder {
  
  [_device];
  
  [_rid];
  
  [_encoders];
  [_cleanup]() {
    const encoders = this[_encoders];
    while (encoders.length > 0) {
      const encoder = ArrayPrototypePop(encoders)?.deref();
      if (encoder) {
        encoder[_cleanup]();
      }
    }
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  beginRenderPass(descriptor) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'beginRenderPass' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    descriptor = webidl.converters.GPURenderPassDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    if (this[_rid] === undefined) {
      throw new DOMException(
        "Failed to execute 'beginRenderPass' on 'GPUCommandEncoder': already consumed",
        "OperationError",
      );
    }
    let depthStencilAttachment;
    if (descriptor.depthStencilAttachment) {
      if (
        descriptor.depthStencilAttachment.depthLoadOp === "clear" &&
        !(ObjectHasOwn(descriptor.depthStencilAttachment, "depthClearValue"))
      ) {
        throw webidl.makeException(
          TypeError,
          '`depthClearValue` must be specified when `depthLoadOp` is "clear"',
          prefix,
          "Argument 1",
        );
      }
      const view = assertResource(
        descriptor.depthStencilAttachment.view,
        prefix,
        "texture view for depth stencil attachment",
      );
      assertDeviceMatch(
        device,
        descriptor.depthStencilAttachment.view[_texture],
        {
          prefix,
          resourceContext: "texture view for depth stencil attachment",
          selfContext: "this",
        },
      );
      depthStencilAttachment = {
        ...descriptor.depthStencilAttachment,
        view,
      };
    }
    const colorAttachments = ArrayPrototypeMap(
      descriptor.colorAttachments,
      (colorAttachment, i) => {
        const context = `color attachment ${i + 1}`;
        const view = assertResource(
          colorAttachment.view,
          prefix,
          `texture view for ${context}`,
        );
        assertResource(
          colorAttachment.view[_texture],
          prefix,
          `texture backing texture view for ${context}`,
        );
        assertDeviceMatch(
          device,
          colorAttachment.view[_texture],
          {
            prefix,
            resourceContext: `texture view for ${context}`,
            selfContext: "this",
          },
        );
        let resolveTarget;
        if (colorAttachment.resolveTarget) {
          resolveTarget = assertResource(
            colorAttachment.resolveTarget,
            prefix,
            `resolve target texture view for ${context}`,
          );
          assertResource(
            colorAttachment.resolveTarget[_texture],
            prefix,
            `texture backing resolve target texture view for ${context}`,
          );
          assertDeviceMatch(
            device,
            colorAttachment.resolveTarget[_texture],
            {
              prefix,
              resourceContext: `resolve target texture view for ${context}`,
              selfContext: "this",
            },
          );
        }
        return {
          view: view,
          resolveTarget,
          storeOp: colorAttachment.storeOp,
          loadOp: colorAttachment.loadOp,
          clearValue: normalizeGPUColor(colorAttachment.clearValue),
        };
      },
    );
    let occlusionQuerySet;
    if (descriptor.occlusionQuerySet) {
      occlusionQuerySet = assertResource(
        descriptor.occlusionQuerySet,
        prefix,
        "occlusionQuerySet",
      );
    }
    let timestampWrites = null;
    if (descriptor.timestampWrites) {
      const querySet = assertResource(
        descriptor.timestampWrites.querySet,
        prefix,
        "querySet",
      );
      timestampWrites = {
        querySet,
        beginningOfPassWriteIndex:
          descriptor.timestampWrites.beginningOfPassWriteIndex,
        endOfPassWriteIndex: descriptor.timestampWrites.endOfPassWriteIndex,
      };
    }
    const { rid } = op_webgpu_command_encoder_begin_render_pass(
      commandEncoderRid,
      descriptor.label,
      colorAttachments,
      depthStencilAttachment,
      occlusionQuerySet,
      timestampWrites,
    );
    const renderPassEncoder = createGPURenderPassEncoder(
      descriptor.label,
      this,
      rid,
    );
    ArrayPrototypePush(this[_encoders], new SafeWeakRef(renderPassEncoder));
    return renderPassEncoder;
  }
  
  beginComputePass(descriptor = {}) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix =
      "Failed to execute 'beginComputePass' on 'GPUCommandEncoder'";
    descriptor = webidl.converters.GPUComputePassDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    let timestampWrites = null;
    if (descriptor.timestampWrites) {
      const querySet = assertResource(
        descriptor.timestampWrites.querySet,
        prefix,
        "querySet",
      );
      timestampWrites = {
        querySet,
        beginningOfPassWriteIndex:
          descriptor.timestampWrites.beginningOfPassWriteIndex,
        endOfPassWriteIndex: descriptor.timestampWrites.endOfPassWriteIndex,
      };
    }
    const { rid } = op_webgpu_command_encoder_begin_compute_pass(
      commandEncoderRid,
      descriptor.label,
      timestampWrites,
    );
    const computePassEncoder = createGPUComputePassEncoder(
      descriptor.label,
      this,
      rid,
    );
    ArrayPrototypePush(this[_encoders], new SafeWeakRef(computePassEncoder));
    return computePassEncoder;
  }
  
  copyBufferToBuffer(
    source,
    sourceOffset,
    destination,
    destinationOffset,
    size,
  ) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix =
      "Failed to execute 'copyBufferToBuffer' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 5, prefix);
    source = webidl.converters.GPUBuffer(source, prefix, "Argument 1");
    sourceOffset = webidl.converters.GPUSize64(
      sourceOffset,
      prefix,
      "Argument 2",
    );
    destination = webidl.converters.GPUBuffer(
      destination,
      prefix,
      "Argument 3",
    );
    destinationOffset = webidl.converters.GPUSize64(
      destinationOffset,
      prefix,
      "Argument 4",
    );
    size = webidl.converters.GPUSize64(size, prefix, "Argument 5");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const sourceRid = assertResource(source, prefix, "Argument 1");
    assertDeviceMatch(device, source, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    const destinationRid = assertResource(destination, prefix, "Argument 3");
    assertDeviceMatch(device, destination, {
      prefix,
      resourceContext: "Argument 3",
      selfContext: "this",
    });
    const { err } = op_webgpu_command_encoder_copy_buffer_to_buffer(
      commandEncoderRid,
      sourceRid,
      sourceOffset,
      destinationRid,
      destinationOffset,
      size,
    );
    device.pushError(err);
  }
  
  copyBufferToTexture(source, destination, copySize) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix =
      "Failed to execute 'copyBufferToTexture' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 3, prefix);
    source = webidl.converters.GPUImageCopyBuffer(source, prefix, "Argument 1");
    destination = webidl.converters.GPUImageCopyTexture(
      destination,
      prefix,
      "Argument 2",
    );
    copySize = webidl.converters.GPUExtent3D(copySize, prefix, "Argument 3");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const sourceBufferRid = assertResource(
            source.buffer,
      prefix,
      "source in Argument 1",
    );
        assertDeviceMatch(device, source.buffer, {
      prefix,
      resourceContext: "source in Argument 1",
      selfContext: "this",
    });
    const destinationTextureRid = assertResource(
      destination.texture,
      prefix,
      "texture in Argument 2",
    );
    assertDeviceMatch(device, destination.texture, {
      prefix,
      resourceContext: "texture in Argument 2",
      selfContext: "this",
    });
    const { err } = op_webgpu_command_encoder_copy_buffer_to_texture(
      commandEncoderRid,
      {
        ...source,
        buffer: sourceBufferRid,
      },
      {
        texture: destinationTextureRid,
        mipLevel: destination.mipLevel,
        origin: destination.origin
          ? normalizeGPUOrigin3D(destination.origin)
          : undefined,
        aspect: destination.aspect,
      },
      normalizeGPUExtent3D(copySize),
    );
    device.pushError(err);
  }
  
  copyTextureToBuffer(source, destination, copySize) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix =
      "Failed to execute 'copyTextureToBuffer' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 3, prefix);
    source = webidl.converters.GPUImageCopyTexture(
      source,
      prefix,
      "Argument 1",
    );
    destination = webidl.converters.GPUImageCopyBuffer(
      destination,
      prefix,
      "Argument 2",
    );
    copySize = webidl.converters.GPUExtent3D(copySize, prefix, "Argument 3");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const sourceTextureRid = assertResource(
      source.texture,
      prefix,
      "texture in Argument 1",
    );
    assertDeviceMatch(device, source.texture, {
      prefix,
      resourceContext: "texture in Argument 1",
      selfContext: "this",
    });
    const destinationBufferRid = assertResource(
            destination.buffer,
      prefix,
      "buffer in Argument 2",
    );
        assertDeviceMatch(device, destination.buffer, {
      prefix,
      resourceContext: "buffer in Argument 2",
      selfContext: "this",
    });
    const { err } = op_webgpu_command_encoder_copy_texture_to_buffer(
      commandEncoderRid,
      {
        texture: sourceTextureRid,
        mipLevel: source.mipLevel,
        origin: source.origin ? normalizeGPUOrigin3D(source.origin) : undefined,
        aspect: source.aspect,
      },
      {
        ...destination,
        buffer: destinationBufferRid,
      },
      normalizeGPUExtent3D(copySize),
    );
    device.pushError(err);
  }
  
  copyTextureToTexture(source, destination, copySize) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix =
      "Failed to execute 'copyTextureToTexture' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 3, prefix);
    source = webidl.converters.GPUImageCopyTexture(
      source,
      prefix,
      "Argument 1",
    );
    destination = webidl.converters.GPUImageCopyTexture(
      destination,
      prefix,
      "Argument 2",
    );
    copySize = webidl.converters.GPUExtent3D(copySize, prefix, "Argument 3");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const sourceTextureRid = assertResource(
      source.texture,
      prefix,
      "texture in Argument 1",
    );
    assertDeviceMatch(device, source.texture, {
      prefix,
      resourceContext: "texture in Argument 1",
      selfContext: "this",
    });
    const destinationTextureRid = assertResource(
      destination.texture,
      prefix,
      "texture in Argument 2",
    );
    assertDeviceMatch(device, destination.texture, {
      prefix,
      resourceContext: "texture in Argument 2",
      selfContext: "this",
    });
    const { err } = op_webgpu_command_encoder_copy_texture_to_texture(
      commandEncoderRid,
      {
        texture: sourceTextureRid,
        mipLevel: source.mipLevel,
        origin: source.origin ? normalizeGPUOrigin3D(source.origin) : undefined,
        aspect: source.aspect,
      },
      {
        texture: destinationTextureRid,
        mipLevel: destination.mipLevel,
        origin: destination.origin
          ? normalizeGPUOrigin3D(destination.origin)
          : undefined,
        aspect: source.aspect,
      },
      normalizeGPUExtent3D(copySize),
    );
    device.pushError(err);
  }
  
  clearBuffer(buffer, offset = 0, size = undefined) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'clearBuffer' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 3, prefix);
    buffer = webidl.converters.GPUBuffer(buffer, prefix, "Argument 1");
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 2");
    size = webidl.converters.GPUSize64(size, prefix, "Argument 3");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const bufferRid = assertResource(buffer, prefix, "Argument 1");
    const { err } = op_webgpu_command_encoder_clear_buffer(
      commandEncoderRid,
      bufferRid,
      offset,
      size,
    );
    device.pushError(err);
  }
  
  pushDebugGroup(groupLabel) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'pushDebugGroup' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    groupLabel = webidl.converters.USVString(groupLabel, prefix, "Argument 1");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const { err } = op_webgpu_command_encoder_push_debug_group(
      commandEncoderRid,
      groupLabel,
    );
    device.pushError(err);
  }
  popDebugGroup() {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'popDebugGroup' on 'GPUCommandEncoder'";
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const { err } = op_webgpu_command_encoder_pop_debug_group(
      commandEncoderRid,
    );
    device.pushError(err);
  }
  
  insertDebugMarker(markerLabel) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix =
      "Failed to execute 'insertDebugMarker' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    markerLabel = webidl.converters.USVString(
      markerLabel,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const { err } = op_webgpu_command_encoder_insert_debug_marker(
      commandEncoderRid,
      markerLabel,
    );
    device.pushError(err);
  }
  
  writeTimestamp(querySet, queryIndex) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'writeTimestamp' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    querySet = webidl.converters.GPUQuerySet(querySet, prefix, "Argument 1");
    queryIndex = webidl.converters.GPUSize32(queryIndex, prefix, "Argument 2");
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const querySetRid = assertResource(querySet, prefix, "Argument 1");
    assertDeviceMatch(device, querySet, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    const { err } = op_webgpu_command_encoder_write_timestamp(
      commandEncoderRid,
      querySetRid,
      queryIndex,
    );
    device.pushError(err);
  }
  
  resolveQuerySet(
    querySet,
    firstQuery,
    queryCount,
    destination,
    destinationOffset,
  ) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'resolveQuerySet' on 'GPUCommandEncoder'";
    webidl.requiredArguments(arguments.length, 5, { prefix });
    querySet = webidl.converters.GPUQuerySet(querySet, prefix, "Argument 1");
    firstQuery = webidl.converters.GPUSize32(firstQuery, prefix, "Argument 2");
    queryCount = webidl.converters.GPUSize32(queryCount, prefix, "Argument 3");
    destination = webidl.converters.GPUBuffer(
      destination,
      prefix,
      "Argument 4",
    );
    destinationOffset = webidl.converters.GPUSize64(
      destinationOffset,
      prefix,
      "Argument 5",
    );
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const querySetRid = assertResource(querySet, prefix, "Argument 1");
    assertDeviceMatch(device, querySet, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    const destinationRid = assertResource(destination, prefix, "Argument 3");
    assertDeviceMatch(device, destination, {
      prefix,
      resourceContext: "Argument 3",
      selfContext: "this",
    });
    const { err } = op_webgpu_command_encoder_resolve_query_set(
      commandEncoderRid,
      querySetRid,
      firstQuery,
      queryCount,
      destinationRid,
      destinationOffset,
    );
    device.pushError(err);
  }
  
  finish(descriptor = {}) {
    webidl.assertBranded(this, GPUCommandEncoderPrototype);
    const prefix = "Failed to execute 'finish' on 'GPUCommandEncoder'";
    descriptor = webidl.converters.GPUCommandBufferDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const commandEncoderRid = assertResource(this, prefix, "this");
    const { rid, err } = op_webgpu_command_encoder_finish(
      commandEncoderRid,
      descriptor.label,
    );
    device.pushError(err);
    
    this[_rid] = undefined;
    const commandBuffer = createGPUCommandBuffer(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(commandBuffer);
    return commandBuffer;
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUCommandEncoderPrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUCommandEncoder", GPUCommandEncoder);
const GPUCommandEncoderPrototype = GPUCommandEncoder.prototype;
function createGPURenderPassEncoder(label, encoder, rid) {
  
  const passEncoder = webidl.createBranded(GPURenderPassEncoder);
  passEncoder[_label] = label;
  passEncoder[_encoder] = encoder;
  passEncoder[_rid] = rid;
  return passEncoder;
}
class GPURenderPassEncoder {
  
  [_encoder];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  setViewport(x, y, width, height, minDepth, maxDepth) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'setViewport' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 6, { prefix });
    x = webidl.converters.float(x, prefix, "Argument 1");
    y = webidl.converters.float(y, prefix, "Argument 2");
    width = webidl.converters.float(width, prefix, "Argument 3");
    height = webidl.converters.float(height, prefix, "Argument 4");
    minDepth = webidl.converters.float(minDepth, prefix, "Argument 5");
    maxDepth = webidl.converters.float(maxDepth, prefix, "Argument 6");
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_set_viewport({
      renderPassRid,
      x,
      y,
      width,
      height,
      minDepth,
      maxDepth,
    });
  }
  
  setScissorRect(x, y, width, height) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'setScissorRect' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 4, prefix);
    x = webidl.converters.GPUIntegerCoordinate(x, prefix, "Argument 1");
    y = webidl.converters.GPUIntegerCoordinate(y, prefix, "Argument 2");
    width = webidl.converters.GPUIntegerCoordinate(width, prefix, "Argument 3");
    height = webidl.converters.GPUIntegerCoordinate(
      height,
      prefix,
      "Argument 4",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_set_scissor_rect(
      renderPassRid,
      x,
      y,
      width,
      height,
    );
  }
  
  setBlendConstant(color) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'setBlendConstant' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    color = webidl.converters.GPUColor(color, prefix, "Argument 1");
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_set_blend_constant(
      renderPassRid,
      normalizeGPUColor(color),
    );
  }
  
  setStencilReference(reference) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'setStencilReference' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    reference = webidl.converters.GPUStencilValue(
      reference,
      prefix,
      "Argument 1",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_set_stencil_reference(
      renderPassRid,
      reference,
    );
  }
  
  beginOcclusionQuery(queryIndex) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'beginOcclusionQuery' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    queryIndex = webidl.converters.GPUSize32(queryIndex, prefix, "Argument 1");
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_begin_occlusion_query(
      renderPassRid,
      queryIndex,
    );
  }
  endOcclusionQuery() {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'endOcclusionQuery' on 'GPUComputePassEncoder'";
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_end_occlusion_query(renderPassRid);
  }
  
  executeBundles(bundles) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'executeBundles' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    bundles = webidl.converters["sequence<GPURenderBundle>"](
      bundles,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const bundleRids = ArrayPrototypeMap(bundles, (bundle, i) => {
      const context = `bundle ${i + 1}`;
      const rid = assertResource(bundle, prefix, context);
      assertDeviceMatch(device, bundle, {
        prefix,
        resourceContext: context,
        selfContext: "this",
      });
      return rid;
    });
    op_webgpu_render_pass_execute_bundles(renderPassRid, bundleRids);
  }
  end() {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'end' on 'GPURenderPassEncoder'";
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    const commandEncoderRid = assertResource(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    const renderPassRid = assertResource(this, prefix, "this");
    const { err } = op_webgpu_render_pass_end(
      commandEncoderRid,
      renderPassRid,
    );
    device.pushError(err);
    this[_rid] = undefined;
  }
    setBindGroup(
    index,
    bindGroup,
    dynamicOffsetsData,
    dynamicOffsetsDataStart,
    dynamicOffsetsDataLength,
  ) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'setBindGroup' on 'GPURenderPassEncoder'";
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const bindGroupRid = assertResource(bindGroup, prefix, "Argument 2");
    assertDeviceMatch(device, bindGroup, {
      prefix,
      resourceContext: "Argument 2",
      selfContext: "this",
    });
    if (
      TypedArrayPrototypeGetSymbolToStringTag(dynamicOffsetsData) !==
        "Uint32Array"
    ) {
      dynamicOffsetsData = new Uint32Array(dynamicOffsetsData ?? []);
      dynamicOffsetsDataStart = 0;
      dynamicOffsetsDataLength = dynamicOffsetsData.length;
    }
    op_webgpu_render_pass_set_bind_group(
      renderPassRid,
      index,
      bindGroupRid,
      dynamicOffsetsData,
      dynamicOffsetsDataStart,
      dynamicOffsetsDataLength,
    );
  }
  
  pushDebugGroup(groupLabel) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'pushDebugGroup' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    groupLabel = webidl.converters.USVString(groupLabel, prefix, "Argument 1");
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_push_debug_group(renderPassRid, groupLabel);
  }
  popDebugGroup() {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'popDebugGroup' on 'GPURenderPassEncoder'";
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_pop_debug_group(renderPassRid);
  }
  
  insertDebugMarker(markerLabel) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'insertDebugMarker' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    markerLabel = webidl.converters.USVString(
      markerLabel,
      prefix,
      "Argument 1",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_insert_debug_marker(renderPassRid, markerLabel);
  }
  
  setPipeline(pipeline) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'setPipeline' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    pipeline = webidl.converters.GPURenderPipeline(
      pipeline,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const pipelineRid = assertResource(pipeline, prefix, "Argument 1");
    assertDeviceMatch(device, pipeline, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_pass_set_pipeline(renderPassRid, pipelineRid);
  }
  
  setIndexBuffer(buffer, indexFormat, offset = 0, size) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'setIndexBuffer' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    buffer = webidl.converters.GPUBuffer(buffer, prefix, "Argument 1");
    indexFormat = webidl.converters.GPUIndexFormat(
      indexFormat,
      prefix,
      "Argument 2",
    );
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 3");
    if (size !== undefined) {
      size = webidl.converters.GPUSize64(size, prefix, "Argument 4");
    }
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const bufferRid = assertResource(buffer, prefix, "Argument 1");
    assertDeviceMatch(device, buffer, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_pass_set_index_buffer(
      renderPassRid,
      bufferRid,
      indexFormat,
      offset,
      size,
    );
  }
  
  setVertexBuffer(slot, buffer, offset = 0, size) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'setVertexBuffer' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    slot = webidl.converters.GPUSize32(slot, prefix, "Argument 1");
    buffer = webidl.converters.GPUBuffer(buffer, prefix, "Argument 2");
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 3");
    if (size !== undefined) {
      size = webidl.converters.GPUSize64(size, prefix, "Argument 4");
    }
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const bufferRid = assertResource(buffer, prefix, "Argument 2");
    assertDeviceMatch(device, buffer, {
      prefix,
      resourceContext: "Argument 2",
      selfContext: "this",
    });
    op_webgpu_render_pass_set_vertex_buffer(
      renderPassRid,
      slot,
      bufferRid,
      offset,
      size,
    );
  }
  
  draw(vertexCount, instanceCount = 1, firstVertex = 0, firstInstance = 0) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'draw' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    vertexCount = webidl.converters.GPUSize32(
      vertexCount,
      prefix,
      "Argument 1",
    );
    instanceCount = webidl.converters.GPUSize32(
      instanceCount,
      prefix,
      "Argument 2",
    );
    firstVertex = webidl.converters.GPUSize32(
      firstVertex,
      prefix,
      "Argument 3",
    );
    firstInstance = webidl.converters.GPUSize32(
      firstInstance,
      prefix,
      "Argument 4",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_draw(
      renderPassRid,
      vertexCount,
      instanceCount,
      firstVertex,
      firstInstance,
    );
  }
  
  drawIndexed(
    indexCount,
    instanceCount = 1,
    firstIndex = 0,
    baseVertex = 0,
    firstInstance = 0,
  ) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'drawIndexed' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    indexCount = webidl.converters.GPUSize32(indexCount, prefix, "Argument 1");
    instanceCount = webidl.converters.GPUSize32(
      instanceCount,
      prefix,
      "Argument 2",
    );
    firstIndex = webidl.converters.GPUSize32(firstIndex, prefix, "Argument 3");
    baseVertex = webidl.converters.GPUSignedOffset32(
      baseVertex,
      prefix,
      "Argument 4",
    );
    firstInstance = webidl.converters.GPUSize32(
      firstInstance,
      prefix,
      "Argument 5",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    op_webgpu_render_pass_draw_indexed(
      renderPassRid,
      indexCount,
      instanceCount,
      firstIndex,
      baseVertex,
      firstInstance,
    );
  }
  
  drawIndirect(indirectBuffer, indirectOffset) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix = "Failed to execute 'drawIndirect' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    indirectBuffer = webidl.converters.GPUBuffer(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    indirectOffset = webidl.converters.GPUSize64(
      indirectOffset,
      prefix,
      "Argument 2",
    );
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const indirectBufferRid = assertResource(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    assertDeviceMatch(device, indirectBuffer, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_pass_draw_indirect(
      renderPassRid,
      indirectBufferRid,
      indirectOffset,
    );
  }
  
  drawIndexedIndirect(indirectBuffer, indirectOffset) {
    webidl.assertBranded(this, GPURenderPassEncoderPrototype);
    const prefix =
      "Failed to execute 'drawIndexedIndirect' on 'GPURenderPassEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    indirectBuffer = webidl.converters.GPUBuffer(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    indirectOffset = webidl.converters.GPUSize64(
      indirectOffset,
      prefix,
      "Argument 2",
    );
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const renderPassRid = assertResource(this, prefix, "this");
    const indirectBufferRid = assertResource(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    assertDeviceMatch(device, indirectBuffer, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_pass_draw_indexed_indirect(
      renderPassRid,
      indirectBufferRid,
      indirectOffset,
    );
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPURenderPassEncoderPrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPURenderPassEncoder", GPURenderPassEncoder);
const GPURenderPassEncoderPrototype = GPURenderPassEncoder.prototype;
function createGPUComputePassEncoder(label, encoder, rid) {
  
  const computePassEncoder = webidl.createBranded(GPUComputePassEncoder);
  computePassEncoder[_label] = label;
  computePassEncoder[_encoder] = encoder;
  computePassEncoder[_rid] = rid;
  return computePassEncoder;
}
class GPUComputePassEncoder {
  
  [_encoder];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  setPipeline(pipeline) {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix = "Failed to execute 'setPipeline' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    pipeline = webidl.converters.GPUComputePipeline(
      pipeline,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    const pipelineRid = assertResource(pipeline, prefix, "Argument 1");
    assertDeviceMatch(device, pipeline, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_compute_pass_set_pipeline(computePassRid, pipelineRid);
  }
  
  dispatchWorkgroups(
    workgroupCountX,
    workgroupCountY = 1,
    workgroupCountZ = 1,
  ) {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix =
      "Failed to execute 'dispatchWorkgroups' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    workgroupCountX = webidl.converters.GPUSize32(
      workgroupCountX,
      prefix,
      "Argument 1",
    );
    workgroupCountY = webidl.converters.GPUSize32(
      workgroupCountY,
      prefix,
      "Argument 2",
    );
    workgroupCountZ = webidl.converters.GPUSize32(
      workgroupCountZ,
      prefix,
      "Argument 3",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    op_webgpu_compute_pass_dispatch_workgroups(
      computePassRid,
      workgroupCountX,
      workgroupCountY,
      workgroupCountZ,
    );
  }
  
  dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset) {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix =
      "Failed to execute 'dispatchWorkgroupsIndirect' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    indirectBuffer = webidl.converters.GPUBuffer(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    indirectOffset = webidl.converters.GPUSize64(
      indirectOffset,
      prefix,
      "Argument 2",
    );
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    const indirectBufferRid = assertResource(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    assertDeviceMatch(device, indirectBuffer, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_compute_pass_dispatch_workgroups_indirect(
      computePassRid,
      indirectBufferRid,
      indirectOffset,
    );
  }
  end() {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix = "Failed to execute 'end' on 'GPUComputePassEncoder'";
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    const commandEncoderRid = assertResource(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    const computePassRid = assertResource(this, prefix, "this");
    const { err } = op_webgpu_compute_pass_end(
      commandEncoderRid,
      computePassRid,
    );
    device.pushError(err);
    this[_rid] = undefined;
  }
    setBindGroup(
    index,
    bindGroup,
    dynamicOffsetsData,
    dynamicOffsetsDataStart,
    dynamicOffsetsDataLength,
  ) {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix =
      "Failed to execute 'setBindGroup' on 'GPUComputePassEncoder'";
    const device = assertDevice(
      this[_encoder],
      prefix,
      "encoder referenced by this",
    );
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    const bindGroupRid = assertResource(bindGroup, prefix, "Argument 2");
    assertDeviceMatch(device, bindGroup, {
      prefix,
      resourceContext: "Argument 2",
      selfContext: "this",
    });
    if (
      TypedArrayPrototypeGetSymbolToStringTag(dynamicOffsetsData) !==
        "Uint32Array"
    ) {
      dynamicOffsetsData = new Uint32Array(dynamicOffsetsData ?? []);
      dynamicOffsetsDataStart = 0;
      dynamicOffsetsDataLength = dynamicOffsetsData.length;
    }
    op_webgpu_compute_pass_set_bind_group(
      computePassRid,
      index,
      bindGroupRid,
      dynamicOffsetsData,
      dynamicOffsetsDataStart,
      dynamicOffsetsDataLength,
    );
  }
  
  pushDebugGroup(groupLabel) {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix =
      "Failed to execute 'pushDebugGroup' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    groupLabel = webidl.converters.USVString(groupLabel, prefix, "Argument 1");
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    op_webgpu_compute_pass_push_debug_group(computePassRid, groupLabel);
  }
  popDebugGroup() {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix =
      "Failed to execute 'popDebugGroup' on 'GPUComputePassEncoder'";
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    op_webgpu_compute_pass_pop_debug_group(computePassRid);
  }
  
  insertDebugMarker(markerLabel) {
    webidl.assertBranded(this, GPUComputePassEncoderPrototype);
    const prefix =
      "Failed to execute 'insertDebugMarker' on 'GPUComputePassEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    markerLabel = webidl.converters.USVString(
      markerLabel,
      prefix,
      "Argument 1",
    );
    assertDevice(this[_encoder], prefix, "encoder referenced by this");
    assertResource(this[_encoder], prefix, "encoder referenced by this");
    const computePassRid = assertResource(this, prefix, "this");
    op_webgpu_compute_pass_insert_debug_marker(
      computePassRid,
      markerLabel,
    );
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPUComputePassEncoderPrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUComputePassEncoder", GPUComputePassEncoder);
const GPUComputePassEncoderPrototype = GPUComputePassEncoder.prototype;
function createGPUCommandBuffer(label, device, rid) {
  
  const commandBuffer = webidl.createBranded(GPUCommandBuffer);
  commandBuffer[_label] = label;
  commandBuffer[_device] = device;
  commandBuffer[_rid] = rid;
  return commandBuffer;
}
class GPUCommandBuffer {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUCommandBufferPrototype, this),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUCommandBuffer", GPUCommandBuffer);
const GPUCommandBufferPrototype = GPUCommandBuffer.prototype;
function createGPURenderBundleEncoder(label, device, rid) {
  
  const bundleEncoder = webidl.createBranded(GPURenderBundleEncoder);
  bundleEncoder[_label] = label;
  bundleEncoder[_device] = device;
  bundleEncoder[_rid] = rid;
  return bundleEncoder;
}
class GPURenderBundleEncoder {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  
  finish(descriptor = {}) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix = "Failed to execute 'finish' on 'GPURenderBundleEncoder'";
    descriptor = webidl.converters.GPURenderBundleDescriptor(
      descriptor,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    const { rid, err } = op_webgpu_render_bundle_encoder_finish(
      renderBundleEncoderRid,
      descriptor.label,
    );
    device.pushError(err);
    this[_rid] = undefined;
    const renderBundle = createGPURenderBundle(
      descriptor.label,
      device,
      rid,
    );
    device.trackResource(renderBundle);
    return renderBundle;
  }
    setBindGroup(
    index,
    bindGroup,
    dynamicOffsetsData,
    dynamicOffsetsDataStart,
    dynamicOffsetsDataLength,
  ) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'setBindGroup' on 'GPURenderBundleEncoder'";
    const device = assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    const bindGroupRid = assertResource(bindGroup, prefix, "Argument 2");
    assertDeviceMatch(device, bindGroup, {
      prefix,
      resourceContext: "Argument 2",
      selfContext: "this",
    });
    if (
      TypedArrayPrototypeGetSymbolToStringTag(dynamicOffsetsData) !==
        "Uint32Array"
    ) {
      dynamicOffsetsData = new Uint32Array(dynamicOffsetsData ?? []);
      dynamicOffsetsDataStart = 0;
      dynamicOffsetsDataLength = dynamicOffsetsData.length;
    }
    op_webgpu_render_bundle_encoder_set_bind_group(
      renderBundleEncoderRid,
      index,
      bindGroupRid,
      dynamicOffsetsData,
      dynamicOffsetsDataStart,
      dynamicOffsetsDataLength,
    );
  }
  
  pushDebugGroup(groupLabel) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'pushDebugGroup' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    groupLabel = webidl.converters.USVString(groupLabel, prefix, "Argument 1");
    assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    op_webgpu_render_bundle_encoder_push_debug_group(
      renderBundleEncoderRid,
      groupLabel,
    );
  }
  popDebugGroup() {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'popDebugGroup' on 'GPURenderBundleEncoder'";
    assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    op_webgpu_render_bundle_encoder_pop_debug_group(
      renderBundleEncoderRid,
    );
  }
  
  insertDebugMarker(markerLabel) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'insertDebugMarker' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    markerLabel = webidl.converters.USVString(
      markerLabel,
      prefix,
      "Argument 1",
    );
    assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    op_webgpu_render_bundle_encoder_insert_debug_marker(
      renderBundleEncoderRid,
      markerLabel,
    );
  }
  
  setPipeline(pipeline) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'setPipeline' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    pipeline = webidl.converters.GPURenderPipeline(
      pipeline,
      prefix,
      "Argument 1",
    );
    const device = assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    const pipelineRid = assertResource(pipeline, prefix, "Argument 1");
    assertDeviceMatch(device, pipeline, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_bundle_encoder_set_pipeline(
      renderBundleEncoderRid,
      pipelineRid,
    );
  }
  
  setIndexBuffer(buffer, indexFormat, offset = 0, size = 0) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'setIndexBuffer' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    buffer = webidl.converters.GPUBuffer(buffer, prefix, "Argument 1");
    indexFormat = webidl.converters.GPUIndexFormat(
      indexFormat,
      prefix,
      "Argument 2",
    );
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 3");
    size = webidl.converters.GPUSize64(size, prefix, "Argument 4");
    const device = assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    const bufferRid = assertResource(buffer, prefix, "Argument 1");
    assertDeviceMatch(device, buffer, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_bundle_encoder_set_index_buffer(
      renderBundleEncoderRid,
      bufferRid,
      indexFormat,
      offset,
      size,
    );
  }
  
  setVertexBuffer(slot, buffer, offset = 0, size) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'setVertexBuffer' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    slot = webidl.converters.GPUSize32(slot, prefix, "Argument 1");
    buffer = webidl.converters.GPUBuffer(buffer, prefix, "Argument 2");
    offset = webidl.converters.GPUSize64(offset, prefix, "Argument 3");
    if (size !== undefined) {
      size = webidl.converters.GPUSize64(size, prefix, "Argument 4");
    }
    const device = assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    const bufferRid = assertResource(buffer, prefix, "Argument 2");
    assertDeviceMatch(device, buffer, {
      prefix,
      resourceContext: "Argument 2",
      selfContext: "this",
    });
    op_webgpu_render_bundle_encoder_set_vertex_buffer(
      renderBundleEncoderRid,
      slot,
      bufferRid,
      offset,
      size,
    );
  }
  
  draw(vertexCount, instanceCount = 1, firstVertex = 0, firstInstance = 0) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix = "Failed to execute 'draw' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    vertexCount = webidl.converters.GPUSize32(
      vertexCount,
      prefix,
      "Argument 1",
    );
    instanceCount = webidl.converters.GPUSize32(
      instanceCount,
      prefix,
      "Argument 2",
    );
    firstVertex = webidl.converters.GPUSize32(
      firstVertex,
      prefix,
      "Argument 3",
    );
    firstInstance = webidl.converters.GPUSize32(
      firstInstance,
      prefix,
      "Argument 4",
    );
    assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    op_webgpu_render_bundle_encoder_draw(
      renderBundleEncoderRid,
      vertexCount,
      instanceCount,
      firstVertex,
      firstInstance,
    );
  }
  
  drawIndexed(
    indexCount,
    instanceCount = 1,
    firstIndex = 0,
    baseVertex = 0,
    firstInstance = 0,
  ) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'drawIndexed' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 1, prefix);
    indexCount = webidl.converters.GPUSize32(indexCount, prefix, "Argument 1");
    instanceCount = webidl.converters.GPUSize32(
      instanceCount,
      prefix,
      "Argument 2",
    );
    firstIndex = webidl.converters.GPUSize32(firstIndex, prefix, "Argument 3");
    baseVertex = webidl.converters.GPUSignedOffset32(
      baseVertex,
      prefix,
      "Argument 4",
    );
    firstInstance = webidl.converters.GPUSize32(
      firstInstance,
      prefix,
      "Argument 5",
    );
    assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    op_webgpu_render_bundle_encoder_draw_indexed(
      renderBundleEncoderRid,
      indexCount,
      instanceCount,
      firstIndex,
      baseVertex,
      firstInstance,
    );
  }
  
  drawIndirect(indirectBuffer, indirectOffset) {
    webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
    const prefix =
      "Failed to execute 'drawIndirect' on 'GPURenderBundleEncoder'";
    webidl.requiredArguments(arguments.length, 2, prefix);
    indirectBuffer = webidl.converters.GPUBuffer(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    indirectOffset = webidl.converters.GPUSize64(
      indirectOffset,
      prefix,
      "Argument 2",
    );
    const device = assertDevice(this, prefix, "this");
    const renderBundleEncoderRid = assertResource(this, prefix, "this");
    const indirectBufferRid = assertResource(
      indirectBuffer,
      prefix,
      "Argument 1",
    );
    assertDeviceMatch(device, indirectBuffer, {
      prefix,
      resourceContext: "Argument 1",
      selfContext: "this",
    });
    op_webgpu_render_bundle_encoder_draw_indirect(
      renderBundleEncoderRid,
      indirectBufferRid,
      indirectOffset,
    );
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(
          GPURenderBundleEncoderPrototype,
          this,
        ),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPURenderBundleEncoder", GPURenderBundleEncoder);
const GPURenderBundleEncoderPrototype = GPURenderBundleEncoder.prototype;
function createGPURenderBundle(label, device, rid) {
  
  const bundle = webidl.createBranded(GPURenderBundle);
  bundle[_label] = label;
  bundle[_device] = device;
  bundle[_rid] = rid;
  return bundle;
}
class GPURenderBundle {
  
  [_device];
  
  [_rid];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPURenderBundlePrototype, this),
        keys: [
          "label",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPURenderBundle", GPURenderBundle);
const GPURenderBundlePrototype = GPURenderBundle.prototype;
function createGPUQuerySet(label, device, rid, descriptor) {
  
  const queue = webidl.createBranded(GPUQuerySet);
  queue[_label] = label;
  queue[_device] = device;
  queue[_rid] = rid;
  queue[_descriptor] = descriptor;
  return queue;
}
class GPUQuerySet {
  
  [_device];
  
  [_rid];
  
  [_descriptor];
  
  [_type];
  
  [_count];
  [_cleanup]() {
    const rid = this[_rid];
    if (rid !== undefined) {
      core.close(rid);
      
      this[_rid] = undefined;
    }
  }
  constructor() {
    webidl.illegalConstructor();
  }
  destroy() {
    webidl.assertBranded(this, GPUQuerySetPrototype);
    this[_cleanup]();
  }
  get type() {
    webidl.assertBranded(this, GPUQuerySetPrototype);
    return this[_type]();
  }
  get count() {
    webidl.assertBranded(this, GPUQuerySetPrototype);
    return this[_count]();
  }
  [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
    return inspect(
      createFilteredInspectProxy({
        object: this,
        evaluate: ObjectPrototypeIsPrototypeOf(GPUQuerySetPrototype, this),
        keys: [
          "label",
          "type",
          "count",
        ],
      }),
      inspectOptions,
    );
  }
}
GPUObjectBaseMixin("GPUQuerySet", GPUQuerySet);
const GPUQuerySetPrototype = GPUQuerySet.prototype;
const dictMembersGPUObjectDescriptorBase = [
  { key: "label", converter: webidl.converters["USVString"], defaultValue: "" },
];
webidl.converters["GPUObjectDescriptorBase"] = webidl
  .createDictionaryConverter(
    "GPUObjectDescriptorBase",
    dictMembersGPUObjectDescriptorBase,
  );
webidl.converters.GPUSupportedLimits = webidl.createInterfaceConverter(
  "GPUSupportedLimits",
  GPUSupportedLimits.prototype,
);
webidl.converters.GPUSupportedFeatures = webidl.createInterfaceConverter(
  "GPUSupportedFeatures",
  GPUSupportedFeatures.prototype,
);
webidl.converters.GPU = webidl.createInterfaceConverter("GPU", GPU.prototype);
webidl.converters["GPUPowerPreference"] = webidl.createEnumConverter(
  "GPUPowerPreference",
  [
    "low-power",
    "high-performance",
  ],
);
const dictMembersGPURequestAdapterOptions = [
  {
    key: "powerPreference",
    converter: webidl.converters["GPUPowerPreference"],
  },
  {
    key: "forceFallbackAdapter",
    converter: webidl.converters.boolean,
    defaultValue: false,
  },
];
webidl.converters["GPURequestAdapterOptions"] = webidl
  .createDictionaryConverter(
    "GPURequestAdapterOptions",
    dictMembersGPURequestAdapterOptions,
  );
webidl.converters.GPUAdapter = webidl.createInterfaceConverter(
  "GPUAdapter",
  GPUAdapter.prototype,
);
webidl.converters["GPUFeatureName"] = webidl.createEnumConverter(
  "GPUFeatureName",
  [
        "depth-clip-control",
    "timestamp-query",
    "indirect-first-instance",
        "shader-f16",
        "depth32float-stencil8",
    "texture-compression-bc",
    "texture-compression-etc2",
    "texture-compression-astc",
    "rg11b10ufloat-renderable",
    "bgra8unorm-storage",
    
        "texture-format-16-bit-norm",
    "texture-compression-astc-hdr",
    "texture-adapter-specific-format-features",
            "timestamp-query-inside-passes",
    "mappable-primary-buffers",
    "texture-binding-array",
    "buffer-binding-array",
    "storage-resource-binding-array",
    "sampled-texture-and-storage-buffer-array-non-uniform-indexing",
    "uniform-buffer-and-storage-texture-array-non-uniform-indexing",
    "partially-bound-binding-array",
    "multi-draw-indirect",
    "multi-draw-indirect-count",
    "push-constants",
    "address-mode-clamp-to-zero",
    "address-mode-clamp-to-border",
    "polygon-mode-line",
    "polygon-mode-point",
    "conservative-rasterization",
    "vertex-writable-storage",
    "clear-texture",
    "spirv-shader-passthrough",
    "multiview",
    "vertex-attribute-64-bit",
        "shader-f64",
    "shader-i16",
    "shader-primitive-index",
    "shader-early-depth-test",
  ],
);
webidl.converters["GPUSize32"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters["GPUSize64"] = (V, opts) =>
  webidl.converters["unsigned long long"](V, { ...opts, enforceRange: true });
const dictMembersGPUDeviceDescriptor = [
  {
    key: "requiredFeatures",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUFeatureName"],
    ),
    get defaultValue() {
      return [];
    },
  },
  {
    key: "requiredLimits",
    converter: webidl.createRecordConverter(
      webidl.converters["DOMString"],
      webidl.converters["GPUSize64"],
    ),
  },
];
webidl.converters["GPUDeviceDescriptor"] = webidl.createDictionaryConverter(
  "GPUDeviceDescriptor",
  dictMembersGPUObjectDescriptorBase,
  dictMembersGPUDeviceDescriptor,
);
webidl.converters.GPUDevice = webidl.createInterfaceConverter(
  "GPUDevice",
  GPUDevice.prototype,
);
webidl.converters.GPUBuffer = webidl.createInterfaceConverter(
  "GPUBuffer",
  GPUBuffer.prototype,
);
webidl.converters["GPUBufferUsageFlags"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
const dictMembersGPUBufferDescriptor = [
  { key: "size", converter: webidl.converters["GPUSize64"], required: true },
  {
    key: "usage",
    converter: webidl.converters["GPUBufferUsageFlags"],
    required: true,
  },
  {
    key: "mappedAtCreation",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
];
webidl.converters["GPUBufferDescriptor"] = webidl.createDictionaryConverter(
  "GPUBufferDescriptor",
  dictMembersGPUObjectDescriptorBase,
  dictMembersGPUBufferDescriptor,
);
webidl.converters.GPUBufferUsage = webidl.createInterfaceConverter(
  "GPUBufferUsage",
  GPUBufferUsage.prototype,
);
webidl.converters["GPUMapModeFlags"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters.GPUMapMode = webidl.createInterfaceConverter(
  "GPUMapMode",
  GPUMapMode.prototype,
);
webidl.converters.GPUTexture = webidl.createInterfaceConverter(
  "GPUTexture",
  GPUTexture.prototype,
);
webidl.converters["GPUIntegerCoordinate"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters["sequence<GPUIntegerCoordinate>"] = webidl
  .createSequenceConverter(webidl.converters["GPUIntegerCoordinate"]);
const dictMembersGPUExtent3DDict = [
  {
    key: "width",
    converter: webidl.converters["GPUIntegerCoordinate"],
    required: true,
  },
  {
    key: "height",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 1,
  },
  {
    key: "depthOrArrayLayers",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 1,
  },
];
webidl.converters["GPUExtent3DDict"] = webidl.createDictionaryConverter(
  "GPUExtent3DDict",
  dictMembersGPUExtent3DDict,
);
webidl.converters["GPUExtent3D"] = (V, opts) => {
    if (V === null || V === undefined) {
    return webidl.converters["GPUExtent3DDict"](V, opts);
  }
  if (typeof V === "object") {
    const method = V[SymbolIterator];
    if (method !== undefined) {
      return webidl.converters["sequence<GPUIntegerCoordinate>"](V, opts);
    }
    return webidl.converters["GPUExtent3DDict"](V, opts);
  }
  throw webidl.makeException(
    TypeError,
    "can not be converted to sequence<GPUIntegerCoordinate> or GPUExtent3DDict.",
    opts,
  );
};
webidl.converters["GPUTextureDimension"] = webidl.createEnumConverter(
  "GPUTextureDimension",
  [
    "1d",
    "2d",
    "3d",
  ],
);
webidl.converters["GPUTextureFormat"] = webidl.createEnumConverter(
  "GPUTextureFormat",
  [
    "r8unorm",
    "r8snorm",
    "r8uint",
    "r8sint",
    "r16uint",
    "r16sint",
    "r16float",
    "rg8unorm",
    "rg8snorm",
    "rg8uint",
    "rg8sint",
    "r32uint",
    "r32sint",
    "r32float",
    "rg16uint",
    "rg16sint",
    "rg16float",
    "rgba8unorm",
    "rgba8unorm-srgb",
    "rgba8snorm",
    "rgba8uint",
    "rgba8sint",
    "bgra8unorm",
    "bgra8unorm-srgb",
    "rgb9e5ufloat",
    "rgb10a2unorm",
    "rg11b10ufloat",
    "rg32uint",
    "rg32sint",
    "rg32float",
    "rgba16uint",
    "rgba16sint",
    "rgba16float",
    "rgba32uint",
    "rgba32sint",
    "rgba32float",
    "stencil8",
    "depth16unorm",
    "depth24plus",
    "depth24plus-stencil8",
    "depth32float",
    "depth32float-stencil8",
    "bc1-rgba-unorm",
    "bc1-rgba-unorm-srgb",
    "bc2-rgba-unorm",
    "bc2-rgba-unorm-srgb",
    "bc3-rgba-unorm",
    "bc3-rgba-unorm-srgb",
    "bc4-r-unorm",
    "bc4-r-snorm",
    "bc5-rg-unorm",
    "bc5-rg-snorm",
    "bc6h-rgb-ufloat",
    "bc6h-rgb-float",
    "bc7-rgba-unorm",
    "bc7-rgba-unorm-srgb",
    "etc2-rgb8unorm",
    "etc2-rgb8unorm-srgb",
    "etc2-rgb8a1unorm",
    "etc2-rgb8a1unorm-srgb",
    "etc2-rgba8unorm",
    "etc2-rgba8unorm-srgb",
    "eac-r11unorm",
    "eac-r11snorm",
    "eac-rg11unorm",
    "eac-rg11snorm",
    "astc-4x4-unorm",
    "astc-4x4-unorm-srgb",
    "astc-5x4-unorm",
    "astc-5x4-unorm-srgb",
    "astc-5x5-unorm",
    "astc-5x5-unorm-srgb",
    "astc-6x5-unorm",
    "astc-6x5-unorm-srgb",
    "astc-6x6-unorm",
    "astc-6x6-unorm-srgb",
    "astc-8x5-unorm",
    "astc-8x5-unorm-srgb",
    "astc-8x6-unorm",
    "astc-8x6-unorm-srgb",
    "astc-8x8-unorm",
    "astc-8x8-unorm-srgb",
    "astc-10x5-unorm",
    "astc-10x5-unorm-srgb",
    "astc-10x6-unorm",
    "astc-10x6-unorm-srgb",
    "astc-10x8-unorm",
    "astc-10x8-unorm-srgb",
    "astc-10x10-unorm",
    "astc-10x10-unorm-srgb",
    "astc-12x10-unorm",
    "astc-12x10-unorm-srgb",
    "astc-12x12-unorm",
    "astc-12x12-unorm-srgb",
  ],
);
webidl.converters["GPUTextureUsageFlags"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
const dictMembersGPUTextureDescriptor = [
  {
    key: "size",
    converter: webidl.converters["GPUExtent3D"],
    required: true,
  },
  {
    key: "mipLevelCount",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 1,
  },
  {
    key: "sampleCount",
    converter: webidl.converters["GPUSize32"],
    defaultValue: 1,
  },
  {
    key: "dimension",
    converter: webidl.converters["GPUTextureDimension"],
    defaultValue: "2d",
  },
  {
    key: "format",
    converter: webidl.converters["GPUTextureFormat"],
    required: true,
  },
  {
    key: "usage",
    converter: webidl.converters["GPUTextureUsageFlags"],
    required: true,
  },
  {
    key: "viewFormats",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUTextureFormat"],
    ),
    get defaultValue() {
      return [];
    },
  },
];
webidl.converters["GPUTextureDescriptor"] = webidl.createDictionaryConverter(
  "GPUTextureDescriptor",
  dictMembersGPUObjectDescriptorBase,
  dictMembersGPUTextureDescriptor,
);
webidl.converters.GPUTextureUsage = webidl.createInterfaceConverter(
  "GPUTextureUsage",
  GPUTextureUsage.prototype,
);
webidl.converters.GPUTextureView = webidl.createInterfaceConverter(
  "GPUTextureView",
  GPUTextureView.prototype,
);
webidl.converters["GPUTextureViewDimension"] = webidl.createEnumConverter(
  "GPUTextureViewDimension",
  [
    "1d",
    "2d",
    "2d-array",
    "cube",
    "cube-array",
    "3d",
  ],
);
webidl.converters["GPUTextureAspect"] = webidl.createEnumConverter(
  "GPUTextureAspect",
  [
    "all",
    "stencil-only",
    "depth-only",
  ],
);
const dictMembersGPUTextureViewDescriptor = [
  { key: "format", converter: webidl.converters["GPUTextureFormat"] },
  {
    key: "dimension",
    converter: webidl.converters["GPUTextureViewDimension"],
  },
  {
    key: "aspect",
    converter: webidl.converters["GPUTextureAspect"],
    defaultValue: "all",
  },
  {
    key: "baseMipLevel",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
  {
    key: "mipLevelCount",
    converter: webidl.converters["GPUIntegerCoordinate"],
  },
  {
    key: "baseArrayLayer",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
  {
    key: "arrayLayerCount",
    converter: webidl.converters["GPUIntegerCoordinate"],
  },
];
webidl.converters["GPUTextureViewDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUTextureViewDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUTextureViewDescriptor,
  );
webidl.converters.GPUSampler = webidl.createInterfaceConverter(
  "GPUSampler",
  GPUSampler.prototype,
);
webidl.converters["GPUAddressMode"] = webidl.createEnumConverter(
  "GPUAddressMode",
  [
    "clamp-to-edge",
    "repeat",
    "mirror-repeat",
  ],
);
webidl.converters["GPUFilterMode"] = webidl.createEnumConverter(
  "GPUFilterMode",
  [
    "nearest",
    "linear",
  ],
);
webidl.converters["GPUMipmapFilterMode"] = webidl.createEnumConverter(
  "GPUMipmapFilterMode",
  [
    "nearest",
    "linear",
  ],
);
webidl.converters["GPUCompareFunction"] = webidl.createEnumConverter(
  "GPUCompareFunction",
  [
    "never",
    "less",
    "equal",
    "less-equal",
    "greater",
    "not-equal",
    "greater-equal",
    "always",
  ],
);
const dictMembersGPUSamplerDescriptor = [
  {
    key: "addressModeU",
    converter: webidl.converters["GPUAddressMode"],
    defaultValue: "clamp-to-edge",
  },
  {
    key: "addressModeV",
    converter: webidl.converters["GPUAddressMode"],
    defaultValue: "clamp-to-edge",
  },
  {
    key: "addressModeW",
    converter: webidl.converters["GPUAddressMode"],
    defaultValue: "clamp-to-edge",
  },
  {
    key: "magFilter",
    converter: webidl.converters["GPUFilterMode"],
    defaultValue: "nearest",
  },
  {
    key: "minFilter",
    converter: webidl.converters["GPUFilterMode"],
    defaultValue: "nearest",
  },
  {
    key: "mipmapFilter",
    converter: webidl.converters["GPUMipmapFilterMode"],
    defaultValue: "nearest",
  },
  {
    key: "lodMinClamp",
    converter: webidl.converters["float"],
    defaultValue: 0,
  },
  {
    key: "lodMaxClamp",
    converter: webidl.converters["float"],
    defaultValue: 0xffffffff,
  },
  { key: "compare", converter: webidl.converters["GPUCompareFunction"] },
  {
    key: "maxAnisotropy",
    converter: (V, opts) =>
      webidl.converters["unsigned short"](V, { ...opts, clamp: true }),
    defaultValue: 1,
  },
];
webidl.converters["GPUSamplerDescriptor"] = webidl.createDictionaryConverter(
  "GPUSamplerDescriptor",
  dictMembersGPUObjectDescriptorBase,
  dictMembersGPUSamplerDescriptor,
);
webidl.converters.GPUBindGroupLayout = webidl.createInterfaceConverter(
  "GPUBindGroupLayout",
  GPUBindGroupLayout.prototype,
);
webidl.converters["GPUIndex32"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters["GPUShaderStageFlags"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters["GPUBufferBindingType"] = webidl.createEnumConverter(
  "GPUBufferBindingType",
  [
    "uniform",
    "storage",
    "read-only-storage",
  ],
);
const dictMembersGPUBufferBindingLayout = [
  {
    key: "type",
    converter: webidl.converters["GPUBufferBindingType"],
    defaultValue: "uniform",
  },
  {
    key: "hasDynamicOffset",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
  {
    key: "minBindingSize",
    converter: webidl.converters["GPUSize64"],
    defaultValue: 0,
  },
];
webidl.converters["GPUBufferBindingLayout"] = webidl
  .createDictionaryConverter(
    "GPUBufferBindingLayout",
    dictMembersGPUBufferBindingLayout,
  );
webidl.converters["GPUSamplerBindingType"] = webidl.createEnumConverter(
  "GPUSamplerBindingType",
  [
    "filtering",
    "non-filtering",
    "comparison",
  ],
);
const dictMembersGPUSamplerBindingLayout = [
  {
    key: "type",
    converter: webidl.converters["GPUSamplerBindingType"],
    defaultValue: "filtering",
  },
];
webidl.converters["GPUSamplerBindingLayout"] = webidl
  .createDictionaryConverter(
    "GPUSamplerBindingLayout",
    dictMembersGPUSamplerBindingLayout,
  );
webidl.converters["GPUTextureSampleType"] = webidl.createEnumConverter(
  "GPUTextureSampleType",
  [
    "float",
    "unfilterable-float",
    "depth",
    "sint",
    "uint",
  ],
);
const dictMembersGPUTextureBindingLayout = [
  {
    key: "sampleType",
    converter: webidl.converters["GPUTextureSampleType"],
    defaultValue: "float",
  },
  {
    key: "viewDimension",
    converter: webidl.converters["GPUTextureViewDimension"],
    defaultValue: "2d",
  },
  {
    key: "multisampled",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
];
webidl.converters["GPUTextureBindingLayout"] = webidl
  .createDictionaryConverter(
    "GPUTextureBindingLayout",
    dictMembersGPUTextureBindingLayout,
  );
webidl.converters["GPUStorageTextureAccess"] = webidl.createEnumConverter(
  "GPUStorageTextureAccess",
  [
    "write-only",
  ],
);
const dictMembersGPUStorageTextureBindingLayout = [
  {
    key: "access",
    converter: webidl.converters["GPUStorageTextureAccess"],
    defaultValue: "write-only",
  },
  {
    key: "format",
    converter: webidl.converters["GPUTextureFormat"],
    required: true,
  },
  {
    key: "viewDimension",
    converter: webidl.converters["GPUTextureViewDimension"],
    defaultValue: "2d",
  },
];
webidl.converters["GPUStorageTextureBindingLayout"] = webidl
  .createDictionaryConverter(
    "GPUStorageTextureBindingLayout",
    dictMembersGPUStorageTextureBindingLayout,
  );
const dictMembersGPUBindGroupLayoutEntry = [
  {
    key: "binding",
    converter: webidl.converters["GPUIndex32"],
    required: true,
  },
  {
    key: "visibility",
    converter: webidl.converters["GPUShaderStageFlags"],
    required: true,
  },
  { key: "buffer", converter: webidl.converters["GPUBufferBindingLayout"] },
  { key: "sampler", converter: webidl.converters["GPUSamplerBindingLayout"] },
  { key: "texture", converter: webidl.converters["GPUTextureBindingLayout"] },
  {
    key: "storageTexture",
    converter: webidl.converters["GPUStorageTextureBindingLayout"],
  },
];
webidl.converters["GPUBindGroupLayoutEntry"] = webidl
  .createDictionaryConverter(
    "GPUBindGroupLayoutEntry",
    dictMembersGPUBindGroupLayoutEntry,
  );
const dictMembersGPUBindGroupLayoutDescriptor = [
  {
    key: "entries",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUBindGroupLayoutEntry"],
    ),
    required: true,
  },
];
webidl.converters["GPUBindGroupLayoutDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUBindGroupLayoutDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUBindGroupLayoutDescriptor,
  );
webidl.converters.GPUShaderStage = webidl.createInterfaceConverter(
  "GPUShaderStage",
  GPUShaderStage.prototype,
);
webidl.converters.GPUBindGroup = webidl.createInterfaceConverter(
  "GPUBindGroup",
  GPUBindGroup.prototype,
);
const dictMembersGPUBufferBinding = [
  {
    key: "buffer",
    converter: webidl.converters["GPUBuffer"],
    required: true,
  },
  {
    key: "offset",
    converter: webidl.converters["GPUSize64"],
    defaultValue: 0,
  },
  { key: "size", converter: webidl.converters["GPUSize64"] },
];
webidl.converters["GPUBufferBinding"] = webidl.createDictionaryConverter(
  "GPUBufferBinding",
  dictMembersGPUBufferBinding,
);
webidl.converters["GPUBindingResource"] =
  webidl.converters.any ;
const dictMembersGPUBindGroupEntry = [
  {
    key: "binding",
    converter: webidl.converters["GPUIndex32"],
    required: true,
  },
  {
    key: "resource",
    converter: webidl.converters["GPUBindingResource"],
    required: true,
  },
];
webidl.converters["GPUBindGroupEntry"] = webidl.createDictionaryConverter(
  "GPUBindGroupEntry",
  dictMembersGPUBindGroupEntry,
);
const dictMembersGPUBindGroupDescriptor = [
  {
    key: "layout",
    converter: webidl.converters["GPUBindGroupLayout"],
    required: true,
  },
  {
    key: "entries",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUBindGroupEntry"],
    ),
    required: true,
  },
];
webidl.converters["GPUBindGroupDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUBindGroupDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUBindGroupDescriptor,
  );
webidl.converters.GPUPipelineLayout = webidl.createInterfaceConverter(
  "GPUPipelineLayout",
  GPUPipelineLayout.prototype,
);
const dictMembersGPUPipelineLayoutDescriptor = [
  {
    key: "bindGroupLayouts",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUBindGroupLayout"],
    ),
    required: true,
  },
];
webidl.converters["GPUPipelineLayoutDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUPipelineLayoutDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUPipelineLayoutDescriptor,
  );
webidl.converters.GPUShaderModule = webidl.createInterfaceConverter(
  "GPUShaderModule",
  GPUShaderModule.prototype,
);
const dictMembersGPUShaderModuleDescriptor = [
  {
    key: "code",
    converter: webidl.converters["DOMString"],
    required: true,
  },
];
webidl.converters["GPUShaderModuleDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUShaderModuleDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUShaderModuleDescriptor,
  );
webidl.converters["GPUAutoLayoutMode"] = webidl.createEnumConverter(
  "GPUAutoLayoutMode",
  [
    "auto",
  ],
);
webidl.converters["GPUPipelineLayout or GPUAutoLayoutMode"] = (V, opts) => {
  if (typeof V === "object") {
    return webidl.converters["GPUPipelineLayout"](V, opts);
  }
  return webidl.converters["GPUAutoLayoutMode"](V, opts);
};
const dictMembersGPUPipelineDescriptorBase = [
  {
    key: "layout",
    converter: webidl.converters["GPUPipelineLayout or GPUAutoLayoutMode"],
    required: true,
  },
];
webidl.converters["GPUPipelineDescriptorBase"] = webidl
  .createDictionaryConverter(
    "GPUPipelineDescriptorBase",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUPipelineDescriptorBase,
  );
webidl.converters.GPUPipelineConstantValue = webidl.converters.double;
webidl.converters["record<USVString, GPUPipelineConstantValue>"] = webidl
  .createRecordConverter(
    webidl.converters.USVString,
    webidl.converters.GPUPipelineConstantValue,
  );
const dictMembersGPUProgrammableStage = [
  {
    key: "module",
    converter: webidl.converters["GPUShaderModule"],
    required: true,
  },
  {
    key: "entryPoint",
    converter: webidl.converters["USVString"],
    required: true,
  },
  {
    key: "constants",
    converter: webidl.converters["record<USVString, GPUPipelineConstantValue>"],
  },
];
webidl.converters["GPUProgrammableStage"] = webidl.createDictionaryConverter(
  "GPUProgrammableStage",
  dictMembersGPUProgrammableStage,
);
webidl.converters.GPUComputePipeline = webidl.createInterfaceConverter(
  "GPUComputePipeline",
  GPUComputePipeline.prototype,
);
const dictMembersGPUComputePipelineDescriptor = [
  {
    key: "compute",
    converter: webidl.converters["GPUProgrammableStage"],
    required: true,
  },
];
webidl.converters["GPUComputePipelineDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUComputePipelineDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUPipelineDescriptorBase,
    dictMembersGPUComputePipelineDescriptor,
  );
webidl.converters.GPURenderPipeline = webidl.createInterfaceConverter(
  "GPURenderPipeline",
  GPURenderPipeline.prototype,
);
webidl.converters["GPUVertexStepMode"] = webidl.createEnumConverter(
  "GPUVertexStepMode",
  [
    "vertex",
    "instance",
  ],
);
webidl.converters["GPUVertexFormat"] = webidl.createEnumConverter(
  "GPUVertexFormat",
  [
    "uint8x2",
    "uint8x4",
    "sint8x2",
    "sint8x4",
    "unorm8x2",
    "unorm8x4",
    "snorm8x2",
    "snorm8x4",
    "uint16x2",
    "uint16x4",
    "sint16x2",
    "sint16x4",
    "unorm16x2",
    "unorm16x4",
    "snorm16x2",
    "snorm16x4",
    "float16x2",
    "float16x4",
    "float32",
    "float32x2",
    "float32x3",
    "float32x4",
    "uint32",
    "uint32x2",
    "uint32x3",
    "uint32x4",
    "sint32",
    "sint32x2",
    "sint32x3",
    "sint32x4",
  ],
);
const dictMembersGPUVertexAttribute = [
  {
    key: "format",
    converter: webidl.converters["GPUVertexFormat"],
    required: true,
  },
  {
    key: "offset",
    converter: webidl.converters["GPUSize64"],
    required: true,
  },
  {
    key: "shaderLocation",
    converter: webidl.converters["GPUIndex32"],
    required: true,
  },
];
webidl.converters["GPUVertexAttribute"] = webidl.createDictionaryConverter(
  "GPUVertexAttribute",
  dictMembersGPUVertexAttribute,
);
const dictMembersGPUVertexBufferLayout = [
  {
    key: "arrayStride",
    converter: webidl.converters["GPUSize64"],
    required: true,
  },
  {
    key: "stepMode",
    converter: webidl.converters["GPUVertexStepMode"],
    defaultValue: "vertex",
  },
  {
    key: "attributes",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUVertexAttribute"],
    ),
    required: true,
  },
];
webidl.converters["GPUVertexBufferLayout"] = webidl.createDictionaryConverter(
  "GPUVertexBufferLayout",
  dictMembersGPUVertexBufferLayout,
);
const dictMembersGPUVertexState = [
  {
    key: "buffers",
    converter: webidl.createSequenceConverter(
      webidl.createNullableConverter(
        webidl.converters["GPUVertexBufferLayout"],
      ),
    ),
    get defaultValue() {
      return [];
    },
  },
];
webidl.converters["GPUVertexState"] = webidl.createDictionaryConverter(
  "GPUVertexState",
  dictMembersGPUProgrammableStage,
  dictMembersGPUVertexState,
);
webidl.converters["GPUPrimitiveTopology"] = webidl.createEnumConverter(
  "GPUPrimitiveTopology",
  [
    "point-list",
    "line-list",
    "line-strip",
    "triangle-list",
    "triangle-strip",
  ],
);
webidl.converters["GPUIndexFormat"] = webidl.createEnumConverter(
  "GPUIndexFormat",
  [
    "uint16",
    "uint32",
  ],
);
webidl.converters["GPUFrontFace"] = webidl.createEnumConverter(
  "GPUFrontFace",
  [
    "ccw",
    "cw",
  ],
);
webidl.converters["GPUCullMode"] = webidl.createEnumConverter("GPUCullMode", [
  "none",
  "front",
  "back",
]);
const dictMembersGPUPrimitiveState = [
  {
    key: "topology",
    converter: webidl.converters["GPUPrimitiveTopology"],
    defaultValue: "triangle-list",
  },
  { key: "stripIndexFormat", converter: webidl.converters["GPUIndexFormat"] },
  {
    key: "frontFace",
    converter: webidl.converters["GPUFrontFace"],
    defaultValue: "ccw",
  },
  {
    key: "cullMode",
    converter: webidl.converters["GPUCullMode"],
    defaultValue: "none",
  },
  {
    key: "unclippedDepth",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
];
webidl.converters["GPUPrimitiveState"] = webidl.createDictionaryConverter(
  "GPUPrimitiveState",
  dictMembersGPUPrimitiveState,
);
webidl.converters["GPUStencilOperation"] = webidl.createEnumConverter(
  "GPUStencilOperation",
  [
    "keep",
    "zero",
    "replace",
    "invert",
    "increment-clamp",
    "decrement-clamp",
    "increment-wrap",
    "decrement-wrap",
  ],
);
const dictMembersGPUStencilFaceState = [
  {
    key: "compare",
    converter: webidl.converters["GPUCompareFunction"],
    defaultValue: "always",
  },
  {
    key: "failOp",
    converter: webidl.converters["GPUStencilOperation"],
    defaultValue: "keep",
  },
  {
    key: "depthFailOp",
    converter: webidl.converters["GPUStencilOperation"],
    defaultValue: "keep",
  },
  {
    key: "passOp",
    converter: webidl.converters["GPUStencilOperation"],
    defaultValue: "keep",
  },
];
webidl.converters["GPUStencilFaceState"] = webidl.createDictionaryConverter(
  "GPUStencilFaceState",
  dictMembersGPUStencilFaceState,
);
webidl.converters["GPUStencilValue"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters["GPUDepthBias"] = (V, opts) =>
  webidl.converters["long"](V, { ...opts, enforceRange: true });
const dictMembersGPUDepthStencilState = [
  {
    key: "format",
    converter: webidl.converters["GPUTextureFormat"],
    required: true,
  },
  {
    key: "depthWriteEnabled",
    converter: webidl.converters["boolean"],
    required: true,
  },
  {
    key: "depthCompare",
    converter: webidl.converters["GPUCompareFunction"],
    required: true,
  },
  {
    key: "stencilFront",
    converter: webidl.converters["GPUStencilFaceState"],
    get defaultValue() {
      return {};
    },
  },
  {
    key: "stencilBack",
    converter: webidl.converters["GPUStencilFaceState"],
    get defaultValue() {
      return {};
    },
  },
  {
    key: "stencilReadMask",
    converter: webidl.converters["GPUStencilValue"],
    defaultValue: 0xFFFFFFFF,
  },
  {
    key: "stencilWriteMask",
    converter: webidl.converters["GPUStencilValue"],
    defaultValue: 0xFFFFFFFF,
  },
  {
    key: "depthBias",
    converter: webidl.converters["GPUDepthBias"],
    defaultValue: 0,
  },
  {
    key: "depthBiasSlopeScale",
    converter: webidl.converters["float"],
    defaultValue: 0,
  },
  {
    key: "depthBiasClamp",
    converter: webidl.converters["float"],
    defaultValue: 0,
  },
];
webidl.converters["GPUDepthStencilState"] = webidl.createDictionaryConverter(
  "GPUDepthStencilState",
  dictMembersGPUDepthStencilState,
);
webidl.converters["GPUSampleMask"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
const dictMembersGPUMultisampleState = [
  {
    key: "count",
    converter: webidl.converters["GPUSize32"],
    defaultValue: 1,
  },
  {
    key: "mask",
    converter: webidl.converters["GPUSampleMask"],
    defaultValue: 0xFFFFFFFF,
  },
  {
    key: "alphaToCoverageEnabled",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
];
webidl.converters["GPUMultisampleState"] = webidl.createDictionaryConverter(
  "GPUMultisampleState",
  dictMembersGPUMultisampleState,
);
webidl.converters["GPUBlendFactor"] = webidl.createEnumConverter(
  "GPUBlendFactor",
  [
    "zero",
    "one",
    "src",
    "one-minus-src",
    "src-alpha",
    "one-minus-src-alpha",
    "dst",
    "one-minus-dst",
    "dst-alpha",
    "one-minus-dst-alpha",
    "src-alpha-saturated",
    "constant",
    "one-minus-constant",
  ],
);
webidl.converters["GPUBlendOperation"] = webidl.createEnumConverter(
  "GPUBlendOperation",
  [
    "add",
    "subtract",
    "reverse-subtract",
    "min",
    "max",
  ],
);
const dictMembersGPUBlendComponent = [
  {
    key: "srcFactor",
    converter: webidl.converters["GPUBlendFactor"],
    defaultValue: "one",
  },
  {
    key: "dstFactor",
    converter: webidl.converters["GPUBlendFactor"],
    defaultValue: "zero",
  },
  {
    key: "operation",
    converter: webidl.converters["GPUBlendOperation"],
    defaultValue: "add",
  },
];
webidl.converters["GPUBlendComponent"] = webidl.createDictionaryConverter(
  "GPUBlendComponent",
  dictMembersGPUBlendComponent,
);
const dictMembersGPUBlendState = [
  {
    key: "color",
    converter: webidl.converters["GPUBlendComponent"],
    required: true,
  },
  {
    key: "alpha",
    converter: webidl.converters["GPUBlendComponent"],
    required: true,
  },
];
webidl.converters["GPUBlendState"] = webidl.createDictionaryConverter(
  "GPUBlendState",
  dictMembersGPUBlendState,
);
webidl.converters["GPUColorWriteFlags"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
const dictMembersGPUColorTargetState = [
  {
    key: "format",
    converter: webidl.converters["GPUTextureFormat"],
    required: true,
  },
  { key: "blend", converter: webidl.converters["GPUBlendState"] },
  {
    key: "writeMask",
    converter: webidl.converters["GPUColorWriteFlags"],
    defaultValue: 0xF,
  },
];
webidl.converters["GPUColorTargetState"] = webidl.createDictionaryConverter(
  "GPUColorTargetState",
  dictMembersGPUColorTargetState,
);
const dictMembersGPUFragmentState = [
  {
    key: "targets",
    converter: webidl.createSequenceConverter(
      webidl.createNullableConverter(
        webidl.converters["GPUColorTargetState"],
      ),
    ),
    required: true,
  },
];
webidl.converters["GPUFragmentState"] = webidl.createDictionaryConverter(
  "GPUFragmentState",
  dictMembersGPUProgrammableStage,
  dictMembersGPUFragmentState,
);
const dictMembersGPURenderPipelineDescriptor = [
  {
    key: "vertex",
    converter: webidl.converters["GPUVertexState"],
    required: true,
  },
  {
    key: "primitive",
    converter: webidl.converters["GPUPrimitiveState"],
    get defaultValue() {
      return {};
    },
  },
  {
    key: "depthStencil",
    converter: webidl.converters["GPUDepthStencilState"],
  },
  {
    key: "multisample",
    converter: webidl.converters["GPUMultisampleState"],
    get defaultValue() {
      return {};
    },
  },
  { key: "fragment", converter: webidl.converters["GPUFragmentState"] },
];
webidl.converters["GPURenderPipelineDescriptor"] = webidl
  .createDictionaryConverter(
    "GPURenderPipelineDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUPipelineDescriptorBase,
    dictMembersGPURenderPipelineDescriptor,
  );
webidl.converters.GPUColorWrite = webidl.createInterfaceConverter(
  "GPUColorWrite",
  GPUColorWrite.prototype,
);
webidl.converters.GPUCommandBuffer = webidl.createInterfaceConverter(
  "GPUCommandBuffer",
  GPUCommandBuffer.prototype,
);
webidl.converters["sequence<GPUCommandBuffer>"] = webidl
  .createSequenceConverter(webidl.converters["GPUCommandBuffer"]);
const dictMembersGPUCommandBufferDescriptor = [];
webidl.converters["GPUCommandBufferDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUCommandBufferDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUCommandBufferDescriptor,
  );
webidl.converters.GPUCommandEncoder = webidl.createInterfaceConverter(
  "GPUCommandEncoder",
  GPUCommandEncoder.prototype,
);
const dictMembersGPUCommandEncoderDescriptor = [];
webidl.converters["GPUCommandEncoderDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUCommandEncoderDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUCommandEncoderDescriptor,
  );
const dictMembersGPUImageDataLayout = [
  {
    key: "offset",
    converter: webidl.converters["GPUSize64"],
    defaultValue: 0,
  },
  { key: "bytesPerRow", converter: webidl.converters["GPUSize32"] },
  { key: "rowsPerImage", converter: webidl.converters["GPUSize32"] },
];
webidl.converters["GPUImageDataLayout"] = webidl.createDictionaryConverter(
  "GPUImageDataLayout",
  dictMembersGPUImageDataLayout,
);
const dictMembersGPUImageCopyBuffer = [
  {
    key: "buffer",
    converter: webidl.converters["GPUBuffer"],
    required: true,
  },
];
webidl.converters["GPUImageCopyBuffer"] = webidl.createDictionaryConverter(
  "GPUImageCopyBuffer",
  dictMembersGPUImageDataLayout,
  dictMembersGPUImageCopyBuffer,
);
const dictMembersGPUOrigin3DDict = [
  {
    key: "x",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
  {
    key: "y",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
  {
    key: "z",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
];
webidl.converters["GPUOrigin3DDict"] = webidl.createDictionaryConverter(
  "GPUOrigin3DDict",
  dictMembersGPUOrigin3DDict,
);
webidl.converters["GPUOrigin3D"] = (V, opts) => {
    if (V === null || V === undefined) {
    return webidl.converters["GPUOrigin3DDict"](V, opts);
  }
  if (typeof V === "object") {
    const method = V[SymbolIterator];
    if (method !== undefined) {
      return webidl.converters["sequence<GPUIntegerCoordinate>"](V, opts);
    }
    return webidl.converters["GPUOrigin3DDict"](V, opts);
  }
  throw webidl.makeException(
    TypeError,
    "can not be converted to sequence<GPUIntegerCoordinate> or GPUOrigin3DDict.",
    opts,
  );
};
const dictMembersGPUImageCopyTexture = [
  {
    key: "texture",
    converter: webidl.converters["GPUTexture"],
    required: true,
  },
  {
    key: "mipLevel",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
  {
    key: "origin",
    converter: webidl.converters["GPUOrigin3D"],
    get defaultValue() {
      return {};
    },
  },
  {
    key: "aspect",
    converter: webidl.converters["GPUTextureAspect"],
    defaultValue: "all",
  },
];
webidl.converters["GPUImageCopyTexture"] = webidl.createDictionaryConverter(
  "GPUImageCopyTexture",
  dictMembersGPUImageCopyTexture,
);
const dictMembersGPUOrigin2DDict = [
  {
    key: "x",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
  {
    key: "y",
    converter: webidl.converters["GPUIntegerCoordinate"],
    defaultValue: 0,
  },
];
webidl.converters["GPUOrigin2DDict"] = webidl.createDictionaryConverter(
  "GPUOrigin2DDict",
  dictMembersGPUOrigin2DDict,
);
webidl.converters["GPUOrigin2D"] = (V, opts) => {
    if (V === null || V === undefined) {
    return webidl.converters["GPUOrigin2DDict"](V, opts);
  }
  if (typeof V === "object") {
    const method = V[SymbolIterator];
    if (method !== undefined) {
      return webidl.converters["sequence<GPUIntegerCoordinate>"](V, opts);
    }
    return webidl.converters["GPUOrigin2DDict"](V, opts);
  }
  throw webidl.makeException(
    TypeError,
    "can not be converted to sequence<GPUIntegerCoordinate> or GPUOrigin2DDict.",
    opts,
  );
};
webidl.converters.GPUComputePassEncoder = webidl.createInterfaceConverter(
  "GPUComputePassEncoder",
  GPUComputePassEncoder.prototype,
);
webidl.converters["GPUComputePassTimestampWrites"] = webidl
  .createDictionaryConverter(
    "GPUComputePassTimestampWrites",
    [
      {
        key: "querySet",
        converter: webidl.converters["GPUQuerySet"],
        required: true,
      },
      {
        key: "beginningOfPassWriteIndex",
        converter: webidl.converters["GPUSize32"],
      },
      {
        key: "endOfPassWriteIndex",
        converter: webidl.converters["GPUSize32"],
      },
    ],
  );
const dictMembersGPUComputePassDescriptor = [
  {
    key: "timestampWrites",
    converter: webidl.converters["GPUComputePassTimestampWrites"],
  },
];
webidl.converters["GPUComputePassDescriptor"] = webidl
  .createDictionaryConverter(
    "GPUComputePassDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPUComputePassDescriptor,
  );
webidl.converters.GPURenderPassEncoder = webidl.createInterfaceConverter(
  "GPURenderPassEncoder",
  GPURenderPassEncoder.prototype,
);
webidl.converters["GPULoadOp"] = webidl.createEnumConverter("GPULoadOp", [
  "load",
  "clear",
]);
const dictMembersGPUColorDict = [
  { key: "r", converter: webidl.converters["double"], required: true },
  { key: "g", converter: webidl.converters["double"], required: true },
  { key: "b", converter: webidl.converters["double"], required: true },
  { key: "a", converter: webidl.converters["double"], required: true },
];
webidl.converters["GPUColorDict"] = webidl.createDictionaryConverter(
  "GPUColorDict",
  dictMembersGPUColorDict,
);
webidl.converters["GPUColor"] = (V, opts) => {
    if (V === null || V === undefined) {
    return webidl.converters["GPUColorDict"](V, opts);
  }
  if (typeof V === "object") {
    const method = V[SymbolIterator];
    if (method !== undefined) {
      return webidl.converters["sequence<double>"](V, opts);
    }
    return webidl.converters["GPUColorDict"](V, opts);
  }
  throw webidl.makeException(
    TypeError,
    "can not be converted to sequence<double> or GPUColorDict.",
    opts,
  );
};
webidl.converters["GPUStoreOp"] = webidl.createEnumConverter("GPUStoreOp", [
  "store",
  "discard",
]);
const dictMembersGPURenderPassColorAttachment = [
  {
    key: "view",
    converter: webidl.converters["GPUTextureView"],
    required: true,
  },
  { key: "resolveTarget", converter: webidl.converters["GPUTextureView"] },
  {
    key: "clearValue",
    converter: webidl.converters["GPUColor"],
  },
  {
    key: "loadOp",
    converter: webidl.converters["GPULoadOp"],
    required: true,
  },
  {
    key: "storeOp",
    converter: webidl.converters["GPUStoreOp"],
    required: true,
  },
];
webidl.converters["GPURenderPassColorAttachment"] = webidl
  .createDictionaryConverter(
    "GPURenderPassColorAttachment",
    dictMembersGPURenderPassColorAttachment,
  );
const dictMembersGPURenderPassDepthStencilAttachment = [
  {
    key: "view",
    converter: webidl.converters["GPUTextureView"],
    required: true,
  },
  {
    key: "depthClearValue",
    converter: webidl.converters["float"],
  },
  {
    key: "depthLoadOp",
    converter: webidl.converters["GPULoadOp"],
  },
  {
    key: "depthStoreOp",
    converter: webidl.converters["GPUStoreOp"],
  },
  {
    key: "depthReadOnly",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
  {
    key: "stencilClearValue",
    converter: webidl.converters["GPUStencilValue"],
    defaultValue: 0,
  },
  {
    key: "stencilLoadOp",
    converter: webidl.converters["GPULoadOp"],
  },
  {
    key: "stencilStoreOp",
    converter: webidl.converters["GPUStoreOp"],
  },
  {
    key: "stencilReadOnly",
    converter: webidl.converters["boolean"],
    defaultValue: false,
  },
];
webidl.converters["GPURenderPassDepthStencilAttachment"] = webidl
  .createDictionaryConverter(
    "GPURenderPassDepthStencilAttachment",
    dictMembersGPURenderPassDepthStencilAttachment,
  );
webidl.converters.GPUQuerySet = webidl.createInterfaceConverter(
  "GPUQuerySet",
  GPUQuerySet.prototype,
);
webidl.converters["GPURenderPassTimestampWrites"] = webidl
  .createDictionaryConverter(
    "GPURenderPassTimestampWrites",
    [
      {
        key: "querySet",
        converter: webidl.converters["GPUQuerySet"],
        required: true,
      },
      {
        key: "beginningOfPassWriteIndex",
        converter: webidl.converters["GPUSize32"],
      },
      {
        key: "endOfPassWriteIndex",
        converter: webidl.converters["GPUSize32"],
      },
    ],
  );
const dictMembersGPURenderPassDescriptor = [
  {
    key: "colorAttachments",
    converter: webidl.createSequenceConverter(
      webidl.createNullableConverter(
        webidl.converters["GPURenderPassColorAttachment"],
      ),
    ),
    required: true,
  },
  {
    key: "depthStencilAttachment",
    converter: webidl.converters["GPURenderPassDepthStencilAttachment"],
  },
  {
    key: "occlusionQuerySet",
    converter: webidl.converters["GPUQuerySet"],
  },
  {
    key: "timestampWrites",
    converter: webidl.converters["GPURenderPassTimestampWrites"],
  },
];
webidl.converters["GPURenderPassDescriptor"] = webidl
  .createDictionaryConverter(
    "GPURenderPassDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPURenderPassDescriptor,
  );
webidl.converters.GPURenderBundle = webidl.createInterfaceConverter(
  "GPURenderBundle",
  GPURenderBundle.prototype,
);
webidl.converters["sequence<GPURenderBundle>"] = webidl
  .createSequenceConverter(webidl.converters["GPURenderBundle"]);
const dictMembersGPURenderBundleDescriptor = [];
webidl.converters["GPURenderBundleDescriptor"] = webidl
  .createDictionaryConverter(
    "GPURenderBundleDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPURenderBundleDescriptor,
  );
webidl.converters.GPURenderBundleEncoder = webidl.createInterfaceConverter(
  "GPURenderBundleEncoder",
  GPURenderBundleEncoder.prototype,
);
const dictMembersGPURenderPassLayout = [
  {
    key: "colorFormats",
    converter: webidl.createSequenceConverter(
      webidl.createNullableConverter(webidl.converters["GPUTextureFormat"]),
    ),
    required: true,
  },
  {
    key: "depthStencilFormat",
    converter: webidl.converters["GPUTextureFormat"],
  },
  {
    key: "sampleCount",
    converter: webidl.converters["GPUSize32"],
    defaultValue: 1,
  },
];
webidl.converters["GPURenderPassLayout"] = webidl
  .createDictionaryConverter(
    "GPURenderPassLayout",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPURenderPassLayout,
  );
const dictMembersGPURenderBundleEncoderDescriptor = [
  {
    key: "depthReadOnly",
    converter: webidl.converters.boolean,
    defaultValue: false,
  },
  {
    key: "stencilReadOnly",
    converter: webidl.converters.boolean,
    defaultValue: false,
  },
];
webidl.converters["GPURenderBundleEncoderDescriptor"] = webidl
  .createDictionaryConverter(
    "GPURenderBundleEncoderDescriptor",
    dictMembersGPUObjectDescriptorBase,
    dictMembersGPURenderPassLayout,
    dictMembersGPURenderBundleEncoderDescriptor,
  );
webidl.converters.GPUQueue = webidl.createInterfaceConverter(
  "GPUQueue",
  GPUQueue.prototype,
);
webidl.converters["GPUQueryType"] = webidl.createEnumConverter(
  "GPUQueryType",
  [
    "occlusion",
    "timestamp",
  ],
);
const dictMembersGPUQuerySetDescriptor = [
  {
    key: "type",
    converter: webidl.converters["GPUQueryType"],
    required: true,
  },
  { key: "count", converter: webidl.converters["GPUSize32"], required: true },
  {
    key: "pipelineStatistics",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUPipelineStatisticName"],
    ),
    get defaultValue() {
      return [];
    },
  },
];
webidl.converters["GPUQuerySetDescriptor"] = webidl.createDictionaryConverter(
  "GPUQuerySetDescriptor",
  dictMembersGPUObjectDescriptorBase,
  dictMembersGPUQuerySetDescriptor,
);
webidl.converters["GPUDeviceLostReason"] = webidl.createEnumConverter(
  "GPUDeviceLostReason",
  [
    "destroyed",
  ],
);
webidl.converters["GPUErrorFilter"] = webidl.createEnumConverter(
  "GPUErrorFilter",
  [
    "out-of-memory",
    "validation",
  ],
);
webidl.converters.GPUOutOfMemoryError = webidl.createInterfaceConverter(
  "GPUOutOfMemoryError",
  GPUOutOfMemoryError.prototype,
);
webidl.converters.GPUValidationError = webidl.createInterfaceConverter(
  "GPUValidationError",
  GPUValidationError.prototype,
);
webidl.converters["GPUError"] = webidl.converters.any ;
const dictMembersGPUUncapturedErrorEventInit = [
  { key: "error", converter: webidl.converters["GPUError"], required: true },
];
webidl.converters["GPUUncapturedErrorEventInit"] = webidl
  .createDictionaryConverter(
    "GPUUncapturedErrorEventInit",
        dictMembersGPUUncapturedErrorEventInit,
  );
webidl.converters["GPUBufferDynamicOffset"] = (V, opts) =>
  webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
webidl.converters["GPUSignedOffset32"] = (V, opts) =>
  webidl.converters["long"](V, { ...opts, enforceRange: true });
webidl.converters["GPUFlagsConstant"] = webidl.converters["unsigned long"];
webidl.converters["GPUCanvasAlphaMode"] = webidl.createEnumConverter(
  "GPUCanvasAlphaMode",
  [
    "opaque",
    "premultiplied",
  ],
);
webidl.converters["GPUPresentMode"] = webidl.createEnumConverter(
  "GPUPresentMode",
  [
    "autoVsync",
    "autoNoVsync",
    "fifo",
    "fifoRelaxed",
    "immediate",
    "mailbox",
  ],
);
const dictMembersGPUCanvasConfiguration = [
  { key: "device", converter: webidl.converters.GPUDevice, required: true },
  {
    key: "format",
    converter: webidl.converters.GPUTextureFormat,
    required: true,
  },
  {
    key: "usage",
    converter: webidl.converters["GPUTextureUsageFlags"],
    defaultValue: GPUTextureUsage.RENDER_ATTACHMENT,
  },
  {
    key: "alphaMode",
    converter: webidl.converters["GPUCanvasAlphaMode"],
    defaultValue: "opaque",
  },
    {
    key: "presentMode",
    converter: webidl.converters["GPUPresentMode"],
  },
  {
    key: "width",
    converter: webidl.converters["long"],
    required: true,
  },
  {
    key: "height",
    converter: webidl.converters["long"],
    required: true,
  },
  {
    key: "viewFormats",
    converter: webidl.createSequenceConverter(
      webidl.converters["GPUTextureFormat"],
    ),
    get defaultValue() {
      return [];
    },
  },
];
webidl.converters["GPUCanvasConfiguration"] = webidl
  .createDictionaryConverter(
    "GPUCanvasConfiguration",
    dictMembersGPUCanvasConfiguration,
  );
const gpu = webidl.createBranded(GPU);
export {
  _device,
  assertDevice,
  createGPUTexture,
  GPU,
  gpu,
  GPUAdapter,
  GPUAdapterInfo,
  GPUBindGroup,
  GPUBindGroupLayout,
  GPUBuffer,
  GPUBufferUsage,
  GPUColorWrite,
  GPUCommandBuffer,
  GPUCommandEncoder,
  GPUComputePassEncoder,
  GPUComputePipeline,
  GPUDevice,
  GPUDeviceLostInfo,
  GPUError,
  GPUMapMode,
  GPUOutOfMemoryError,
  GPUPipelineLayout,
  GPUQuerySet,
  GPUQueue,
  GPURenderBundle,
  GPURenderBundleEncoder,
  GPURenderPassEncoder,
  GPURenderPipeline,
  GPUSampler,
  GPUShaderModule,
  GPUShaderStage,
  GPUSupportedFeatures,
  GPUSupportedLimits,
  GPUTexture,
  GPUTextureUsage,
  GPUTextureView,
  GPUValidationError,
};