Skip to content

Commit 1b9d0f5

Browse files
WebGPU: Implement wgpuDeviceCreateComputePipelineAsync (emscripten-core#22074)
1 parent 6523a3a commit 1b9d0f5

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

src/library_webgpu.js

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,7 +1244,8 @@ var LibraryWebGPU = {
12441244
return WebGPU.mgrRenderBundleEncoder.create(device.createRenderBundleEncoder(desc));
12451245
},
12461246

1247-
wgpuDeviceCreateComputePipeline: (deviceId, descriptor) => {
1247+
$generateComputePipelineDesc__internal: true,
1248+
$generateComputePipelineDesc: (descriptor) => {
12481249
{{{ gpu.makeCheckDescriptor('descriptor') }}}
12491250

12501251
var desc = {
@@ -1256,13 +1257,42 @@ var LibraryWebGPU = {
12561257
};
12571258
var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPUComputePipelineDescriptor.label, '*') }}};
12581259
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1260+
return desc;
1261+
},
12591262

1263+
wgpuDeviceCreateComputePipeline__deps: ['$generateComputePipelineDesc'],
1264+
wgpuDeviceCreateComputePipeline: (deviceId, descriptor) => {
1265+
var desc = generateComputePipelineDesc(descriptor);
12601266
var device = WebGPU.mgrDevice.get(deviceId);
12611267
return WebGPU.mgrComputePipeline.create(device.createComputePipeline(desc));
12621268
},
12631269

1270+
wgpuDeviceCreateComputePipelineAsync__deps: ['$callUserCallback', '$stringToUTF8OnStack', '$generateComputePipelineDesc'],
12641271
wgpuDeviceCreateComputePipelineAsync: (deviceId, descriptor, callback, userdata) => {
1265-
abort('TODO: wgpuDeviceCreateComputePipelineAsync unimplemented');
1272+
var desc = generateComputePipelineDesc(descriptor);
1273+
var device = WebGPU.mgrDevice.get(deviceId);
1274+
{{{ runtimeKeepalivePush() }}}
1275+
device.createComputePipelineAsync(desc).then((pipeline) => {
1276+
{{{ runtimeKeepalivePop() }}}
1277+
callUserCallback(() => {
1278+
var pipelineId = WebGPU.mgrComputePipeline.create(pipeline);
1279+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.Success }}}, pipelineId, 0, userdata);
1280+
});
1281+
}, (pipelineError) => {
1282+
{{{ runtimeKeepalivePop() }}}
1283+
callUserCallback(() => {
1284+
var sp = stackSave();
1285+
var messagePtr = stringToUTF8OnStack(pipelineError.message);
1286+
if (pipelineError.reason === 'validation') {
1287+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.ValidationError }}}, 0, messagePtr, userdata);
1288+
} else if (pipelineError.reason === 'internal') {
1289+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.InternalError }}}, 0, messagePtr, userdata);
1290+
} else {
1291+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.Unknown }}}, 0, messagePtr, userdata);
1292+
}
1293+
stackRestore(sp);
1294+
});
1295+
});
12661296
},
12671297

12681298
$generateRenderPipelineDesc__internal: true,

0 commit comments

Comments
 (0)