diff options
author | Aapo Alasuutari <aapo.alasuutari@gmail.com> | 2022-08-11 16:56:56 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-11 15:56:56 +0200 |
commit | 2164f6b1eb7216c1045d547c94f26fe3ceaa9403 (patch) | |
tree | 056e3d6540ebd0e755650765adcff6b5cc173db8 /ext/webgpu/src/01_webgpu.js | |
parent | 883269f1f183428f60c54223135d8dd25977b3cd (diff) |
perf(ops): Monomorphic sync op calls (#15337)
Welcome to better optimised op calls! Currently opSync is called with parameters of every type and count. This most definitely makes the call megamorphic. Additionally, it seems that spread params leads to V8 not being able to optimise the calls quite as well (apparently Fast Calls cannot be used with spread params).
Monomorphising op calls should lead to some improved performance. Now that unwrapping of sync ops results is done on Rust side, this is pretty simple:
```
opSync("op_foo", param1, param2);
// -> turns to
ops.op_foo(param1, param2);
```
This means sync op calls are now just directly calling the native binding function. When V8 Fast API Calls are enabled, this will enable those to be called on the optimised path.
Monomorphising async ops likely requires using callbacks and is left as an exercise to the reader.
Diffstat (limited to 'ext/webgpu/src/01_webgpu.js')
-rw-r--r-- | ext/webgpu/src/01_webgpu.js | 232 |
1 files changed, 84 insertions, 148 deletions
diff --git a/ext/webgpu/src/01_webgpu.js b/ext/webgpu/src/01_webgpu.js index 79d1f497c..9b8c7eb50 100644 --- a/ext/webgpu/src/01_webgpu.js +++ b/ext/webgpu/src/01_webgpu.js @@ -10,6 +10,7 @@ ((window) => { const core = window.Deno.core; + const ops = core.ops; const webidl = window.__bootstrap.webidl; const eventTarget = window.__bootstrap.eventTarget; const { DOMException } = window.__bootstrap.domException; @@ -940,8 +941,7 @@ context: "Argument 1", }); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync( - "op_webgpu_create_buffer", + const { rid, err } = ops.op_webgpu_create_buffer( device.rid, descriptor.label, descriptor.size, @@ -991,7 +991,7 @@ context: "Argument 1", }); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync("op_webgpu_create_texture", { + const { rid, err } = ops.op_webgpu_create_texture({ deviceRid: device.rid, ...descriptor, size: normalizeGPUExtent3D(descriptor.size), @@ -1019,7 +1019,7 @@ context: "Argument 1", }); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync("op_webgpu_create_sampler", { + const { rid, err } = ops.op_webgpu_create_sampler({ deviceRid: device.rid, ...descriptor, }); @@ -1059,8 +1059,7 @@ } } - const { rid, err } = core.opSync( - "op_webgpu_create_bind_group_layout", + const { rid, err } = ops.op_webgpu_create_bind_group_layout( device.rid, descriptor.label, descriptor.entries, @@ -1102,8 +1101,7 @@ return rid; }, ); - const { rid, err } = core.opSync( - "op_webgpu_create_pipeline_layout", + const { rid, err } = ops.op_webgpu_create_pipeline_layout( device.rid, descriptor.label, bindGroupLayouts, @@ -1197,8 +1195,7 @@ } }); - const { rid, err } = core.opSync( - "op_webgpu_create_bind_group", + const { rid, err } = ops.op_webgpu_create_bind_group( device.rid, descriptor.label, layout, @@ -1227,8 +1224,7 @@ context: "Argument 1", }); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync( - "op_webgpu_create_shader_module", + const { rid, err } = ops.op_webgpu_create_shader_module( device.rid, descriptor.label, descriptor.code, @@ -1278,8 +1274,7 @@ selfContext: "this", }); - const { rid, err } = core.opSync( - "op_webgpu_create_compute_pipeline", + const { rid, err } = ops.op_webgpu_create_compute_pipeline( device.rid, descriptor.label, layout, @@ -1350,7 +1345,7 @@ }; } - const { rid, err } = core.opSync("op_webgpu_create_render_pipeline", { + const { rid, err } = ops.op_webgpu_create_render_pipeline({ deviceRid: device.rid, label: descriptor.label, layout, @@ -1397,8 +1392,7 @@ context: "Argument 1", }); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync( - "op_webgpu_create_command_encoder", + const { rid, err } = ops.op_webgpu_create_command_encoder( device.rid, descriptor.label, ); @@ -1430,8 +1424,7 @@ }, ); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync( - "op_webgpu_create_render_bundle_encoder", + const { rid, err } = ops.op_webgpu_create_render_bundle_encoder( { deviceRid: device.rid, ...descriptor, @@ -1464,7 +1457,7 @@ }, ); const device = assertDevice(this, { prefix, context: "this" }); - const { rid, err } = core.opSync("op_webgpu_create_query_set", { + const { rid, err } = ops.op_webgpu_create_query_set({ deviceRid: device.rid, ...descriptor, }); @@ -1595,8 +1588,7 @@ return rid; }, ); - const { err } = core.opSync( - "op_webgpu_queue_submit", + const { err } = ops.op_webgpu_queue_submit( device.rid, commandBufferRids, ); @@ -1654,8 +1646,7 @@ selfContext: "this", resourceContext: "Argument 1", }); - const { err } = core.opSync( - "op_webgpu_write_buffer", + const { err } = ops.op_webgpu_write_buffer( device.rid, bufferRid, bufferOffset, @@ -1702,8 +1693,7 @@ selfContext: "this", resourceContext: "texture", }); - const { err } = core.opSync( - "op_webgpu_write_texture", + const { err } = ops.op_webgpu_write_texture( device.rid, { texture: textureRid, @@ -1960,8 +1950,7 @@ } const buffer = new ArrayBuffer(rangeSize); - const { rid } = core.opSync( - "op_webgpu_buffer_get_mapped_range", + const { rid } = ops.op_webgpu_buffer_get_mapped_range( bufferRid, offset, size, @@ -2015,8 +2004,7 @@ throw new DOMException(`${prefix}: invalid state.`, "OperationError"); } for (const [buffer, mappedRid] of mappedRanges) { - const { err } = core.opSync( - "op_webgpu_buffer_unmap", + const { err } = ops.op_webgpu_buffer_unmap( bufferRid, mappedRid, ...new SafeArrayIterator(write ? [new Uint8Array(buffer)] : []), @@ -2153,7 +2141,7 @@ }); const device = assertDevice(this, { prefix, context: "this" }); const textureRid = assertResource(this, { prefix, context: "this" }); - const { rid, err } = core.opSync("op_webgpu_create_texture_view", { + const { rid, err } = ops.op_webgpu_create_texture_view({ textureRid, ...descriptor, }); @@ -2536,11 +2524,11 @@ prefix, context: "this", }); - const { rid, label, err } = core.opSync( - "op_webgpu_compute_pipeline_get_bind_group_layout", - computePipelineRid, - index, - ); + const { rid, label, err } = ops + .op_webgpu_compute_pipeline_get_bind_group_layout( + computePipelineRid, + index, + ); device.pushError(err); const bindGroupLayout = createGPUBindGroupLayout( @@ -2613,11 +2601,11 @@ prefix, context: "this", }); - const { rid, label, err } = core.opSync( - "op_webgpu_render_pipeline_get_bind_group_layout", - renderPipelineRid, - index, - ); + const { rid, label, err } = ops + .op_webgpu_render_pipeline_get_bind_group_layout( + renderPipelineRid, + index, + ); device.pushError(err); const bindGroupLayout = createGPUBindGroupLayout( @@ -2807,8 +2795,7 @@ }, ); - const { rid } = core.opSync( - "op_webgpu_command_encoder_begin_render_pass", + const { rid } = ops.op_webgpu_command_encoder_begin_render_pass( commandEncoderRid, descriptor.label, colorAttachments, @@ -2842,8 +2829,7 @@ context: "this", }); - const { rid } = core.opSync( - "op_webgpu_command_encoder_begin_compute_pass", + const { rid } = ops.op_webgpu_command_encoder_begin_compute_pass( commandEncoderRid, descriptor.label, ); @@ -2919,8 +2905,7 @@ selfContext: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_copy_buffer_to_buffer", + const { err } = ops.op_webgpu_command_encoder_copy_buffer_to_buffer( commandEncoderRid, sourceRid, sourceOffset, @@ -2977,8 +2962,7 @@ selfContext: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_copy_buffer_to_texture", + const { err } = ops.op_webgpu_command_encoder_copy_buffer_to_texture( commandEncoderRid, { ...source, @@ -3042,8 +3026,7 @@ resourceContext: "buffer in Argument 2", selfContext: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_copy_texture_to_buffer", + const { err } = ops.op_webgpu_command_encoder_copy_texture_to_buffer( commandEncoderRid, { texture: sourceTextureRid, @@ -3107,8 +3090,7 @@ resourceContext: "texture in Argument 2", selfContext: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_copy_texture_to_texture", + const { err } = ops.op_webgpu_command_encoder_copy_texture_to_texture( commandEncoderRid, { texture: sourceTextureRid, @@ -3161,8 +3143,7 @@ prefix, context: "Argument 1", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_clear_buffer", + const { err } = ops.op_webgpu_command_encoder_clear_buffer( commandEncoderRid, bufferRid, offset, @@ -3188,8 +3169,7 @@ prefix, context: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_push_debug_group", + const { err } = ops.op_webgpu_command_encoder_push_debug_group( commandEncoderRid, groupLabel, ); @@ -3204,8 +3184,7 @@ prefix, context: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_pop_debug_group", + const { err } = ops.op_webgpu_command_encoder_pop_debug_group( commandEncoderRid, ); device.pushError(err); @@ -3228,8 +3207,7 @@ prefix, context: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_insert_debug_marker", + const { err } = ops.op_webgpu_command_encoder_insert_debug_marker( commandEncoderRid, markerLabel, ); @@ -3267,8 +3245,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_write_timestamp", + const { err } = ops.op_webgpu_command_encoder_write_timestamp( commandEncoderRid, querySetRid, queryIndex, @@ -3337,8 +3314,7 @@ resourceContext: "Argument 3", selfContext: "this", }); - const { err } = core.opSync( - "op_webgpu_command_encoder_resolve_query_set", + const { err } = ops.op_webgpu_command_encoder_resolve_query_set( commandEncoderRid, querySetRid, firstQuery, @@ -3365,8 +3341,7 @@ prefix, context: "this", }); - const { rid, err } = core.opSync( - "op_webgpu_command_encoder_finish", + const { rid, err } = ops.op_webgpu_command_encoder_finish( commandEncoderRid, descriptor.label, ); @@ -3465,7 +3440,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync("op_webgpu_render_pass_set_viewport", { + ops.op_webgpu_render_pass_set_viewport({ renderPassRid, x, y, @@ -3512,8 +3487,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_set_scissor_rect", + ops.op_webgpu_render_pass_set_scissor_rect( renderPassRid, x, y, @@ -3543,8 +3517,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_set_blend_constant", + ops.op_webgpu_render_pass_set_blend_constant( renderPassRid, normalizeGPUColor(color), ); @@ -3571,8 +3544,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_set_stencil_reference", + ops.op_webgpu_render_pass_set_stencil_reference( renderPassRid, reference, ); @@ -3621,8 +3593,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_begin_pipeline_statistics_query", + ops.op_webgpu_render_pass_begin_pipeline_statistics_query( renderPassRid, querySetRid, queryIndex, @@ -3642,8 +3613,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_end_pipeline_statistics_query", + ops.op_webgpu_render_pass_end_pipeline_statistics_query( renderPassRid, ); } @@ -3683,8 +3653,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_write_timestamp", + ops.op_webgpu_render_pass_write_timestamp( renderPassRid, querySetRid, queryIndex, @@ -3722,8 +3691,7 @@ }); return rid; }); - core.opSync( - "op_webgpu_render_pass_execute_bundles", + ops.op_webgpu_render_pass_execute_bundles( renderPassRid, bundleRids, ); @@ -3741,8 +3709,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - const { err } = core.opSync( - "op_webgpu_render_pass_end", + const { err } = ops.op_webgpu_render_pass_end( commandEncoderRid, renderPassRid, ); @@ -3789,8 +3756,7 @@ dynamicOffsetsDataStart = 0; dynamicOffsetsDataLength = dynamicOffsetsData.length; } - core.opSync( - "op_webgpu_render_pass_set_bind_group", + ops.op_webgpu_render_pass_set_bind_group( renderPassRid, index, bindGroupRid, @@ -3821,8 +3787,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_push_debug_group", + ops.op_webgpu_render_pass_push_debug_group( renderPassRid, groupLabel, ); @@ -3841,7 +3806,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync("op_webgpu_render_pass_pop_debug_group", renderPassRid); + ops.op_webgpu_render_pass_pop_debug_group(renderPassRid); } /** @@ -3865,8 +3830,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_insert_debug_marker", + ops.op_webgpu_render_pass_insert_debug_marker( renderPassRid, markerLabel, ); @@ -3902,8 +3866,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_set_pipeline", + ops.op_webgpu_render_pass_set_pipeline( renderPassRid, pipelineRid, ); @@ -3956,8 +3919,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_set_index_buffer", + ops.op_webgpu_render_pass_set_index_buffer( renderPassRid, bufferRid, indexFormat, @@ -4013,8 +3975,7 @@ resourceContext: "Argument 2", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_set_vertex_buffer", + ops.op_webgpu_render_pass_set_vertex_buffer( renderPassRid, slot, bufferRid, @@ -4058,8 +4019,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_draw", + ops.op_webgpu_render_pass_draw( renderPassRid, vertexCount, instanceCount, @@ -4115,8 +4075,7 @@ context: "encoder referenced by this", }); const renderPassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_render_pass_draw_indexed", + ops.op_webgpu_render_pass_draw_indexed( renderPassRid, indexCount, instanceCount, @@ -4161,8 +4120,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_draw_indirect", + ops.op_webgpu_render_pass_draw_indirect( renderPassRid, indirectBufferRid, indirectOffset, @@ -4204,8 +4162,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_pass_draw_indexed_indirect", + ops.op_webgpu_render_pass_draw_indexed_indirect( renderPassRid, indirectBufferRid, indirectOffset, @@ -4288,8 +4245,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_compute_pass_set_pipeline", + ops.op_webgpu_compute_pass_set_pipeline( computePassRid, pipelineRid, ); @@ -4330,8 +4286,7 @@ context: "encoder referenced by this", }); const computePassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_compute_pass_dispatch_workgroups", + ops.op_webgpu_compute_pass_dispatch_workgroups( computePassRid, workgroupCountX, workgroupCountY, @@ -4374,8 +4329,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_compute_pass_dispatch_workgroups_indirect", + ops.op_webgpu_compute_pass_dispatch_workgroups_indirect( computePassRid, indirectBufferRid, indirectOffset, @@ -4417,8 +4371,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_compute_pass_begin_pipeline_statistics_query", + ops.op_webgpu_compute_pass_begin_pipeline_statistics_query( computePassRid, querySetRid, queryIndex, @@ -4438,8 +4391,7 @@ context: "encoder referenced by this", }); const computePassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_compute_pass_end_pipeline_statistics_query", + ops.op_webgpu_compute_pass_end_pipeline_statistics_query( computePassRid, ); } @@ -4479,8 +4431,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_compute_pass_write_timestamp", + ops.op_webgpu_compute_pass_write_timestamp( computePassRid, querySetRid, queryIndex, @@ -4499,8 +4450,7 @@ context: "encoder referenced by this", }); const computePassRid = assertResource(this, { prefix, context: "this" }); - const { err } = core.opSync( - "op_webgpu_compute_pass_end", + const { err } = ops.op_webgpu_compute_pass_end( commandEncoderRid, computePassRid, ); @@ -4547,8 +4497,7 @@ dynamicOffsetsDataStart = 0; dynamicOffsetsDataLength = dynamicOffsetsData.length; } - core.opSync( - "op_webgpu_compute_pass_set_bind_group", + ops.op_webgpu_compute_pass_set_bind_group( computePassRid, index, bindGroupRid, @@ -4579,8 +4528,7 @@ context: "encoder referenced by this", }); const computePassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_compute_pass_push_debug_group", + ops.op_webgpu_compute_pass_push_debug_group( computePassRid, groupLabel, ); @@ -4599,7 +4547,7 @@ context: "encoder referenced by this", }); const computePassRid = assertResource(this, { prefix, context: "this" }); - core.opSync("op_webgpu_compute_pass_pop_debug_group", computePassRid); + ops.op_webgpu_compute_pass_pop_debug_group(computePassRid); } /** @@ -4623,8 +4571,7 @@ context: "encoder referenced by this", }); const computePassRid = assertResource(this, { prefix, context: "this" }); - core.opSync( - "op_webgpu_compute_pass_insert_debug_marker", + ops.op_webgpu_compute_pass_insert_debug_marker( computePassRid, markerLabel, ); @@ -4734,8 +4681,7 @@ prefix, context: "this", }); - const { rid, err } = core.opSync( - "op_webgpu_render_bundle_encoder_finish", + const { rid, err } = ops.op_webgpu_render_bundle_encoder_finish( renderBundleEncoderRid, descriptor.label, ); @@ -4786,8 +4732,7 @@ dynamicOffsetsDataStart = 0; dynamicOffsetsDataLength = dynamicOffsetsData.length; } - core.opSync( - "op_webgpu_render_bundle_encoder_set_bind_group", + ops.op_webgpu_render_bundle_encoder_set_bind_group( renderBundleEncoderRid, index, bindGroupRid, @@ -4814,8 +4759,7 @@ prefix, context: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_push_debug_group", + ops.op_webgpu_render_bundle_encoder_push_debug_group( renderBundleEncoderRid, groupLabel, ); @@ -4830,8 +4774,7 @@ prefix, context: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_pop_debug_group", + ops.op_webgpu_render_bundle_encoder_pop_debug_group( renderBundleEncoderRid, ); } @@ -4853,8 +4796,7 @@ prefix, context: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_insert_debug_marker", + ops.op_webgpu_render_bundle_encoder_insert_debug_marker( renderBundleEncoderRid, markerLabel, ); @@ -4886,8 +4828,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_set_pipeline", + ops.op_webgpu_render_bundle_encoder_set_pipeline( renderBundleEncoderRid, pipelineRid, ); @@ -4934,8 +4875,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_set_index_buffer", + ops.op_webgpu_render_bundle_encoder_set_index_buffer( renderBundleEncoderRid, bufferRid, indexFormat, @@ -4985,8 +4925,7 @@ resourceContext: "Argument 2", selfContext: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_set_vertex_buffer", + ops.op_webgpu_render_bundle_encoder_set_vertex_buffer( renderBundleEncoderRid, slot, bufferRid, @@ -5026,8 +4965,7 @@ prefix, context: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_draw", + ops.op_webgpu_render_bundle_encoder_draw( renderBundleEncoderRid, vertexCount, instanceCount, @@ -5079,8 +5017,7 @@ prefix, context: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_draw_indexed", + ops.op_webgpu_render_bundle_encoder_draw_indexed( renderBundleEncoderRid, indexCount, instanceCount, @@ -5121,8 +5058,7 @@ resourceContext: "Argument 1", selfContext: "this", }); - core.opSync( - "op_webgpu_render_bundle_encoder_draw_indirect", + ops.op_webgpu_render_bundle_encoder_draw_indirect( renderBundleEncoderRid, indirectBufferRid, indirectOffset, |