import FluidGridData; struct Params { // read-write FluidGridData next; // read-only FluidGridData current; // read-only FluidGridData grid0; float a; float c; }; ParameterBlock params; [shader("compute")] [numthreads(32, 8, 1)] void linearSolve(uint3 dispatchThreadID : SV_DispatchThreadID) { FluidGridData next = params.next; FluidGridData current = params.current; FluidGridData grid0 = params.grid0; float a = params.a; float cRecip = 1.0f / params.c; int x = dispatchThreadID.x + 1; int y = dispatchThreadID.y + 1; int z = dispatchThreadID.z + 1; if(x >= gridSize.x - 1 || y >= gridSize.y - 1 || z >= gridSize.z - 1) return; next[x, y, z] = (grid0[x, y, z] + a * (current[x + 1, y, z] + current[x - 1, y, z] + current[x, y + 1, z] + current[x, y - 1, z] + current[x, y, z + 1] + current[x, y, z - 1])) * cRecip; }