WebGPUComputePipelines.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import WebGPUProgrammableStage from './WebGPUProgrammableStage.js';
  2. class WebGPUComputePipelines {
  3. constructor( device, glslang ) {
  4. this.device = device;
  5. this.glslang = glslang;
  6. this.pipelines = new WeakMap();
  7. this.stages = {
  8. compute: new WeakMap()
  9. };
  10. }
  11. get( param ) {
  12. let pipeline = this.pipelines.get( param );
  13. // @TODO: Reuse compute pipeline if possible, introduce WebGPUComputePipeline
  14. if ( pipeline === undefined ) {
  15. const device = this.device;
  16. const glslang = this.glslang;
  17. const shader = {
  18. computeShader: param.shader
  19. };
  20. // programmable stage
  21. let stageCompute = this.stages.compute.get( shader );
  22. if ( stageCompute === undefined ) {
  23. stageCompute = new WebGPUProgrammableStage( device, glslang, shader.computeShader, 'compute' );
  24. this.stages.compute.set( shader, stageCompute );
  25. }
  26. pipeline = device.createComputePipeline( {
  27. compute: stageCompute.stage
  28. } );
  29. this.pipelines.set( param, pipeline );
  30. }
  31. return pipeline;
  32. }
  33. dispose() {
  34. this.pipelines = new WeakMap();
  35. this.stages = {
  36. compute: new WeakMap()
  37. };
  38. }
  39. }
  40. export default WebGPUComputePipelines;