Requesting a Device

Requesting a Device and Its Default Limits

adapter.requestDevice({ requiredFeatures, requiredLimits, label }) returns a device with exactly what you request. Ask for nothing and you get the specification's defaults, which every conforming adapter meets:

Comparing a default device's limits with the adapter'sHTMLLive
<script type="module">
  const adapter = await navigator.gpu.requestAdapter();
  const device = await adapter.requestDevice();       // no requirements: the spec's defaults
  const names = ['maxTextureDimension2D', 'maxBufferSize', 'maxStorageBufferBindingSize',
    'maxVertexAttributes', 'maxComputeInvocationsPerWorkgroup'];
  const row = (a, b, c) => console.log(`${a}`.padEnd(34) + `${b}`.padStart(12) +
    `${c}`.padStart(12));
  row('limit', 'device', 'adapter');
  for (const n of names) row(n, device.limits[n], adapter.limits[n]);
  console.log(`device.features: ${[...device.features].join(', ')}`);
</script>

The GTX 1650 offers double or more on every row, yet the default device gets 8192-pixel textures, 256 MiB buffers and no optional features (core-features-and-limits just marks a full "core" device). Since Chrome 140 1 an adapter is also consumed by its first device: a second requestDevice() here rejected with an OperationError (adapter is "consumed"), so request a fresh adapter for a new device, as after device loss (Device Loss Recovery).