files/en-us/web/api/gpudevice/createrenderpipelineasync/index.md
{{APIRef("WebGPU API")}}{{SecureContext_Header}}{{AvailableInWorkers}}
The createRenderPipelineAsync() method of the
{{domxref("GPUDevice")}} interface returns a {{jsxref("Promise")}} that fulfills with a {{domxref("GPURenderPipeline")}}, which can control the vertex and fragment shader stages and be used in a {{domxref("GPURenderPassEncoder")}} or {{domxref("GPURenderBundleEncoder")}}, once the pipeline can be used without any stalling.
[!NOTE] It is generally preferable to use this method over {{domxref("GPUDevice.createRenderPipeline()")}} whenever possible, as it prevents blocking of GPU operation execution on pipeline compilation.
createRenderPipelineAsync(descriptor)
descriptor
GPUDevice.createRenderPipeline() method.A {{jsxref("Promise")}} that fulfills with a {{domxref("GPURenderPipeline")}} 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:
depthStencil objects:
format is a depth-or-stencil format.depthBias, depthBiasClamp, and depthBiasSlopeScale properties are set to <code>0</code> for line and point topologies, i.e., if topology is set to "line-list", "line-strip", or "point-list".depthWriteEnabled is true or depthCompare is not "always", format has a depth component.stencilFront or stencilBack's properties are not at their default values, format has a stencil component.fragment objects:
targets.length is less than or equal to the {{domxref("GPUDevice")}}'s maxColorAttachments {{domxref("GPUSupportedLimits", "limit", "", "nocode")}}.target, writeMask's numeric equivalent is less than 16."src-alpha-saturated"), the output has an alpha channel (that is, it must be a vec4).entryPoint property is omitted, the shader code contains a single fragment shader entry point function for the browser to use as the default entry point.primitive objects:
unclippedDepth property is used, the depth-clip-control feature is enabled.vertex objects:
entryPoint property is omitted, the shader code contains a single vertex 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 basic example of the construction of a valid render pipeline descriptor object, which is then used to create a {{domxref("GPURenderPipeline")}} via a createRenderPipelineAsync() call.
async function init() {
// …
const vertexBuffers = [
{
attributes: [
{
shaderLocation: 0, // position
offset: 0,
format: "float32x4",
},
{
shaderLocation: 1, // color
offset: 16,
format: "float32x4",
},
],
arrayStride: 32,
stepMode: "vertex",
},
];
const pipelineDescriptor = {
vertex: {
module: shaderModule,
entryPoint: "vertex_main",
buffers: vertexBuffers,
},
fragment: {
module: shaderModule,
entryPoint: "fragment_main",
targets: [
{
format: navigator.gpu.getPreferredCanvasFormat(),
},
],
},
primitive: {
topology: "triangle-list",
},
layout: "auto",
};
const renderPipeline =
await device.createRenderPipelineAsync(pipelineDescriptor);
// …
}
{{Specifications}}
{{Compat}}