Skip to content

Commit b86cf40

Browse files
xdestiny110Jerry.Zhuang
andauthored
wgpuDeviceCreateRenderPipelineAsync implement (#20679)
* wgpuDeviceCreateRenderPipelineAsync implement * resolve conversation --------- Co-authored-by: Jerry.Zhuang <[email protected]>
1 parent 04a0cad commit b86cf40

File tree

1 file changed

+40
-3
lines changed

1 file changed

+40
-3
lines changed

src/library_webgpu.js

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ wgpu${type}Release: (id) => WebGPU.mgr${type}.release(id),`;
9494
OffsetOutOfRange: 7,
9595
SizeOutOfRange: 8,
9696
},
97+
CreatePipelineAsyncStatus: {
98+
Success: 0,
99+
ValidationError: 1,
100+
InternalError: 2,
101+
DeviceLost: 3,
102+
DeviceDestroyed: 4,
103+
Unknown: 5,
104+
},
97105
ErrorType: {
98106
NoError: 0,
99107
Validation: 1,
@@ -1180,9 +1188,9 @@ var LibraryWebGPU = {
11801188
abort('TODO: wgpuDeviceCreateComputePipelineAsync unimplemented');
11811189
},
11821190

1183-
wgpuDeviceCreateRenderPipeline: (deviceId, descriptor) => {
1191+
$generateRenderPipelineDesc__internal: true,
1192+
$generateRenderPipelineDesc: (descriptor) => {
11841193
{{{ gpu.makeCheckDescriptor('descriptor') }}}
1185-
11861194
function makePrimitiveState(rsPtr) {
11871195
if (!rsPtr) return undefined;
11881196
{{{ gpu.makeCheckDescriptor('rsPtr') }}}
@@ -1372,13 +1380,42 @@ var LibraryWebGPU = {
13721380
};
13731381
var labelPtr = {{{ makeGetValue('descriptor', C_STRUCTS.WGPURenderPipelineDescriptor.label, '*') }}};
13741382
if (labelPtr) desc["label"] = UTF8ToString(labelPtr);
1383+
return desc;
1384+
},
13751385

1386+
wgpuDeviceCreateRenderPipeline__deps: ['$generateRenderPipelineDesc'],
1387+
wgpuDeviceCreateRenderPipeline: (deviceId, descriptor) => {
1388+
var desc = generateRenderPipelineDesc(descriptor);
13761389
var device = WebGPU.mgrDevice.get(deviceId);
13771390
return WebGPU.mgrRenderPipeline.create(device["createRenderPipeline"](desc));
13781391
},
13791392

1393+
wgpuDeviceCreateRenderPipelineAsync__deps: ['$callUserCallback', '$stringToUTF8OnStack', '$generateRenderPipelineDesc'],
13801394
wgpuDeviceCreateRenderPipelineAsync: (deviceId, descriptor, callback, userdata) => {
1381-
abort('TODO: wgpuDeviceCreateRenderPipelineAsync unimplemented');
1395+
var desc = generateRenderPipelineDesc(descriptor);
1396+
var device = WebGPU.mgrDevice.get(deviceId);
1397+
{{{ runtimeKeepalivePush() }}}
1398+
device["createRenderPipelineAsync"](desc).then((pipeline) => {
1399+
{{{ runtimeKeepalivePop() }}}
1400+
callUserCallback(() => {
1401+
var pipelineId = WebGPU.mgrRenderPipeline.create(pipeline);
1402+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.Success }}}, pipelineId, 0, userdata);
1403+
});
1404+
}, (pipelineError) => {
1405+
{{{ runtimeKeepalivePop() }}}
1406+
callUserCallback(() => {
1407+
withStackSave(() => {
1408+
var messagePtr = stringToUTF8OnStack(pipelineError.message);
1409+
if (pipelineError.reason === 'validation') {
1410+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.ValidationError }}}, 0, messagePtr, userdata);
1411+
} else if (pipelineError.reason === 'internal') {
1412+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.InternalError }}}, 0, messagePtr, userdata);
1413+
} else {
1414+
{{{ makeDynCall('vippp', 'callback') }}}({{{ gpu.CreatePipelineAsyncStatus.Unknown }}}, 0, messagePtr, userdata);
1415+
}
1416+
});
1417+
});
1418+
});
13821419
},
13831420

13841421
wgpuDeviceCreateShaderModule: (deviceId, descriptor) => {

0 commit comments

Comments
 (0)