A feature is a named capability beyond the core API, such as shader-f16 (16-bit floats in WGSL) or timestamp-query (GPU timers). adapter.features is a set of what the adapter could enable; requiredFeatures enables them on your device, and using one you did not request is a validation error.
<script type="module">
const adapter = await navigator.gpu.requestAdapter();
const names = [...adapter.features].sort();
console.log(`${names.length} features on this adapter:`);
for (let i = 0; i < names.length; i += 3) {
console.log(' ' + names.slice(i, i + 3).join(', '));
}
const requiredFeatures = ['shader-f16', 'timestamp-query'];
const device = await adapter.requestDevice({ requiredFeatures });
console.log(`device.features: ${[...device.features].join(', ')}`);
</script>20 features on this adapter: bgra8unorm-storage, clip-distances, core-features-and-limits depth-clip-control, depth32float-stencil8, dual-source-blending float32-blendable, float32-filterable, indirect-first-instance primitive-index, rg11b10ufloat-renderable, shader-f16 subgroup-size-control, subgroups, texture-component-swizzle texture-compression-bc, texture-compression-bc-sliced-3d, texture-formats-tier1 texture-formats-tier2, timestamp-query device.features: core-features-and-limits, timestamp-query, shader-f16
This is a typical desktop list: BC texture compression but not the mobile ASTC or ETC2 formats. Requesting texture-compression-astc here rejected with TypeError: Unsupported feature: texture-compression-astc, and phone GPUs report the opposite, so pages that ship compressed textures need more than one format (Textures and Samplers).