files/en-us/web/api/gpudevice/createcomputepipelineasync/index.md
{{APIRef("WebGPU API")}}{{SecureContext_Header}}{{AvailableInWorkers}}
The createComputePipelineAsync() method of the
{{domxref("GPUDevice")}} interface returns a {{jsxref("Promise")}} that fulfills with a {{domxref("GPUComputePipeline")}}, which can control the compute shader stage and be used in a {{domxref("GPUComputePassEncoder")}}, once the pipeline can be used without any stalling.
[!NOTE] It is generally preferable to use this method over {{domxref("GPUDevice.createComputePipeline()")}} whenever possible, as it prevents blocking of GPU operation execution on pipeline compilation.
createComputePipelineAsync(descriptor)
descriptor
GPUDevice.createComputePipeline() method.A {{jsxref("Promise")}} that fulfills with a {{domxref("GPUComputePipeline")}} object instance when the created pipeline is ready to be used without additional delay.
If pipeline creation fails and the resulting pipeline becomes invalid as a result, the returned promise rejects with a {{domxref("GPUPipelineError")}}:
reason of "internal".reason of "validation".A validation error can occur if any of the following are false:
module referenced inside the compute property is less than or equal to the {{domxref("GPUDevice")}}'s maxComputeWorkgroupStorageSize {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.module uses a number of compute invocations per workgroup less than or equal to the {{domxref("GPUDevice")}}'s maxComputeInvocationsPerWorkgroup {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.module's workgroup size is less than or equal to the {{domxref("GPUDevice")}}'s corresponding maxComputeWorkgroupSizeX, maxComputeWorkgroupSizeY, or maxComputeWorkgroupSizeZ {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.entryPoint property is omitted, the shader code contains a single compute shader entry point function for the browser to use as the default entry point.[!NOTE] The WebGPU samples feature many more examples.
The following example shows a process of:
bindGroupLayout into {{domxref("GPUDevice.createPipelineLayout()")}} to create a {{domxref("GPUPipelineLayout")}}.createComputePipelineAsync() call to create a {{domxref("GPUComputePipeline")}}.async function init() {
// …
const bindGroupLayout = device.createBindGroupLayout({
entries: [
{
binding: 0,
visibility: GPUShaderStage.COMPUTE,
buffer: {
type: "storage",
},
},
],
});
const computePipeline = await device.createComputePipelineAsync({
layout: device.createPipelineLayout({
bindGroupLayouts: [bindGroupLayout],
}),
compute: {
module: shaderModule,
entryPoint: "main",
},
});
// …
}
{{Specifications}}
{{Compat}}