webgpuShaderProcessingContext.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. const _maxGroups = 4;
  2. const _maxBindingsPerGroup = 1 << 16;
  3. // all types not listed are assumed to consume 1 location
  4. const _typeToLocationSize = {
  5. // GLSL types
  6. mat2: 2,
  7. mat3: 3,
  8. mat4: 4,
  9. // WGSL types
  10. mat2x2: 2,
  11. mat3x3: 3,
  12. mat4x4: 4,
  13. };
  14. /**
  15. * @internal
  16. */
  17. export class WebGPUShaderProcessingContext {
  18. static get KnownUBOs() {
  19. return WebGPUShaderProcessingContext._SimplifiedKnownBindings ? WebGPUShaderProcessingContext._SimplifiedKnownUBOs : WebGPUShaderProcessingContext._KnownUBOs;
  20. }
  21. constructor(shaderLanguage) {
  22. this.shaderLanguage = shaderLanguage;
  23. this._attributeNextLocation = 0;
  24. this._varyingNextLocation = 0;
  25. this.freeGroupIndex = 0;
  26. this.freeBindingIndex = 0;
  27. this.availableVaryings = {};
  28. this.availableAttributes = {};
  29. this.availableBuffers = {};
  30. this.availableTextures = {};
  31. this.availableSamplers = {};
  32. this.orderedAttributes = [];
  33. this.bindGroupLayoutEntries = [];
  34. this.bindGroupLayoutEntryInfo = [];
  35. this.bindGroupEntries = [];
  36. this.bufferNames = [];
  37. this.textureNames = [];
  38. this.samplerNames = [];
  39. this.leftOverUniforms = [];
  40. this._findStartingGroupBinding();
  41. }
  42. _findStartingGroupBinding() {
  43. const knownUBOs = WebGPUShaderProcessingContext.KnownUBOs;
  44. const groups = [];
  45. for (const name in knownUBOs) {
  46. const binding = knownUBOs[name].binding;
  47. if (binding.groupIndex === -1) {
  48. continue;
  49. }
  50. if (groups[binding.groupIndex] === undefined) {
  51. groups[binding.groupIndex] = binding.bindingIndex;
  52. }
  53. else {
  54. groups[binding.groupIndex] = Math.max(groups[binding.groupIndex], binding.bindingIndex);
  55. }
  56. }
  57. this.freeGroupIndex = groups.length - 1;
  58. if (this.freeGroupIndex === 0) {
  59. this.freeGroupIndex++;
  60. this.freeBindingIndex = 0;
  61. }
  62. else {
  63. this.freeBindingIndex = groups[groups.length - 1] + 1;
  64. }
  65. }
  66. getAttributeNextLocation(dataType, arrayLength = 0) {
  67. const index = this._attributeNextLocation;
  68. this._attributeNextLocation += (_typeToLocationSize[dataType] ?? 1) * (arrayLength || 1);
  69. return index;
  70. }
  71. getVaryingNextLocation(dataType, arrayLength = 0) {
  72. const index = this._varyingNextLocation;
  73. this._varyingNextLocation += (_typeToLocationSize[dataType] ?? 1) * (arrayLength || 1);
  74. return index;
  75. }
  76. getNextFreeUBOBinding() {
  77. return this._getNextFreeBinding(1);
  78. }
  79. _getNextFreeBinding(bindingCount) {
  80. if (this.freeBindingIndex > _maxBindingsPerGroup - bindingCount) {
  81. this.freeGroupIndex++;
  82. this.freeBindingIndex = 0;
  83. }
  84. if (this.freeGroupIndex === _maxGroups) {
  85. // eslint-disable-next-line no-throw-literal
  86. throw "Too many textures or UBOs have been declared and it is not supported in WebGPU.";
  87. }
  88. const returnValue = {
  89. groupIndex: this.freeGroupIndex,
  90. bindingIndex: this.freeBindingIndex,
  91. };
  92. this.freeBindingIndex += bindingCount;
  93. return returnValue;
  94. }
  95. }
  96. /** @internal */
  97. WebGPUShaderProcessingContext._SimplifiedKnownBindings = true; // if true, use only group=0,binding=0 as a known group/binding for the Scene ubo and use group=1,binding=X for all other bindings
  98. // if false, see _KnownUBOs for the known groups/bindings used
  99. WebGPUShaderProcessingContext._SimplifiedKnownUBOs = {
  100. Scene: { binding: { groupIndex: 0, bindingIndex: 0 } },
  101. Light0: { binding: { groupIndex: -1, bindingIndex: -1 } },
  102. Light1: { binding: { groupIndex: -1, bindingIndex: -1 } },
  103. Light2: { binding: { groupIndex: -1, bindingIndex: -1 } },
  104. Light3: { binding: { groupIndex: -1, bindingIndex: -1 } },
  105. Light4: { binding: { groupIndex: -1, bindingIndex: -1 } },
  106. Light5: { binding: { groupIndex: -1, bindingIndex: -1 } },
  107. Light6: { binding: { groupIndex: -1, bindingIndex: -1 } },
  108. Light7: { binding: { groupIndex: -1, bindingIndex: -1 } },
  109. Light8: { binding: { groupIndex: -1, bindingIndex: -1 } },
  110. Light9: { binding: { groupIndex: -1, bindingIndex: -1 } },
  111. Light10: { binding: { groupIndex: -1, bindingIndex: -1 } },
  112. Light11: { binding: { groupIndex: -1, bindingIndex: -1 } },
  113. Light12: { binding: { groupIndex: -1, bindingIndex: -1 } },
  114. Light13: { binding: { groupIndex: -1, bindingIndex: -1 } },
  115. Light14: { binding: { groupIndex: -1, bindingIndex: -1 } },
  116. Light15: { binding: { groupIndex: -1, bindingIndex: -1 } },
  117. Light16: { binding: { groupIndex: -1, bindingIndex: -1 } },
  118. Light17: { binding: { groupIndex: -1, bindingIndex: -1 } },
  119. Light18: { binding: { groupIndex: -1, bindingIndex: -1 } },
  120. Light19: { binding: { groupIndex: -1, bindingIndex: -1 } },
  121. Light20: { binding: { groupIndex: -1, bindingIndex: -1 } },
  122. Light21: { binding: { groupIndex: -1, bindingIndex: -1 } },
  123. Light22: { binding: { groupIndex: -1, bindingIndex: -1 } },
  124. Light23: { binding: { groupIndex: -1, bindingIndex: -1 } },
  125. Light24: { binding: { groupIndex: -1, bindingIndex: -1 } },
  126. Light25: { binding: { groupIndex: -1, bindingIndex: -1 } },
  127. Light26: { binding: { groupIndex: -1, bindingIndex: -1 } },
  128. Light27: { binding: { groupIndex: -1, bindingIndex: -1 } },
  129. Light28: { binding: { groupIndex: -1, bindingIndex: -1 } },
  130. Light29: { binding: { groupIndex: -1, bindingIndex: -1 } },
  131. Light30: { binding: { groupIndex: -1, bindingIndex: -1 } },
  132. Light31: { binding: { groupIndex: -1, bindingIndex: -1 } },
  133. Material: { binding: { groupIndex: -1, bindingIndex: -1 } },
  134. Mesh: { binding: { groupIndex: -1, bindingIndex: -1 } },
  135. Internals: { binding: { groupIndex: -1, bindingIndex: -1 } },
  136. };
  137. WebGPUShaderProcessingContext._KnownUBOs = {
  138. Scene: { binding: { groupIndex: 0, bindingIndex: 0 } },
  139. Light0: { binding: { groupIndex: 1, bindingIndex: 0 } },
  140. Light1: { binding: { groupIndex: 1, bindingIndex: 1 } },
  141. Light2: { binding: { groupIndex: 1, bindingIndex: 2 } },
  142. Light3: { binding: { groupIndex: 1, bindingIndex: 3 } },
  143. Light4: { binding: { groupIndex: 1, bindingIndex: 4 } },
  144. Light5: { binding: { groupIndex: 1, bindingIndex: 5 } },
  145. Light6: { binding: { groupIndex: 1, bindingIndex: 6 } },
  146. Light7: { binding: { groupIndex: 1, bindingIndex: 7 } },
  147. Light8: { binding: { groupIndex: 1, bindingIndex: 8 } },
  148. Light9: { binding: { groupIndex: 1, bindingIndex: 9 } },
  149. Light10: { binding: { groupIndex: 1, bindingIndex: 10 } },
  150. Light11: { binding: { groupIndex: 1, bindingIndex: 11 } },
  151. Light12: { binding: { groupIndex: 1, bindingIndex: 12 } },
  152. Light13: { binding: { groupIndex: 1, bindingIndex: 13 } },
  153. Light14: { binding: { groupIndex: 1, bindingIndex: 14 } },
  154. Light15: { binding: { groupIndex: 1, bindingIndex: 15 } },
  155. Light16: { binding: { groupIndex: 1, bindingIndex: 16 } },
  156. Light17: { binding: { groupIndex: 1, bindingIndex: 17 } },
  157. Light18: { binding: { groupIndex: 1, bindingIndex: 18 } },
  158. Light19: { binding: { groupIndex: 1, bindingIndex: 19 } },
  159. Light20: { binding: { groupIndex: 1, bindingIndex: 20 } },
  160. Light21: { binding: { groupIndex: 1, bindingIndex: 21 } },
  161. Light22: { binding: { groupIndex: 1, bindingIndex: 22 } },
  162. Light23: { binding: { groupIndex: 1, bindingIndex: 23 } },
  163. Light24: { binding: { groupIndex: 1, bindingIndex: 24 } },
  164. Light25: { binding: { groupIndex: 1, bindingIndex: 25 } },
  165. Light26: { binding: { groupIndex: 1, bindingIndex: 26 } },
  166. Light27: { binding: { groupIndex: 1, bindingIndex: 27 } },
  167. Light28: { binding: { groupIndex: 1, bindingIndex: 28 } },
  168. Light29: { binding: { groupIndex: 1, bindingIndex: 29 } },
  169. Light30: { binding: { groupIndex: 1, bindingIndex: 30 } },
  170. Light31: { binding: { groupIndex: 1, bindingIndex: 31 } },
  171. Material: { binding: { groupIndex: 2, bindingIndex: 0 } },
  172. Mesh: { binding: { groupIndex: 2, bindingIndex: 1 } },
  173. Internals: { binding: { groupIndex: 2, bindingIndex: 2 } },
  174. };
  175. //# sourceMappingURL=webgpuShaderProcessingContext.js.map