31 lines
1.9 KiB
JavaScript
31 lines
1.9 KiB
JavaScript
// Read the four actual smooth textures without adding COPY_SRC usage to game resources.
|
|
async function testSmoothInputs() {
|
|
const d=GPU.device, code=`
|
|
@group(0) @binding(0) var col: texture_2d<f32>;
|
|
@group(0) @binding(1) var back: texture_2d<f32>;
|
|
@group(0) @binding(2) var tree: texture_2d<f32>;
|
|
@group(0) @binding(3) var field: texture_2d<f32>;
|
|
@group(0) @binding(4) var<storage,read_write> out: array<u32>;
|
|
@compute @workgroup_size(64) fn main(@builtin(global_invocation_id) id: vec3u) {
|
|
let size=textureDimensions(col); let k=id.x; if(k>=size.x*size.y){return;}
|
|
let p=vec2i(i32(k%size.x),i32(k/size.x));
|
|
out[k*4]=pack4x8unorm(textureLoad(col,p,0));
|
|
out[k*4+1]=pack4x8unorm(textureLoad(back,p,0));
|
|
out[k*4+2]=pack4x8unorm(textureLoad(tree,p,0));
|
|
out[k*4+3]=pack4x8unorm(textureLoad(field,p,0));
|
|
}`;
|
|
const pipe=d.createComputePipeline({layout:'auto',compute:{module:d.createShaderModule({code}),entryPoint:'main'}});
|
|
const bytes=R.px.length*16;
|
|
const storage=d.createBuffer({size:bytes,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC});
|
|
const read=d.createBuffer({size:bytes,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});
|
|
const entries=[GPU.colourTex,GPU.backTex,GPU.treeTex,GPU.fieldTex].map((t,binding)=>({binding,resource:t.createView()}));
|
|
entries.push({binding:4,resource:{buffer:storage}});
|
|
const bind=d.createBindGroup({layout:pipe.getBindGroupLayout(0),entries});
|
|
const enc=d.createCommandEncoder(),pass=enc.beginComputePass();pass.setPipeline(pipe);pass.setBindGroup(0,bind);pass.dispatchWorkgroups(Math.ceil(R.px.length/64));pass.end();
|
|
enc.copyBufferToBuffer(storage,0,read,0,bytes);d.queue.submit([enc.finish()]);
|
|
await read.mapAsync(GPUMapMode.READ);
|
|
const actual=new Uint32Array(read.getMappedRange()).slice();
|
|
read.unmap();storage.destroy();read.destroy();
|
|
return actual;
|
|
}
|