@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 1.88 kB
JavaScript
import{StringIds as t}from"../../../core/string-ids.js";import{SAMPLETYPE_FLOAT as e,SAMPLETYPE_UNFILTERABLE_FLOAT as i,SAMPLETYPE_DEPTH as s,SAMPLETYPE_INT as r,SAMPLETYPE_UINT as o}from"../constants.js";import{WebgpuUtils as n}from"./webgpu-utils.js";import{gpuTextureFormats as a}from"./constants.js";const l=[];l[e]="filtering",l[i]="non-filtering",l[s]="comparison",l[r]="comparison",l[o]="comparison";const c=[];c[e]="float",c[i]="unfilterable-float",c[s]="depth",c[r]="sint",c[o]="uint";const u=new t;class p{constructor(t){const e=t.device,{key:i,descr:s}=this.createDescriptor(t);this.key=u.get(i),this.bindGroupLayout=e.wgpu.createBindGroupLayout(s)}destroy(){this.bindGroupLayout=null}loseContext(){}createDescriptor(t){const e=[];let i="";t.uniformBufferFormats.forEach((t=>{const s=n.shaderStage(t.visibility);i+=`#${t.slot}U:${s}`,e.push({binding:t.slot,visibility:s,buffer:{type:"uniform",hasDynamicOffset:!0}})})),t.textureFormats.forEach((t=>{const s=n.shaderStage(t.visibility),r=t.sampleType,o=t.textureDimension,a=!1,u=c[r];if(i+=`#${t.slot}T:${s}-${u}-${o}-false`,e.push({binding:t.slot,visibility:s,texture:{sampleType:u,viewDimension:o,multisampled:a}}),t.hasSampler){const o=l[r];i+=`#${t.slot+1}S:${s}-${o}`,e.push({binding:t.slot+1,visibility:s,sampler:{type:o}})}})),t.storageTextureFormats.forEach((t=>{const{format:s,textureDimension:r}=t,{read:o,write:n}=t;i+=`#${t.slot}ST:${s}-${r}-${o?"r1":"r0"}-${n?"w1":"w0"}`,e.push({binding:t.slot,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:o?n?"read-write":"read-only":"write-only",format:a[s],viewDimension:r}})})),t.storageBufferFormats.forEach((t=>{const s=t.readOnly,r=n.shaderStage(t.visibility);i+=`#${t.slot}SB:${r}-${s?"ro":"rw"}`,e.push({binding:t.slot,visibility:r,buffer:{type:s?"read-only-storage":"storage"}})}));return{key:i,descr:{entries:e}}}}export{p as WebgpuBindGroupFormat};