From 26c1cf58f483e64d80703fe37c4bd3923d1ff5b7 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 25 Feb 2019 19:57:11 +0100 Subject: Merge streaming into collide shader i.e. implement the A-B pattern. Dispatching only one compute shader per interaction-less simulation step already yields very noticeable performance gains. All cell types are now fully handled by the collide shader which further simplifies the code. --- src/shader/code/stream.glsl | 82 --------------------------------------------- 1 file changed, 82 deletions(-) delete mode 100644 src/shader/code/stream.glsl (limited to 'src/shader/code/stream.glsl') diff --git a/src/shader/code/stream.glsl b/src/shader/code/stream.glsl deleted file mode 100644 index 59aed98..0000000 --- a/src/shader/code/stream.glsl +++ /dev/null @@ -1,82 +0,0 @@ -static const std::string STREAM_SHADER_CODE = R"( -#version 430 - -layout (local_size_x = 1, local_size_y = 1) in; - -layout (std430, binding=1) buffer bufferCollide { float collideCells[]; }; -layout (std430, binding=2) buffer bufferStream { float streamCells[]; }; -layout (std430, binding=3) buffer bufferFluid { float fluidCells[]; }; - -/// LBM constants - -uniform uint nX; -uniform uint nY; - -const uint q = 9; - -// Array indexing - -uint indexOfDirection(int i, int j) { - return 3*(i+1) + (j+1); -} - -uint indexOfLatticeCell(uint x, uint y) { - return q*nX*y + q*x; -} - -uint indexOfFluidVertex(uint x, uint y) { - return 3*nX*y + 3*x; -} - -/// Data access - -float get(uint x, uint y, int i, int j) { - return collideCells[indexOfLatticeCell(x,y) + indexOfDirection(i,j)]; -} - -void set(uint x, uint y, int i, int j, float v) { - streamCells[indexOfLatticeCell(x,y) + indexOfDirection(i,j)] = v; -} - -int getMaterial(uint x, uint y) { - const uint idx = indexOfFluidVertex(x, y); - return int(fluidCells[idx + 2]); -} - -/// Boundary conditions - -void bounceBack(uint x, uint y) { - for ( int i = -1; i <= 1; ++i ) { - for ( int j = -1; j <= 1; ++j ) { - set(x,y,i,j, get(x,y,(-1)*i,(-1)*j)); - } - } -} - -/// Actual stream kernel - -void main() { - const uint x = gl_GlobalInvocationID.x; - const uint y = gl_GlobalInvocationID.y; - - if ( !(x < nX && y < nY) ) { - return; - } - - const int material = getMaterial(x,y); - - if ( material == 0 ) { - return; - } - - if ( material == 2 || material == 3 ) { - bounceBack(x,y); - } - - for ( int i = -1; i <= 1; ++i ) { - for ( int j = -1; j <= 1; ++j ) { - set(x+i,y+j,i,j, get(x,y,i,j)); - } - } -} -)"; -- cgit v1.2.3