@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.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts +16 -2
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +28 -4
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +5 -2
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +564 -451
- package/src/shade/device/ShadeGPUCommandContext.d.ts +18 -2
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +994 -940
- package/src/shade/device/immediate_data_supported.d.ts +33 -0
- package/src/shade/device/immediate_data_supported.d.ts.map +1 -0
- package/src/shade/device/immediate_data_supported.js +53 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +18 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +24 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +49 -1
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -2
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts +65 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.d.ts.map +1 -0
- package/src/shade/device/mock/SoftwareGPUImmediateData.js +160 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +7 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +50 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts +11 -0
- package/src/shade/device/mock/pipeline_immediate_size.d.ts.map +1 -0
- package/src/shade/device/mock/pipeline_immediate_size.js +18 -0
- package/src/shade/device/pipeline/PipelineLayoutManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/PipelineLayoutManager.js +1 -0
- package/src/shade/renderer/GraphicsContext.d.ts +9 -2
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +13 -1
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +145 -142
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts +34 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/MULTISCATTER_LUT_CONFIG.js +36 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts +20 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/SAMPLER_SKY_LUT.js +25 -0
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts +14 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_get_multiscatter_values.js +163 -177
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts +20 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_multiscatter_sample_direction.js +46 -0
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts +11 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_multiscatter_lut.js +57 -27
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts +19 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sample_transmittance_lut.js +69 -33
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/chunk_sky_lut_compute_uv.js +35 -35
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts +13 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_params.js +38 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts +17 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_texel_to_unit.js +29 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts +21 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.d.ts.map +1 -0
- package/src/shade/renderer/atmosphere/chunk_sky_lut_uv.js +42 -0
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts +2 -2
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_multiscatter_lut.js +165 -84
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_sky_irradiance_lut.js +215 -204
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +79 -67
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +6 -2
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +4 -0
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +341 -345
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +7 -3
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +77 -81
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +5 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +6 -2
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +4 -1
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +26 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/ATMOSPHERE_RADII_DECLARATION.js +32 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/PLANET_CENTER_DECLARATION.js +17 -6
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_atmosphere_ray_bounds.js +69 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_contains_aabb3.js +22 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts +16 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_from_transformed_corners.js +41 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts +11 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_m4.js +15 -19
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/frustum/chunk_frustum_transform_plane_matrix.js +44 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js +1 -4
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +7 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +37 -2
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/compute/compute_binding_read_names.js +6 -0
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +1 -1
- package/src/shade/renderer/shader/graph/compute/graph_compute_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_image_pass.js +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_bindings.js +7 -0
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts +3 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_prepare_pass_input_data.js +12 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts +21 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.d.ts.map +1 -0
- package/src/shade/renderer/shader/resource/IMMEDIATE_DATA.js +21 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts +59 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +195 -2
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts +14 -0
- package/src/shade/renderer/shader/type/type_has_arrays.d.ts.map +1 -0
- package/src/shade/renderer/shader/type/type_has_arrays.js +33 -0
- package/src/shade/renderer/view/GPUViewSkyContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewSkyContext.js +169 -173
- package/src/shade/renderer/volumetrics/NOTES.md +238 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_local_light_shadow.js +145 -145
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sun_optical_depth.js +38 -15
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +14 -2
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +594 -577
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts +16 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +19 -2
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +29 -18
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +260 -260
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts +53 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +175 -59
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +8 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +1325 -1297
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/volumetrics/VOLUMETRICS_WORKGROUP_RESOLUTION.js +0 -1
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
export class ShaderResourceSetDescriptor {
|
|
2
|
+
/**
|
|
3
|
+
* @returns {{name: string, type: WebGPUType}|undefined}
|
|
4
|
+
*/
|
|
5
|
+
get immediate(): {
|
|
6
|
+
name: string;
|
|
7
|
+
type: WebGPUType;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Bytes of immediate data this shader reads, rounded up to the 4-byte granularity WebGPU
|
|
11
|
+
* requires of `immediateSize`. Zero when there is no immediate declaration.
|
|
12
|
+
*
|
|
13
|
+
* @returns {number}
|
|
14
|
+
*/
|
|
15
|
+
get immediateSize(): number;
|
|
16
|
+
/**
|
|
17
|
+
* Declare this shader's immediate data — the WGSL `immediate` address space, which reaches the
|
|
18
|
+
* GPU through `setImmediates` on the pass encoder rather than through a bind group.
|
|
19
|
+
*
|
|
20
|
+
* Every restriction below is checked here rather than left to `createShaderModule`, because the
|
|
21
|
+
* device-side failure is a shader-creation error whose message names neither this descriptor nor
|
|
22
|
+
* the shader it belongs to.
|
|
23
|
+
*
|
|
24
|
+
* @param {string} name
|
|
25
|
+
* @param {WebGPUType|string} _type must be host-shareable, constructible, array-free, and fit
|
|
26
|
+
* the device's `maxImmediateSize`
|
|
27
|
+
* @returns {this}
|
|
28
|
+
*/
|
|
29
|
+
setImmediate(name: string, _type: WebGPUType | string): this;
|
|
2
30
|
/**
|
|
3
31
|
* Do not modify directly
|
|
4
32
|
* @returns {ShaderResourceGroupDescriptor[]}
|
|
@@ -14,7 +42,20 @@ export class ShaderResourceSetDescriptor {
|
|
|
14
42
|
* @param {string} name
|
|
15
43
|
* @returns {ShaderResourceDescriptor}
|
|
16
44
|
*/
|
|
17
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Whether `name` is this shader's immediate data.
|
|
47
|
+
*
|
|
48
|
+
* Immediate data is deliberately absent from {@link getResourceByName}: it is not a bound
|
|
49
|
+
* resource and has no binding layout, so anything walking the resource interface should not see
|
|
50
|
+
* it. The graph helpers still need to recognise the name, because an immediate value travels to
|
|
51
|
+
* the encoder as a plain value rather than as a graph resource — and a `u32` immediate is a
|
|
52
|
+
* number, which those helpers would otherwise read as a graph resource id.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} name
|
|
55
|
+
* @returns {boolean}
|
|
56
|
+
*/
|
|
57
|
+
isImmediateName(name: string): boolean;
|
|
58
|
+
getResourceByName(name: any): import("./ShaderResourceDescriptor.js").ShaderResourceDescriptor;
|
|
18
59
|
/**
|
|
19
60
|
*
|
|
20
61
|
* @param {number} [index]
|
|
@@ -60,6 +101,23 @@ export class ShaderResourceSetDescriptor {
|
|
|
60
101
|
* @return {CodeChunk}
|
|
61
102
|
*/
|
|
62
103
|
generateCodeChunk(): CodeChunk;
|
|
104
|
+
/**
|
|
105
|
+
* Serialise this shader's immediate data into `buffer` at its current `position`, advancing
|
|
106
|
+
* `position` past what was written.
|
|
107
|
+
*
|
|
108
|
+
* **Allocates nothing.** That is the point of taking a caller-owned {@link BinaryBuffer} rather
|
|
109
|
+
* than returning bytes: `write_gpu_typed_buffer` would rebind a scratch buffer with a fresh
|
|
110
|
+
* `DataView` and `Uint8Array` on every call, which is two allocations per dispatch for a value
|
|
111
|
+
* that is often four bytes. {@link write_wgsl_type_value} takes the buffer directly and does not.
|
|
112
|
+
*
|
|
113
|
+
* The caller owns `position` because the caller owns the buffer — this only ever appends at the
|
|
114
|
+
* cursor it is handed.
|
|
115
|
+
*
|
|
116
|
+
* @param {Object} map the same binding map {@link generateBindings} reads
|
|
117
|
+
* @param {BinaryBuffer} buffer must already be set to the platform's endianness
|
|
118
|
+
* @returns {boolean} false when this shader declares no immediate data, and nothing was written
|
|
119
|
+
*/
|
|
120
|
+
writeImmediate(map: any, buffer: BinaryBuffer): boolean;
|
|
63
121
|
#private;
|
|
64
122
|
}
|
|
65
123
|
export namespace ShaderResourceSetDescriptor {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"AA8HA;IAoBI;;OAEG;IACH;cAFoB,MAAM;;MAIzB;IAED;;;;;OAKG;IACH,4BAMC;IAED;;;;;;;;;;;;OAYG;IACH,mBALW,MAAM,SACN,aAAW,MAAM,GAEf,IAAI,CA6ChB;IAED;;;OAGG;IACH,8CAEC;IAGD;;;OAGG;IACH,6CAEC;IAaD;;;;OAIG;IACH;;;;;;;;;;;OAWG;IACH,sBAHW,MAAM,GACJ,OAAO,CAInB;IAED,+FAYC;IAED;;;;;OAKG;IACH,gCAJW,MAAM,GAEJ,6BAA6B,CAsBzC;IAED;;;;OAIG;IACH,gBAHW,6BAA6B,GAC3B,OAAO,CAQnB;IAED;;;OAGG;IACH,qBAFW,iBAAe,MAAM,QAW/B;IAED;;OAEG;IACH,oCAFa,wBAAwB,CAiBpC;IAED;;;OAGG;IACH,yBAFY,EAAE,EAAE,CAcf;IAED;;;;OAIG;IACH,8BAHW,iBAAe,MAAM,GACnB,wBAAwB,CAMpC;IAED;;;;;OAKG;IACH,8DAFa,oBAAoB,EAAE,CAgBlC;IAED;;;OAGG;IACH,qBAFY,SAAS,CAwGpB;IAED;;;;;;;;;;;;;;;OAeG;IACH,gDAFa,OAAO,CA0CnB;;CACJ;;eAKS,SAAS,2BAA2B,CAAC;;8CAzjBD,oCAAoC;yCAXzC,0DAA0D;0BAIzE,0BAA0B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { round_up } from "../../../../core/math/round_up.js";
|
|
2
3
|
import LineBuilder from "../../../../core/codegen/LineBuilder.js";
|
|
3
4
|
import { array_push_if_unique } from "../../../../core/collection/array/array_push_if_unique.js";
|
|
4
5
|
import { objectKeyByValue } from "../../../../core/model/object/objectKeyByValue.js";
|
|
@@ -7,6 +8,11 @@ import {
|
|
|
7
8
|
wgsl_texture_declaration_by_sample_type
|
|
8
9
|
} from "../../texture/format/wgsl_texture_declaration_by_sample_type.js";
|
|
9
10
|
import { CodeChunk } from "../compiler/CodeChunk.js";
|
|
11
|
+
import { parse_wgsl_type } from "../type/parse_wgsl_type.js";
|
|
12
|
+
import { type_has_arrays } from "../type/type_has_arrays.js";
|
|
13
|
+
import { type_has_atomics } from "../type/type_has_atomics.js";
|
|
14
|
+
import { write_wgsl_type_value } from "../type/serde/write_gpu_typed_buffer.js";
|
|
15
|
+
import { IMMEDIATE_ADDRESS_SPACE_EXTENSION, IMMEDIATE_SIZE_FLOOR } from "./IMMEDIATE_DATA.js";
|
|
10
16
|
import { ResourceType } from "./ResourceType.js";
|
|
11
17
|
import { ShaderResourceGroupDescriptor } from "./ShaderResourceGroupDescriptor.js";
|
|
12
18
|
|
|
@@ -126,6 +132,97 @@ export class ShaderResourceSetDescriptor {
|
|
|
126
132
|
*/
|
|
127
133
|
#groups = [];
|
|
128
134
|
|
|
135
|
+
/**
|
|
136
|
+
* The shader's immediate data declaration, or undefined when it has none.
|
|
137
|
+
*
|
|
138
|
+
* Deliberately not a member of any {@link ShaderResourceGroupDescriptor}: immediate data has no
|
|
139
|
+
* `@group` and no `@binding`, and WGSL is explicit that it is part of a shader's *interface*
|
|
140
|
+
* without being part of its *resource interface*. Modelling it as a group member would give it
|
|
141
|
+
* a binding index that does not exist.
|
|
142
|
+
*
|
|
143
|
+
* @type {{name: string, type: WebGPUType}|undefined}
|
|
144
|
+
*/
|
|
145
|
+
#immediate = undefined;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @returns {{name: string, type: WebGPUType}|undefined}
|
|
149
|
+
*/
|
|
150
|
+
get immediate() {
|
|
151
|
+
return this.#immediate;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Bytes of immediate data this shader reads, rounded up to the 4-byte granularity WebGPU
|
|
156
|
+
* requires of `immediateSize`. Zero when there is no immediate declaration.
|
|
157
|
+
*
|
|
158
|
+
* @returns {number}
|
|
159
|
+
*/
|
|
160
|
+
get immediateSize() {
|
|
161
|
+
if (this.#immediate === undefined) {
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return round_up(this.#immediate.type.size, 4);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Declare this shader's immediate data — the WGSL `immediate` address space, which reaches the
|
|
170
|
+
* GPU through `setImmediates` on the pass encoder rather than through a bind group.
|
|
171
|
+
*
|
|
172
|
+
* Every restriction below is checked here rather than left to `createShaderModule`, because the
|
|
173
|
+
* device-side failure is a shader-creation error whose message names neither this descriptor nor
|
|
174
|
+
* the shader it belongs to.
|
|
175
|
+
*
|
|
176
|
+
* @param {string} name
|
|
177
|
+
* @param {WebGPUType|string} _type must be host-shareable, constructible, array-free, and fit
|
|
178
|
+
* the device's `maxImmediateSize`
|
|
179
|
+
* @returns {this}
|
|
180
|
+
*/
|
|
181
|
+
setImmediate(name, _type) {
|
|
182
|
+
assert.isString(name, 'name');
|
|
183
|
+
assert.defined(_type, 'type');
|
|
184
|
+
|
|
185
|
+
if (this.#immediate !== undefined) {
|
|
186
|
+
throw new Error(
|
|
187
|
+
`Immediate data is already declared as '${this.#immediate.name}'. WGSL allows at most one immediate variable per entry point, so '${name}' would have to replace it.`
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
let type = _type;
|
|
192
|
+
|
|
193
|
+
if (typeof type === "string") {
|
|
194
|
+
type = parse_wgsl_type(type);
|
|
195
|
+
} else {
|
|
196
|
+
assert.equal(type.isWebGPUType, true, 'type.isWebGPUType !== true');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (type.runtime_sized) {
|
|
200
|
+
throw new Error(`Immediate data '${name}' must have a size known ahead of time, and '${type}' is runtime-sized`);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (type_has_arrays(type)) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
`Immediate data '${name}' may not contain an array: the immediate address space excludes arrays and structures with array members. Keep the array in a storage buffer and pass an index.`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// https://www.w3.org/TR/WGSL/#atomic-type — an immediate is immutable, so an atomic in one
|
|
210
|
+
// could never be operated on anyway
|
|
211
|
+
assert.equal(type_has_atomics(type), false, 'atomics are not allowed in immediate data');
|
|
212
|
+
|
|
213
|
+
const size = round_up(type.size, 4);
|
|
214
|
+
|
|
215
|
+
if (size > IMMEDIATE_SIZE_FLOOR) {
|
|
216
|
+
throw new Error(
|
|
217
|
+
`Immediate data '${name}' is ${size} bytes, over the ${IMMEDIATE_SIZE_FLOOR}-byte maxImmediateSize that every WebGPU device is guaranteed to offer. Move the bulk of it to a uniform buffer.`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
this.#immediate = { name, type };
|
|
222
|
+
|
|
223
|
+
return this;
|
|
224
|
+
}
|
|
225
|
+
|
|
129
226
|
/**
|
|
130
227
|
* Do not modify directly
|
|
131
228
|
* @returns {ShaderResourceGroupDescriptor[]}
|
|
@@ -159,6 +256,22 @@ export class ShaderResourceSetDescriptor {
|
|
|
159
256
|
* @param {string} name
|
|
160
257
|
* @returns {ShaderResourceDescriptor}
|
|
161
258
|
*/
|
|
259
|
+
/**
|
|
260
|
+
* Whether `name` is this shader's immediate data.
|
|
261
|
+
*
|
|
262
|
+
* Immediate data is deliberately absent from {@link getResourceByName}: it is not a bound
|
|
263
|
+
* resource and has no binding layout, so anything walking the resource interface should not see
|
|
264
|
+
* it. The graph helpers still need to recognise the name, because an immediate value travels to
|
|
265
|
+
* the encoder as a plain value rather than as a graph resource — and a `u32` immediate is a
|
|
266
|
+
* number, which those helpers would otherwise read as a graph resource id.
|
|
267
|
+
*
|
|
268
|
+
* @param {string} name
|
|
269
|
+
* @returns {boolean}
|
|
270
|
+
*/
|
|
271
|
+
isImmediateName(name) {
|
|
272
|
+
return this.#immediate !== undefined && this.#immediate.name === name;
|
|
273
|
+
}
|
|
274
|
+
|
|
162
275
|
getResourceByName(name) {
|
|
163
276
|
|
|
164
277
|
for (const group of this.#groups) {
|
|
@@ -244,6 +357,8 @@ export class ShaderResourceSetDescriptor {
|
|
|
244
357
|
r.bindGroupLayouts[i] = group.generateBindGroupLayoutDescriptor();
|
|
245
358
|
}
|
|
246
359
|
|
|
360
|
+
r.immediateSize = this.immediateSize;
|
|
361
|
+
|
|
247
362
|
return r;
|
|
248
363
|
}
|
|
249
364
|
|
|
@@ -273,7 +388,7 @@ export class ShaderResourceSetDescriptor {
|
|
|
273
388
|
generatePipelineLayout(stage) {
|
|
274
389
|
assert.defined(stage, 'stage');
|
|
275
390
|
|
|
276
|
-
return PipelineLayoutDescriptor.forStage(stage, this.generateBindingsArray());
|
|
391
|
+
return PipelineLayoutDescriptor.forStage(stage, this.generateBindingsArray(), this.immediateSize);
|
|
277
392
|
}
|
|
278
393
|
|
|
279
394
|
/**
|
|
@@ -313,6 +428,19 @@ export class ShaderResourceSetDescriptor {
|
|
|
313
428
|
|
|
314
429
|
const groups = this.#groups;
|
|
315
430
|
|
|
431
|
+
const immediate = this.#immediate;
|
|
432
|
+
|
|
433
|
+
if (immediate !== undefined) {
|
|
434
|
+
const immediate_type = immediate.type;
|
|
435
|
+
|
|
436
|
+
if (immediate_type.requires_declaration) {
|
|
437
|
+
dependencies.add(immediate_type.declaration_chunk);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// no @group, no @binding — this is the one module-scope variable that has neither
|
|
441
|
+
builder.add(`var<immediate> ${immediate.name} : ${immediate_type.wgsl_ref};`);
|
|
442
|
+
}
|
|
443
|
+
|
|
316
444
|
for (let group_index = 0; group_index < groups.length; group_index++) {
|
|
317
445
|
const group = groups[group_index];
|
|
318
446
|
|
|
@@ -382,8 +510,73 @@ export class ShaderResourceSetDescriptor {
|
|
|
382
510
|
|
|
383
511
|
}
|
|
384
512
|
|
|
385
|
-
|
|
513
|
+
const chunk = CodeChunk.from(builder.build(), Array.from(dependencies));
|
|
514
|
+
|
|
515
|
+
if (immediate !== undefined) {
|
|
516
|
+
// `requires`, not `enable` — see CodeChunk#addLanguageExtension
|
|
517
|
+
chunk.addLanguageExtension(IMMEDIATE_ADDRESS_SPACE_EXTENSION);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return chunk;
|
|
521
|
+
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Serialise this shader's immediate data into `buffer` at its current `position`, advancing
|
|
526
|
+
* `position` past what was written.
|
|
527
|
+
*
|
|
528
|
+
* **Allocates nothing.** That is the point of taking a caller-owned {@link BinaryBuffer} rather
|
|
529
|
+
* than returning bytes: `write_gpu_typed_buffer` would rebind a scratch buffer with a fresh
|
|
530
|
+
* `DataView` and `Uint8Array` on every call, which is two allocations per dispatch for a value
|
|
531
|
+
* that is often four bytes. {@link write_wgsl_type_value} takes the buffer directly and does not.
|
|
532
|
+
*
|
|
533
|
+
* The caller owns `position` because the caller owns the buffer — this only ever appends at the
|
|
534
|
+
* cursor it is handed.
|
|
535
|
+
*
|
|
536
|
+
* @param {Object} map the same binding map {@link generateBindings} reads
|
|
537
|
+
* @param {BinaryBuffer} buffer must already be set to the platform's endianness
|
|
538
|
+
* @returns {boolean} false when this shader declares no immediate data, and nothing was written
|
|
539
|
+
*/
|
|
540
|
+
writeImmediate(map, buffer) {
|
|
541
|
+
const immediate = this.#immediate;
|
|
542
|
+
|
|
543
|
+
if (immediate === undefined) {
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const value = map[immediate.name];
|
|
386
548
|
|
|
549
|
+
if (value === undefined || value === null) {
|
|
550
|
+
throw new Error(
|
|
551
|
+
`Value for immediate data '${immediate.name}' is missing from the input. Unlike a buffer binding it has no default: WebGPU refuses a draw whose immediate slots were never written.`
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
const start = buffer.position;
|
|
556
|
+
const size = this.immediateSize;
|
|
557
|
+
|
|
558
|
+
buffer.ensureCapacity(start + size);
|
|
559
|
+
|
|
560
|
+
write_wgsl_type_value(value, buffer, immediate.type);
|
|
561
|
+
|
|
562
|
+
// Zero-fill out to the declared size rather than stopping where the last member ended.
|
|
563
|
+
//
|
|
564
|
+
// The serialiser stops after the final member, so a struct with trailing padding — say
|
|
565
|
+
// `{vec4f, u32}`, 20 bytes written of a 32-byte type — leaves a tail. That tail is padding,
|
|
566
|
+
// WebGPU's AccessibleSlots excludes padding, and a short write would in fact validate. It
|
|
567
|
+
// would also mean the bytes handed to `setImmediates` are shorter than the `immediateSize`
|
|
568
|
+
// the pipeline layout declares, which is true-but-subtle in a way that only holds as long as
|
|
569
|
+
// nobody changes how either number is derived. Writing the full declared size costs at most
|
|
570
|
+
// 64 bytes of memset and makes the two trivially equal.
|
|
571
|
+
const written = buffer.position - start;
|
|
572
|
+
|
|
573
|
+
for (let i = written; i < size; i++) {
|
|
574
|
+
buffer.raw_bytes[start + i] = 0;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
buffer.position = start + size;
|
|
578
|
+
|
|
579
|
+
return true;
|
|
387
580
|
}
|
|
388
581
|
}
|
|
389
582
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a type is, or transitively contains, an array.
|
|
3
|
+
*
|
|
4
|
+
* Exists for the `immediate` address space, whose store type must be "a host-shareable constructible
|
|
5
|
+
* type, excluding arrays and structures that contain array members". The restriction is not
|
|
6
|
+
* arbitrary: immediates lower to D3D12 root constants and Metal `setBytes`, where a dynamically
|
|
7
|
+
* indexed array has nowhere good to live.
|
|
8
|
+
*
|
|
9
|
+
* @see https://www.w3.org/TR/WGSL/#var-decls
|
|
10
|
+
* @param {WebGPUType} t
|
|
11
|
+
* @return {boolean}
|
|
12
|
+
*/
|
|
13
|
+
export function type_has_arrays(t: WebGPUType): boolean;
|
|
14
|
+
//# sourceMappingURL=type_has_arrays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type_has_arrays.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/type/type_has_arrays.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,gDAFY,OAAO,CAsBlB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a type is, or transitively contains, an array.
|
|
3
|
+
*
|
|
4
|
+
* Exists for the `immediate` address space, whose store type must be "a host-shareable constructible
|
|
5
|
+
* type, excluding arrays and structures that contain array members". The restriction is not
|
|
6
|
+
* arbitrary: immediates lower to D3D12 root constants and Metal `setBytes`, where a dynamically
|
|
7
|
+
* indexed array has nowhere good to live.
|
|
8
|
+
*
|
|
9
|
+
* @see https://www.w3.org/TR/WGSL/#var-decls
|
|
10
|
+
* @param {WebGPUType} t
|
|
11
|
+
* @return {boolean}
|
|
12
|
+
*/
|
|
13
|
+
export function type_has_arrays(t) {
|
|
14
|
+
if (t.isArray) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (t.isPrimitive || t.isAtomic) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (t.isStruct) {
|
|
23
|
+
for (const f of t.fields) {
|
|
24
|
+
if (type_has_arrays(f.type)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
throw new Error(`Unsupported type '${t}'`);
|
|
33
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUViewSkyContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewSkyContext.js"],"names":[],"mappings":"AAiBA;IAsBI;;;OAGG;IACH,uCAgBC;IA5BD;;;OAGG;IACH,wCAEC;IA0BD,2BAIC;IAED;;;;OAIG;IACH,+
|
|
1
|
+
{"version":3,"file":"GPUViewSkyContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewSkyContext.js"],"names":[],"mappings":"AAiBA;IAsBI;;;OAGG;IACH,uCAgBC;IA5BD;;;OAGG;IACH,wCAEC;IA0BD,2BAIC;IAED;;;;OAIG;IACH,+DAuDC;IAED,mCAiCC;IA5BG,yBAA2B;IAyB3B,kCAA4B;IAKhC,gBAEC;;CACJ;kCA7JiC,iCAAiC"}
|