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
requestDevice()
requestDevice(descriptor)
Parámetros
descriptorOpcional-
Un objeto que contiene las siguientes propiedades:
defaultQueueOpcional-
Un objeto que proporciona información sobre la
GPUQueuepredeterminada del sistema (tal como se devuelve enGPUDevice.queue). Este objeto tiene una sola propiedad —label— que proporciona la cola predeterminada con un valorlabel. 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. labelOpcional-
Una cadena de texto que proporciona una etiqueta que se puede usar para identificar el
GPUDevice, por ejemplo en mensajes deGPUErroro advertencias de la consola. requiredFeaturesOpcional-
Un arreglo de cadenas de texto que representa funcionalidades adicionales que deseas que el
GPUDevicedevuelto soporte. La llamada arequestDevice()fallará si elGPUAdapterno puede proporcionar estas características. ConsultaGPUSupportedFeaturespara una lista completa de posibles características. Se usa una cadena de texto por defecto si ningún valor es proporcionado. requiredLimitsOpcional-
Un objeto que contiene propiedades que representan los límites que quieres que el
GPUDevicedevuelto soporte. La llamada arequestDevice()fallará si elGPUAdapterno puede proporcionar esos límites. Cada clave con un valor distinto aundefineddebe ser el nombre de un miembro deGPUSupportedLimits.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
OperationErrorDOMException-
La promesa se rechaza con un
OperationErrorsi los límites incluidos en la propiedadrequiredLimitsno están soportados por elGPUAdapter, 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. TypeErrorDOMException-
La promesa se rechaza con un
TypeErrorsi las funciones incluidas en la propiedadrequiredFeaturesno están soportadas por elGPUAdapter.
Ejemplos
>Ejemplo básico
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:
- Comprobamos si un
GPUAdaptertiene disponible la característicatexture-compression-astc. De ser así, la insertamos en el arreglorequiredFeatures. - Consultamos el valor
GPUAdapter.limitsdemaxBindGroupspara 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 objetorequiredLimits. - Solicitamos un dispositivo con esos requisitos de característica y límite, más una etiqueta
defaultQueue.
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
Loading…