Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.

View in English Always switch to English

GPUAdapter: Método requestDevice()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Contexto seguro: Esta función está disponible solo en contextos seguros (HTTPS), en algunos o todos los navegadores que lo soportan.

Nota: Esta característica está disponible en Web Workers.

El método requestDevice() de la interfaz GPUAdapter devuelve una Promise que se resuelve con un objeto GPUDevice, que es la interfaz principal para comunicarse con la GPU.

Sintaxis

js
requestDevice()
requestDevice(descriptor)

Parámetros

descriptor Opcional

Un objeto que contiene las siguientes propiedades:

defaultQueue Opcional

Un objeto que proporciona información sobre la GPUQueue predeterminada del sistema (tal como se devuelve en GPUDevice.queue). Este objeto tiene una sola propiedad —label— que proporciona la cola predeterminada con un valor label. Si no se proporciona ningún valor, se usa un objeto vacío por defecto, y la etiqueta de la cola predeterminada será una cadena de texto vacía.

label Opcional

Una cadena de texto que proporciona una etiqueta que se puede usar para identificar el GPUDevice, por ejemplo en mensajes de GPUError o advertencias de la consola.

requiredFeatures Opcional

Un arreglo de cadenas de texto que representa funcionalidades adicionales que deseas que el GPUDevice devuelto soporte. La llamada a requestDevice() fallará si el GPUAdapter no puede proporcionar estas características. Consulta GPUSupportedFeatures para una lista completa de posibles características. Se usa una cadena de texto por defecto si ningún valor es proporcionado.

requiredLimits Opcional

Un objeto que contiene propiedades que representan los límites que quieres que el GPUDevice devuelto soporte. La llamada a requestDevice() fallará si el GPUAdapter no puede proporcionar esos límites. Cada clave con un valor distinto a undefined debe ser el nombre de un miembro de GPUSupportedLimits.

Nota: Puedes solicitar límites desconocidos al solicitar un dispositivo de GPU sin causar un error. Tales límites serán undefined. Esto es útil porque hace que el código de WebGPU sea menos frágil, una base de código no dejará de funcionar porque un límite ya no exista en el adaptador.

No todas las características y límites estarán disponibles en WebGPU en todos los navegadores que lo soportan, incluso si están soportadas por el hardware subyacente. Consulta las paginas de features y limits para más información.

Valor devuelto

Una Promise que se resuelve con una instancia del objeto GPUDevice.

Si haces una llamada duplicada, es decir, llamas a requestDevice() en un GPUAdapter sobre el cual requestDevice() ya se había llamado, la promesa se resuelve con un dispositivo que es inmediatamente perdido. Luego, puedes obtener información sobre cómo se perdió el dispositivo a través de GPUDevice.lost.

Excepciones

OperationError DOMException

La promesa se rechaza con un OperationError si los límites incluidos en la propiedad requiredLimits no están soportados por el GPUAdapter, ya sea porque no son límites válidos o porque sus valores son más altos que los valores del adaptador para esos límites.

TypeError DOMException

La promesa se rechaza con un TypeError si las funciones incluidas en la propiedad requiredFeatures no están soportadas por el GPUAdapter.

Ejemplos

Ejemplo básico

js
async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU no está soportado.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("No se pudo solicitar un adaptador de WebGPU.");
  }

  const device = await adapter.requestDevice();

  // …
}

Solicitar características y límites específicos

En el siguiente código:

  1. Comprobamos si un GPUAdapter tiene disponible la característica texture-compression-astc. De ser así, la insertamos en el arreglo requiredFeatures.
  2. Consultamos el valor GPUAdapter.limits de maxBindGroups para ver si es igual o mayor que 6. Nuestra aplicación teórica de ejemplo necesita idealmente 6 grupos de enlace, así que si el valor devuelto es >= 6, añadimos un límite máximo de 6 al objeto requiredLimits.
  3. Solicitamos un dispositivo con esos requisitos de característica y límite, más una etiqueta defaultQueue.
js
async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU no está soportado.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("No se pudo solicitar un adaptador de WebGPU.");
  }

  const requiredFeatures = [];

  if (adapter.features.has("texture-compression-astc")) {
    requiredFeatures.push("texture-compression-astc");
  }

  const requiredLimits = {};

  // La aplicación necesita idealmente 6 grupos de enlace,
  // así que intentaremos solicitar lo que la aplicación requiere
  if (adapter.limits.maxBindGroups >= 6) {
    requiredLimits.maxBindGroups = 6;
  }

  const device = await adapter.requestDevice({
    defaultQueue: {
      label: "my_queue",
    },
    requiredFeatures,
    requiredLimits,
  });

  // …
}

Especificaciones

Specification
WebGPU
# dom-gpuadapter-requestdevice

Compatibilidad con navegadores

Véase también