GPUDevice: createComputePipeline() 方法
注意:此功能在 Web Workers 中可用。
GPUDevice 介面的 createComputePipeline() 方法會建立一個 GPUComputePipeline,該物件可以控制計算著色器階段,並能在 GPUComputePassEncoder 中使用。
語法
createComputePipeline(descriptor)
引數
描述符(descriptor)-
包含以下屬性的物件:
compute-
一個描述流水線計算著色器入口點的物件。該物件可以包含以下屬性
constants可選-
一系列記錄型別,結構為
(id, value),代表 可在流水線中覆蓋的 WGSL 常量 的覆蓋值。它們表現得像有序對映。在每種情況下,id是用於標識或選擇記錄的鍵,constant是表示 WGSL 的列舉值。根據您要覆蓋的常量,
id可以採用常量的數值 ID(如果指定了)的形式,否則就是常量的識別符號名稱。提供幾個可覆蓋常量的值的程式碼片段可能如下所示
js({ // … constants: { 0: false, 1200: 3.0, 1300: 2.0, width: 20, depth: -1, height: 15, }, }); entryPoint可選-
module中用於執行其工作的函式的名稱。相應的著色器函式必須具有@compute屬性才能被識別為該入口點。有關更多資訊,請參閱 入口點宣告。如果您的著色器程式碼包含一個帶有
@compute屬性的單個函式,您可以省略entryPoint屬性 — 瀏覽器將使用該函式作為預設入口點。如果省略entryPoint且瀏覽器無法確定預設入口點,則會生成GPUValidationError,並且生成的GPUComputePipeline將無效。 模組-
一個
GPUShaderModule物件,包含此可程式設計階段將執行的 WGSL 程式碼。
label可選-
一個字串,提供可用於識別物件的標籤,例如在
GPUError訊息或控制檯警告中。 layout-
定義流水線執行期間使用的所有 GPU 資源(緩衝區、紋理等)的佈局(結構、用途和型別)。可能的值是
- 一個
GPUPipelineLayout物件,使用GPUDevice.createPipelineLayout()建立,它允許 GPU 提前計算出如何最高效地執行流水線。 - 字串
"auto",這會導致流水線根據著色器程式碼中定義的任何繫結生成一個隱式的繫結組佈局。如果使用"auto",生成的繫結組佈局只能與當前流水線一起使用。
- 一個
返回值
一個 GPUComputePipeline 物件例項。
驗證
呼叫 createComputePipeline() 時必須滿足以下標準,否則將生成 GPUValidationError 並返回一個無效的 GPUComputePipeline 物件
compute屬性中引用的module使用的工作組儲存大小小於或等於GPUDevice的maxComputeWorkgroupStorageSize限制。module使用的每個工作組的計算呼叫次數小於或等於GPUDevice的maxComputeInvocationsPerWorkgroup限制。module的工作組大小小於或等於GPUDevice相應的maxComputeWorkgroupSizeX、maxComputeWorkgroupSizeY或maxComputeWorkgroupSizeZ限制。- 如果省略了
entryPoint屬性,則著色器程式碼包含一個計算著色器入口點函式,供瀏覽器用作預設入口點。
示例
注意:WebGPU 示例 提供了更多示例。
基本示例
我們的 基本計算演示 展示了一個過程,包括
- 使用
GPUDevice.createBindGroupLayout()建立繫結組佈局。 - 將
bindGroupLayout輸入到GPUDevice.createPipelineLayout()中以建立GPUPipelineLayout。 - 在
createComputePipeline()呼叫中立即使用該值來建立GPUComputePipeline。
// …
const bindGroupLayout = device.createBindGroupLayout({
entries: [
{
binding: 0,
visibility: GPUShaderStage.COMPUTE,
buffer: {
type: "storage",
},
},
],
});
const computePipeline = device.createComputePipeline({
layout: device.createPipelineLayout({
bindGroupLayouts: [bindGroupLayout],
}),
compute: {
module: shaderModule,
entryPoint: "main",
},
});
// …
規範
| 規範 |
|---|
| WebGPU # dom-gpudevice-createcomputepipeline |
瀏覽器相容性
載入中…