(programUniform: ProgramUniform)
| 780 | } |
| 781 | |
| 782 | private makeUniforms(programUniform: ProgramUniform): GPUBindingResource { |
| 783 | let currentOffset = 0; |
| 784 | let preLength = 0; |
| 785 | const offsets: number[] = []; |
| 786 | let maxAlignmentOfField = 1; |
| 787 | programUniform.forEach((d) => { |
| 788 | if (d.data.length === 0) { |
| 789 | d.data = [1]; |
| 790 | } |
| 791 | // https://www.w3.org/TR/WGSL/#alignof |
| 792 | let baseAlignment: number; |
| 793 | switch (d.data.length) { |
| 794 | case 1: |
| 795 | baseAlignment = 4; |
| 796 | break; |
| 797 | case 2: |
| 798 | baseAlignment = 8; |
| 799 | break; |
| 800 | case 3: |
| 801 | baseAlignment = 16; |
| 802 | break; |
| 803 | case 4: |
| 804 | baseAlignment = 16; |
| 805 | break; |
| 806 | case 5: |
| 807 | baseAlignment = 16; |
| 808 | break; |
| 809 | case 6: |
| 810 | baseAlignment = 16; |
| 811 | break; |
| 812 | default: |
| 813 | util.assert(false, () => `Unsupported ${d.data.length}D shape`); |
| 814 | } |
| 815 | |
| 816 | if (preLength === 5 || preLength === 6) { |
| 817 | baseAlignment = 16; |
| 818 | } |
| 819 | if (baseAlignment > maxAlignmentOfField) { |
| 820 | maxAlignmentOfField = baseAlignment; |
| 821 | } |
| 822 | currentOffset = Math.ceil(currentOffset / baseAlignment) * baseAlignment; |
| 823 | preLength = d.data.length; |
| 824 | offsets.push(currentOffset); |
| 825 | currentOffset += d.data.length * 4; |
| 826 | }); |
| 827 | |
| 828 | currentOffset = |
| 829 | Math.ceil(currentOffset / maxAlignmentOfField) * maxAlignmentOfField; |
| 830 | const arrayBuffer = new ArrayBuffer(currentOffset); |
| 831 | programUniform.forEach((d, i) => { |
| 832 | const offset = offsets[i]; |
| 833 | if (d.type === 'int32') { |
| 834 | new Int32Array(arrayBuffer, offset, d.data.length).set(d.data); |
| 835 | } else if (d.type === 'uint32') { |
| 836 | new Uint32Array(arrayBuffer, offset, d.data.length).set(d.data); |
| 837 | } else { |
| 838 | new Float32Array(arrayBuffer, offset, d.data.length).set(d.data); |
| 839 | } |
no test coverage detected