@woosh/meep-engine 3.11.2 → 3.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
  4. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
  5. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
  6. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
  7. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  8. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
  9. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
  10. package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
  11. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  12. package/src/shade/device/ShadeGPUCommandContext.js +994 -940
  13. package/src/shade/device/immediate_data_supported.d.ts +33 -0
  14. package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
  15. package/src/shade/device/immediate_data_supported.js +53 -0
  16. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
  17. package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
  18. package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
  19. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
  20. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
  21. package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
  22. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  23. package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
  24. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
  25. package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
  26. package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
  27. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
  28. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  29. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
  30. package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
  31. package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
  32. package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
  33. package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
  34. package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
  35. package/src/shade/renderer/GraphicsContext.d.ts +9 -2
  36. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  37. package/src/shade/renderer/GraphicsContext.js +13 -1
  38. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  39. package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
  40. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
  41. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
  42. package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
  43. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
  44. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
  45. package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
  46. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
  47. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
  48. package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
  49. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
  50. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
  51. package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
  52. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
  53. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
  54. package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
  55. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
  56. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
  57. package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
  58. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
  59. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
  60. package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
  61. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
  62. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
  63. package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
  64. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
  65. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
  66. package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
  67. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
  68. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
  69. package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
  70. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
  71. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
  72. package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +165 -84
  73. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
  74. package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
  75. package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
  76. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
  77. package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
  78. package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +6 -2
  79. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  80. package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
  81. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  82. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
  83. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  84. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  85. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  86. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  87. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
  88. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  89. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
  90. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  91. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
  92. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  93. package/src/shade/renderer/shader/ComputeShader.js +6 -2
  94. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  95. package/src/shade/renderer/shader/ImageShader.js +4 -1
  96. package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
  97. package/src/shade/renderer/shader/ShaderDescriptor.js +26 -0
  98. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
  99. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
  100. package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
  101. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
  102. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
  103. package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
  104. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
  105. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
  106. package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
  107. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
  108. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
  109. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
  110. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
  111. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
  112. package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
  113. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
  114. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
  115. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
  116. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
  117. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
  118. package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
  119. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
  120. package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
  121. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
  122. package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
  123. package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
  124. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
  125. package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
  126. package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
  127. package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
  128. package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
  129. package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
  130. package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
  131. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
  132. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
  133. package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
  134. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  135. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
  136. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
  137. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
  138. package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
  139. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
  140. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  141. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
  142. package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
  143. package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
  144. package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
  145. package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
  146. package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
  147. package/src/shade/renderer/volumetrics/NOTES.md +238 -0
  148. package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
  149. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
  150. package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
  151. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
  152. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  153. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +594 -577
  154. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +16 -0
  155. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  156. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +19 -2
  157. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
  158. package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
  159. package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
  160. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
  161. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
  162. package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
  163. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
  164. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  165. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
  166. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
  167. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
  168. package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
@@ -1,4 +1,6 @@
1
1
  import { normalize_dynamic_offsets } from "./normalize_dynamic_offsets.js";
2
+ import { pipeline_immediate_size } from "./pipeline_immediate_size.js";
3
+ import { SoftwareGPUImmediateData } from "./SoftwareGPUImmediateData.js";
2
4
  import { SoftwareGPUObjectBase } from "./SoftwareGPUObjectBase.js";
3
5
  import { write_pass_timestamp } from "./write_pass_timestamp.js";
4
6
 
@@ -79,6 +81,14 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
79
81
  */
80
82
  #scissor = null;
81
83
 
84
+ /**
85
+ * Immediate data for this pass. Per-encoder state in WebGPU, and a new pass starts over — which
86
+ * is why it is constructed here rather than carried in from the command encoder.
87
+ *
88
+ * @type {SoftwareGPUImmediateData}
89
+ */
90
+ #immediates;
91
+
82
92
  #ended = false;
83
93
 
84
94
  /**
@@ -99,6 +109,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
99
109
 
100
110
  this.#encoder = encoder;
101
111
  this.descriptor = descriptor;
112
+ this.#immediates = new SoftwareGPUImmediateData(encoder.device.limits.maxImmediateSize);
102
113
 
103
114
  write_pass_timestamp(descriptor, 'beginningOfPassWriteIndex');
104
115
  }
@@ -138,6 +149,22 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
138
149
  );
139
150
  }
140
151
 
152
+ /**
153
+ * @param {number} range_offset byte offset into the immediate data range
154
+ * @param {ArrayBuffer|ArrayBufferView} data
155
+ * @param {number} [data_offset] in elements if `data` is a TypedArray, bytes otherwise
156
+ * @param {number} [data_size] in elements if `data` is a TypedArray, bytes otherwise
157
+ */
158
+ setImmediates(range_offset, data, data_offset = 0, data_size) {
159
+ this.#assert_encoding();
160
+
161
+ const message = this.#immediates.write(range_offset, data, data_offset, data_size);
162
+
163
+ if (message !== null) {
164
+ this.#encoder.notify_pass_validation_error(message);
165
+ }
166
+ }
167
+
141
168
  /**
142
169
  * @param {number} slot
143
170
  * @param {GPUBuffer} buffer
@@ -206,6 +233,24 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
206
233
  this.stencil_reference = reference;
207
234
  }
208
235
 
236
+ /**
237
+ * WebGPU's *Validate immediate data*: every slot the pipeline's immediate range covers must have
238
+ * been written before a command reads it. The bytes default to zero but the slots do not default
239
+ * to set, so a forgotten `setImmediates` is a refused draw on a real device rather than a shader
240
+ * quietly reading zeroes. Catching it here is the whole reason the slot bookkeeping exists.
241
+ *
242
+ * @returns {void}
243
+ */
244
+ #validate_immediates() {
245
+ const size = pipeline_immediate_size(this.#pipeline);
246
+
247
+ if (size > 0 && !this.#immediates.isRangeSet(0, size)) {
248
+ this.#encoder.notify_pass_validation_error(
249
+ `draw: pipeline declares ${size} bytes of immediate data, and not all of it was set by setImmediates`
250
+ );
251
+ }
252
+ }
253
+
209
254
  /**
210
255
  * The state a draw would run under, copied so later state changes do not rewrite a draw already
211
256
  * recorded.
@@ -221,6 +266,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
221
266
  index_buffer: this.#index_buffer,
222
267
  viewport: this.#viewport,
223
268
  scissor: this.#scissor,
269
+ immediates: this.#immediates.snapshot(),
224
270
  };
225
271
  }
226
272
 
@@ -230,6 +276,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
230
276
  */
231
277
  draw(vertex_count, instance_count = 1) {
232
278
  this.#assert_encoding();
279
+ this.#validate_immediates();
233
280
 
234
281
  this.draws.push({
235
282
  ...this.#snapshot(),
@@ -246,6 +293,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
246
293
  */
247
294
  drawIndexed(index_count, instance_count = 1) {
248
295
  this.#assert_encoding();
296
+ this.#validate_immediates();
249
297
 
250
298
  this.draws.push({
251
299
  ...this.#snapshot(),
@@ -262,6 +310,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
262
310
  */
263
311
  drawIndirect(indirect_buffer, indirect_offset) {
264
312
  this.#assert_encoding();
313
+ this.#validate_immediates();
265
314
 
266
315
  this.draws.push({
267
316
  ...this.#snapshot(),
@@ -281,6 +330,7 @@ export class SoftwareGPURenderPassEncoder extends SoftwareGPUObjectBase {
281
330
  */
282
331
  drawIndexedIndirect(indirect_buffer, indirect_offset) {
283
332
  this.#assert_encoding();
333
+ this.#validate_immediates();
284
334
 
285
335
  this.draws.push({
286
336
  ...this.#snapshot(),
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Bytes of immediate data a pipeline's layout declares, or 0 when it declares none.
3
+ *
4
+ * A pipeline built with `layout: "auto"` reports 0 rather than deriving a size: deriving one would
5
+ * mean reading the WGSL, and nothing in this folder compiles WGSL.
6
+ *
7
+ * @param {GPUPipelineBase|null} pipeline
8
+ * @returns {number}
9
+ */
10
+ export function pipeline_immediate_size(pipeline: GPUPipelineBase | null): number;
11
+ //# sourceMappingURL=pipeline_immediate_size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline_immediate_size.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/mock/pipeline_immediate_size.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,kDAHW,kBAAgB,IAAI,GAClB,MAAM,CAUlB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Bytes of immediate data a pipeline's layout declares, or 0 when it declares none.
3
+ *
4
+ * A pipeline built with `layout: "auto"` reports 0 rather than deriving a size: deriving one would
5
+ * mean reading the WGSL, and nothing in this folder compiles WGSL.
6
+ *
7
+ * @param {GPUPipelineBase|null} pipeline
8
+ * @returns {number}
9
+ */
10
+ export function pipeline_immediate_size(pipeline) {
11
+ const layout = pipeline?.descriptor?.layout;
12
+
13
+ if (layout === undefined || layout === null || layout === "auto") {
14
+ return 0;
15
+ }
16
+
17
+ return layout.immediateSize ?? 0;
18
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineLayoutManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/pipeline/PipelineLayoutManager.js"],"names":[],"mappings":"AAGA;IAMI;;;OAGG;IACH,+BAEC;IAoBD;;;;OAIG;IACH,2DAFa,4BAA0B,SAAS,CAI/C;IAgBD;;;;OAIG;IACH,iFAKC;IAED;;;;OAIG;IACH,8EAEC;;CAkBJ"}
1
+ {"version":3,"file":"PipelineLayoutManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/device/pipeline/PipelineLayoutManager.js"],"names":[],"mappings":"AAGA;IAMI;;;OAGG;IACH,+BAEC;IAoBD;;;;OAIG;IACH,2DAFa,4BAA0B,SAAS,CAI/C;IAgBD;;;;OAIG;IACH,iFAKC;IAED;;;;OAIG;IACH,8EAEC;;CAmBJ"}
@@ -89,6 +89,7 @@ export class PipelineLayoutManager {
89
89
  return this.#device.createPipelineLayout({
90
90
  label: descriptor.label,
91
91
  bindGroupLayouts,
92
+ immediateSize: descriptor.immediateSize,
92
93
  });
93
94
 
94
95
  }
@@ -89,8 +89,15 @@ export class GraphicsContext {
89
89
  * @param {GPUBindingCommandsMixin} pass
90
90
  * @param {PipelineDescriptorBase} pipeline
91
91
  * @param {GPUBindingResource[][]} [bindings]
92
- */
93
- setPipelineBindings(pass: GPUBindingCommandsMixin, pipeline: PipelineDescriptorBase, bindings?: GPUBindingResource[][]): void;
92
+ * @param {{buffer: BinaryBuffer, offset: number, size: number}} [immediate] bytes to hand the
93
+ * pass through `setImmediates`, when the pipeline declares immediate data. Optional so
94
+ * that every caller predating immediates keeps working unchanged.
95
+ */
96
+ setPipelineBindings(pass: GPUBindingCommandsMixin, pipeline: PipelineDescriptorBase, bindings?: GPUBindingResource[][], immediate?: {
97
+ buffer: BinaryBuffer;
98
+ offset: number;
99
+ size: number;
100
+ }): void;
94
101
  /**
95
102
  *
96
103
  * @param {BufferDescriptor} buffer_descriptor
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AAwBA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD;;;;;OAKG;IACH,gGAFW,oBAAoB,EAAE,QAwDhC;IAED;;;;OAIG;IACH,mDAFa,gBAAgB,CAI5B;IAED;;OAEG;IACH,+BAcC;IAED,4BAEC;IAED,eAmBC;IAED,gBAcC;IAGL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;mCAlUkC,kCAAkC;mCAGlC,kCAAkC;kCADnC,wBAAwB;2CAEf,mDAAmD;oCAH1D,2CAA2C;sCAXzC,6CAA6C;sCAC7C,6CAA6C;uCAF5C,8CAA8C;qCAIhD,0CAA0C;+BAchD,6BAA6B;sCACtB,4CAA4C;iCAbjD,+BAA+B;mCAC7B,gCAAgC;yCAC1B,sCAAsC;0CAErC,uCAAuC;oCAO7C,kCAAkC;iCARtB,8BAA8B"}
1
+ {"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AAwBA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD;;;;;;;;OAQG;IACH,gGALW,oBAAoB,EAAE,cACtB;QAAC,MAAM,eAAe;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,QAmE9D;IAED;;;;OAIG;IACH,mDAFa,gBAAgB,CAI5B;IAED;;OAEG;IACH,+BAcC;IAED,4BAEC;IAED,eAmBC;IAED,gBAcC;IAGL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;mCA9UkC,kCAAkC;mCAGlC,kCAAkC;kCADnC,wBAAwB;2CAEf,mDAAmD;oCAH1D,2CAA2C;sCAXzC,6CAA6C;sCAC7C,6CAA6C;uCAF5C,8CAA8C;qCAIhD,0CAA0C;+BAchD,6BAA6B;sCACtB,4CAA4C;iCAbjD,+BAA+B;mCAC7B,gCAAgC;yCAC1B,sCAAsC;0CAErC,uCAAuC;oCAO7C,kCAAkC;iCARtB,8BAA8B"}
@@ -207,14 +207,26 @@ export class GraphicsContext {
207
207
  * @param {GPUBindingCommandsMixin} pass
208
208
  * @param {PipelineDescriptorBase} pipeline
209
209
  * @param {GPUBindingResource[][]} [bindings]
210
+ * @param {{buffer: BinaryBuffer, offset: number, size: number}} [immediate] bytes to hand the
211
+ * pass through `setImmediates`, when the pipeline declares immediate data. Optional so
212
+ * that every caller predating immediates keeps working unchanged.
210
213
  */
211
214
  setPipelineBindings(
212
215
  pass,
213
216
  pipeline,
214
- bindings
217
+ bindings,
218
+ immediate
215
219
  ) {
216
220
  assert.isArray(bindings, 'bindings');
217
221
 
222
+ if (immediate !== undefined) {
223
+ // `raw_bytes` is read here rather than cached by the caller: BinaryBuffer rebinds it
224
+ // when the backing store grows, so a reference taken earlier can be stale. It is also a
225
+ // Uint8Array, for which `setImmediates` counts offset and size in elements — and its
226
+ // elements are bytes, so the range passes through unchanged.
227
+ pass.setImmediates(0, immediate.buffer.raw_bytes, immediate.offset, immediate.size);
228
+ }
229
+
218
230
  const bind_group_descriptors = pipeline.layout.bindGroupLayouts;
219
231
 
220
232
  const bind_group_count = bindings.length;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUSky.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/GPUSky.js"],"names":[],"mappings":"AASA;IAuCI;;;OAGG;IACH,uCAkBC;IAjDD;;;OAGG;IACH,2CAEC;IAOD;;;OAGG;IACH,iDAEC;IAgCD,gBAGC;IAED,cAYC;IAED;;OAEG;IACH,eA8CC;;CAEJ;kCAzIiC,iCAAiC"}
1
+ {"version":3,"file":"GPUSky.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/GPUSky.js"],"names":[],"mappings":"AAUA;IAuCI;;;OAGG;IACH,uCAmBC;IAlDD;;;OAGG;IACH,2CAEC;IAOD;;;OAGG;IACH,iDAEC;IAiCD,gBAGC;IAED,cAYC;IAED;;OAEG;IACH,eA+CC;;CAEJ;kCA3IiC,iCAAiC"}
@@ -1,143 +1,146 @@
1
- import { FrameGraph } from "../../../engine/graphics/render/frame_graph/FrameGraph.js";
2
- import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
3
- import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
4
- import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
5
- import { debug_draw_texture } from "../texture/debug_draw_texture.js";
6
- import { GPUTextureContext } from "../texture/GPUTextureContext.js";
7
- import { shader_multiscatter_lut } from "./shader_multiscatter_lut.js";
8
- import { shader_transmittance_lut } from "./shader_transmittance_lut.js";
9
-
10
- export class GPUSky {
11
-
12
- /**
13
- * @type {GraphicsContext}
14
- */
15
- #graphics;
16
-
17
- /**
18
- * @type {GPUTextureContext}
19
- */
20
- #lut_transmittance;
21
-
22
- /**
23
- *
24
- * @returns {GPUTextureContext}
25
- */
26
- get lut_transmittance() {
27
- return this.#lut_transmittance;
28
- }
29
-
30
- /**
31
- * @type {GPUTextureContext}
32
- */
33
- #lut_multiple_scattering;
34
-
35
- /**
36
- *
37
- * @returns {GPUTextureContext}
38
- */
39
- get lut_multiple_scattering() {
40
- return this.#lut_multiple_scattering;
41
- }
42
-
43
- /**
44
- *
45
- * @type {boolean}
46
- */
47
- #needs_update = true;
48
-
49
- /**
50
- *
51
- * @param {GraphicsContext} graphics
52
- */
53
- constructor(graphics) {
54
- this.#graphics = graphics;
55
-
56
- const device = graphics.device;
57
-
58
- this.#lut_transmittance = new GPUTextureContext(device);
59
- this.#lut_transmittance.descriptor.label = "Sky / Transmittance LUT";
60
- this.#lut_transmittance.descriptor.format = "rgba16float";
61
- this.#lut_transmittance.descriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
62
- this.#lut_transmittance.resize(256, 64);
63
-
64
- this.#lut_multiple_scattering = new GPUTextureContext(device);
65
- this.#lut_multiple_scattering.descriptor.label = "Sky / Multiple Scattering LUT";
66
- this.#lut_multiple_scattering.descriptor.format = "rgba16float";
67
- this.#lut_multiple_scattering.descriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
68
- this.#lut_multiple_scattering.resize(32, 32);
69
-
70
-
71
- }
72
-
73
- destroy() {
74
- this.#lut_transmittance.destroy();
75
- this.#lut_multiple_scattering.destroy();
76
- }
77
-
78
- debug() {
79
-
80
-
81
- let y = 50;
82
- debug_draw_texture({ texture: this.#lut_transmittance, x: 50, y: y });
83
-
84
- y += this.#lut_transmittance.size[1] + 50;
85
-
86
- debug_draw_texture({ texture: this.#lut_multiple_scattering, x: 50, y: y });
87
-
88
- y += this.#lut_multiple_scattering.size[1] + 50;
89
-
90
- }
91
-
92
- /**
93
- *
94
- */
95
- update() {
96
- if (!this.#needs_update) {
97
- return;
98
- }
99
-
100
- const graph = new FrameGraph("sky update");
101
-
102
- const command_ctx = ShadeGPUCommandContext.create(
103
- this.#graphics,
104
- "Renderer/main"
105
- );
106
-
107
- const gr_transmittance = graph.import_resource("transmittance", TextureResourceDescriptor.fromTexture(this.#lut_transmittance.gpu_texture), this.#lut_transmittance);
108
- const gr_multiscatter = graph.import_resource("multiscatter", TextureResourceDescriptor.fromTexture(this.#lut_multiple_scattering.gpu_texture), this.#lut_multiple_scattering);
109
-
110
- graph_image_pass({
111
- graph,
112
- shader: shader_transmittance_lut,
113
- inputs: {
114
- settings: {
115
- steps: 40,
116
- }
117
- },
118
- output: [gr_transmittance]
119
- });
120
-
121
-
122
- graph_image_pass({
123
- graph,
124
- shader: shader_multiscatter_lut,
125
- inputs: {
126
- settings: {
127
- steps: 20,
128
- sqrt_samples: 8,
129
- },
130
- tSkyLutTransmittance: gr_transmittance
131
- },
132
- output: [gr_multiscatter]
133
- });
134
-
135
- command_ctx.encodeGraph(graph);
136
-
137
- command_ctx.finish();
138
-
139
-
140
- this.#needs_update = false;
141
- }
142
-
1
+ import { FrameGraph } from "../../../engine/graphics/render/frame_graph/FrameGraph.js";
2
+ import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
3
+ import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
4
+ import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
5
+ import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
6
+ import { debug_draw_texture } from "../texture/debug_draw_texture.js";
7
+ import { GPUTextureContext } from "../texture/GPUTextureContext.js";
8
+ import { shader_multiscatter_lut } from "./shader_multiscatter_lut.js";
9
+ import { shader_transmittance_lut } from "./shader_transmittance_lut.js";
10
+
11
+ export class GPUSky {
12
+
13
+ /**
14
+ * @type {GraphicsContext}
15
+ */
16
+ #graphics;
17
+
18
+ /**
19
+ * @type {GPUTextureContext}
20
+ */
21
+ #lut_transmittance;
22
+
23
+ /**
24
+ *
25
+ * @returns {GPUTextureContext}
26
+ */
27
+ get lut_transmittance() {
28
+ return this.#lut_transmittance;
29
+ }
30
+
31
+ /**
32
+ * @type {GPUTextureContext}
33
+ */
34
+ #lut_multiple_scattering;
35
+
36
+ /**
37
+ *
38
+ * @returns {GPUTextureContext}
39
+ */
40
+ get lut_multiple_scattering() {
41
+ return this.#lut_multiple_scattering;
42
+ }
43
+
44
+ /**
45
+ *
46
+ * @type {boolean}
47
+ */
48
+ #needs_update = true;
49
+
50
+ /**
51
+ *
52
+ * @param {GraphicsContext} graphics
53
+ */
54
+ constructor(graphics) {
55
+ this.#graphics = graphics;
56
+
57
+ const device = graphics.device;
58
+
59
+ this.#lut_transmittance = new GPUTextureContext(device);
60
+ this.#lut_transmittance.descriptor.label = "Sky / Transmittance LUT";
61
+ this.#lut_transmittance.descriptor.format = "rgba16float";
62
+ this.#lut_transmittance.descriptor.usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
63
+ this.#lut_transmittance.resize(256, 64);
64
+
65
+ this.#lut_multiple_scattering = new GPUTextureContext(device);
66
+ this.#lut_multiple_scattering.descriptor.label = "Sky / Multiple Scattering LUT";
67
+ this.#lut_multiple_scattering.descriptor.format = "rgba16float";
68
+ // written by a compute shader, so STORAGE_BINDING rather than RENDER_ATTACHMENT
69
+ this.#lut_multiple_scattering.descriptor.usage = GPUTextureUsage.STORAGE_BINDING | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC;
70
+ this.#lut_multiple_scattering.resize(32, 32);
71
+
72
+
73
+ }
74
+
75
+ destroy() {
76
+ this.#lut_transmittance.destroy();
77
+ this.#lut_multiple_scattering.destroy();
78
+ }
79
+
80
+ debug() {
81
+
82
+
83
+ let y = 50;
84
+ debug_draw_texture({ texture: this.#lut_transmittance, x: 50, y: y });
85
+
86
+ y += this.#lut_transmittance.size[1] + 50;
87
+
88
+ debug_draw_texture({ texture: this.#lut_multiple_scattering, x: 50, y: y });
89
+
90
+ y += this.#lut_multiple_scattering.size[1] + 50;
91
+
92
+ }
93
+
94
+ /**
95
+ *
96
+ */
97
+ update() {
98
+ if (!this.#needs_update) {
99
+ return;
100
+ }
101
+
102
+ const graph = new FrameGraph("sky update");
103
+
104
+ const command_ctx = ShadeGPUCommandContext.create(
105
+ this.#graphics,
106
+ "Renderer/main"
107
+ );
108
+
109
+ const gr_transmittance = graph.import_resource("transmittance", TextureResourceDescriptor.fromTexture(this.#lut_transmittance.gpu_texture), this.#lut_transmittance);
110
+ const gr_multiscatter = graph.import_resource("multiscatter", TextureResourceDescriptor.fromTexture(this.#lut_multiple_scattering.gpu_texture), this.#lut_multiple_scattering);
111
+
112
+ graph_image_pass({
113
+ graph,
114
+ shader: shader_transmittance_lut,
115
+ inputs: {
116
+ settings: {
117
+ steps: 40,
118
+ // read off the texture rather than restated, so the two cannot disagree
119
+ resolution: [this.#lut_transmittance.width, this.#lut_transmittance.height],
120
+ }
121
+ },
122
+ output: [gr_transmittance]
123
+ });
124
+
125
+
126
+ graph_compute_pass({
127
+ graph,
128
+ shader: shader_multiscatter_lut,
129
+ // one workgroup per LUT texel, counted off the texture being written so the
130
+ // dispatch cannot cover a different area than the shader stores into
131
+ group_count: [this.#lut_multiple_scattering.width, this.#lut_multiple_scattering.height, 1],
132
+ bindings: {
133
+ tSkyLutTransmittance: gr_transmittance,
134
+ tSkyLutMultiscatterOut: gr_multiscatter
135
+ }
136
+ });
137
+
138
+ command_ctx.encodeGraph(graph);
139
+
140
+ command_ctx.finish();
141
+
142
+
143
+ this.#needs_update = false;
144
+ }
145
+
143
146
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Directions are drawn on an 8x8 grid, stratified in azimuth and in the cosine of the polar
3
+ * angle. Matches Hillaire's `SQRTSAMPLECOUNT`.
4
+ * @type {number}
5
+ */
6
+ export const MULTISCATTER_LUT_SQRT_SAMPLES: number;
7
+ /**
8
+ * One thread integrates one direction, so this is also the workgroup size.
9
+ *
10
+ * 64 is Hillaire's `[numthreads(1,1,64)]` count. It is a multiple of every legal subgroup
11
+ * size up to 64, and the reduction handles a subgroup wider than the workgroup, so no
12
+ * hardware needs a different number here.
13
+ * @type {number}
14
+ */
15
+ export const MULTISCATTER_LUT_DIRECTION_COUNT: number;
16
+ /**
17
+ * Ray-march steps per direction. Hillaire's `SampleCountIni` for this LUT; the comment there
18
+ * reads "a minimum set of step is required for accuracy unfortunately".
19
+ *
20
+ * Compile-time on purpose: as a uniform the inner loop cannot be unrolled and the trip count
21
+ * has to be re-tested against an f32 every iteration.
22
+ * @type {number}
23
+ */
24
+ export const MULTISCATTER_LUT_STEPS: number;
25
+ /**
26
+ * Upper bound on the number of subgroups in one workgroup, which is how many partial sums
27
+ * the cross-subgroup reduction has to combine.
28
+ *
29
+ * WGSL pins the subgroup size to a power of two in [4, 128], so the worst case is
30
+ * {@link MULTISCATTER_LUT_DIRECTION_COUNT} / 4.
31
+ * @type {number}
32
+ */
33
+ export const MULTISCATTER_LUT_MAX_SUBGROUP_PARTIALS: number;
34
+ //# sourceMappingURL=MULTISCATTER_LUT_CONFIG.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MULTISCATTER_LUT_CONFIG.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;;;;GAOG;AACH,+CAFU,MAAM,CAE8F;AAE9G;;;;;;;GAOG;AACH,qCAFU,MAAM,CAEyB;AAEzC;;;;;;;GAOG;AACH,qDAFU,MAAM,CAE2E"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Directions are drawn on an 8x8 grid, stratified in azimuth and in the cosine of the polar
3
+ * angle. Matches Hillaire's `SQRTSAMPLECOUNT`.
4
+ * @type {number}
5
+ */
6
+ export const MULTISCATTER_LUT_SQRT_SAMPLES = 8;
7
+
8
+ /**
9
+ * One thread integrates one direction, so this is also the workgroup size.
10
+ *
11
+ * 64 is Hillaire's `[numthreads(1,1,64)]` count. It is a multiple of every legal subgroup
12
+ * size up to 64, and the reduction handles a subgroup wider than the workgroup, so no
13
+ * hardware needs a different number here.
14
+ * @type {number}
15
+ */
16
+ export const MULTISCATTER_LUT_DIRECTION_COUNT = MULTISCATTER_LUT_SQRT_SAMPLES * MULTISCATTER_LUT_SQRT_SAMPLES;
17
+
18
+ /**
19
+ * Ray-march steps per direction. Hillaire's `SampleCountIni` for this LUT; the comment there
20
+ * reads "a minimum set of step is required for accuracy unfortunately".
21
+ *
22
+ * Compile-time on purpose: as a uniform the inner loop cannot be unrolled and the trip count
23
+ * has to be re-tested against an f32 every iteration.
24
+ * @type {number}
25
+ */
26
+ export const MULTISCATTER_LUT_STEPS = 20;
27
+
28
+ /**
29
+ * Upper bound on the number of subgroups in one workgroup, which is how many partial sums
30
+ * the cross-subgroup reduction has to combine.
31
+ *
32
+ * WGSL pins the subgroup size to a power of two in [4, 128], so the worst case is
33
+ * {@link MULTISCATTER_LUT_DIRECTION_COUNT} / 4.
34
+ * @type {number}
35
+ */
36
+ export const MULTISCATTER_LUT_MAX_SUBGROUP_PARTIALS = MULTISCATTER_LUT_DIRECTION_COUNT / 4;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Filtering sampler for the sky LUTs (transmittance, multiple-scattering).
3
+ *
4
+ * Both LUTs are `rgba16float`, which is filterable in core WebGPU — only the 32-bit float
5
+ * formats need the `float32-filterable` feature — so these can go through the texture unit
6
+ * instead of the 4-tap manual bilinear in `texture_sample_bilinear_uv`.
7
+ *
8
+ * `min` and `mag` are both set: the LUTs are single-mip and sampled with an explicit LOD of
9
+ * 0, which selects the magnification filter, but relying on that alone would silently fall
10
+ * back to point sampling if either LUT ever grew mips.
11
+ *
12
+ * Clamp-to-edge reproduces the manual filter's per-corner clamping exactly: `uv` is
13
+ * saturated by `sky_lut_uv`, and at the edges both bilinear taps collapse onto the edge
14
+ * texel.
15
+ *
16
+ * @type {Readonly<SamplerDescriptor>}
17
+ */
18
+ export const SAMPLER_SKY_LUT: Readonly<SamplerDescriptor>;
19
+ import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
20
+ //# sourceMappingURL=SAMPLER_SKY_LUT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SAMPLER_SKY_LUT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,8BAFU,SAAS,iBAAiB,CAAC,CAOjC;kCAxB8B,+CAA+C"}
@@ -0,0 +1,25 @@
1
+ import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
2
+
3
+ /**
4
+ * Filtering sampler for the sky LUTs (transmittance, multiple-scattering).
5
+ *
6
+ * Both LUTs are `rgba16float`, which is filterable in core WebGPU — only the 32-bit float
7
+ * formats need the `float32-filterable` feature — so these can go through the texture unit
8
+ * instead of the 4-tap manual bilinear in `texture_sample_bilinear_uv`.
9
+ *
10
+ * `min` and `mag` are both set: the LUTs are single-mip and sampled with an explicit LOD of
11
+ * 0, which selects the magnification filter, but relying on that alone would silently fall
12
+ * back to point sampling if either LUT ever grew mips.
13
+ *
14
+ * Clamp-to-edge reproduces the manual filter's per-corner clamping exactly: `uv` is
15
+ * saturated by `sky_lut_uv`, and at the edges both bilinear taps collapse onto the edge
16
+ * texel.
17
+ *
18
+ * @type {Readonly<SamplerDescriptor>}
19
+ */
20
+ export const SAMPLER_SKY_LUT = Object.freeze(SamplerDescriptor.from({
21
+ magFilter: "linear",
22
+ minFilter: "linear",
23
+ addressModeU: "clamp-to-edge",
24
+ addressModeV: "clamp-to-edge",
25
+ }));