WebGPUComputePipelines.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. class WebGPUComputePipelines {
  2. constructor( device, glslang ) {
  3. this.device = device;
  4. this.glslang = glslang;
  5. this.pipelines = new WeakMap();
  6. this.shaderModules = {
  7. compute: new WeakMap()
  8. };
  9. }
  10. get( param ) {
  11. let pipeline = this.pipelines.get( param );
  12. if ( pipeline === undefined ) {
  13. const device = this.device;
  14. const shader = {
  15. computeShader: param.shader
  16. };
  17. // shader modules
  18. const glslang = this.glslang;
  19. let moduleCompute = this.shaderModules.compute.get( shader );
  20. if ( moduleCompute === undefined ) {
  21. const byteCodeCompute = glslang.compileGLSL( shader.computeShader, 'compute' );
  22. moduleCompute = device.createShaderModule( { code: byteCodeCompute } );
  23. this.shaderModules.compute.set( shader, moduleCompute );
  24. }
  25. //
  26. const computeStage = {
  27. module: moduleCompute,
  28. entryPoint: 'main'
  29. };
  30. pipeline = device.createComputePipeline( {
  31. computeStage: computeStage
  32. } );
  33. this.pipelines.set( param, pipeline );
  34. }
  35. return pipeline;
  36. }
  37. dispose() {
  38. this.pipelines = new WeakMap();
  39. this.shaderModules = {
  40. compute: new WeakMap()
  41. };
  42. }
  43. }
  44. export default WebGPUComputePipelines;