GteFluid3EnforceStateBoundary.cpp
Go to the documentation of this file.
1 // David Eberly, Geometric Tools, Redmond WA 98052
2 // Copyright (c) 1998-2017
3 // Distributed under the Boost Software License, Version 1.0.
4 // http://www.boost.org/LICENSE_1_0.txt
5 // http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
6 // File Version: 3.0.0 (2016/06/19)
7 
8 #include <GTEnginePCH.h>
12 using namespace gte;
13 
14 Fluid3EnforceStateBoundary::Fluid3EnforceStateBoundary(std::shared_ptr<ProgramFactory> const& factory,
15  int xSize, int ySize, int zSize, int numXThreads, int numYThreads, int numZThreads)
16  :
17  mNumXGroups(xSize/numXThreads),
18  mNumYGroups(ySize/numYThreads),
19  mNumZGroups(zSize/numZThreads)
20 {
21  mXMin = std::make_shared<Texture2>(DF_R32G32_FLOAT, ySize, zSize);
22  mXMin->SetUsage(Resource::SHADER_OUTPUT);
23  mXMax = std::make_shared<Texture2>(DF_R32G32_FLOAT, ySize, zSize);
24  mXMax->SetUsage(Resource::SHADER_OUTPUT);
25  mYMin = std::make_shared<Texture2>(DF_R32G32_FLOAT, xSize, zSize);
26  mYMin->SetUsage(Resource::SHADER_OUTPUT);
27  mYMax = std::make_shared<Texture2>(DF_R32G32_FLOAT, xSize, zSize);
28  mYMax->SetUsage(Resource::SHADER_OUTPUT);
29  mZMin = std::make_shared<Texture2>(DF_R32G32_FLOAT, xSize, ySize);
30  mZMin->SetUsage(Resource::SHADER_OUTPUT);
31  mZMax = std::make_shared<Texture2>(DF_R32G32_FLOAT, xSize, ySize);
32  mZMax->SetUsage(Resource::SHADER_OUTPUT);
33 
34  int i = factory->GetAPI();
35  factory->PushDefines();
36  factory->defines.Set("USE_COPY_X_FACE", 1);
37  factory->defines.Set("NUM_Y_THREADS", numYThreads);
38  factory->defines.Set("NUM_Z_THREADS", numZThreads);
39  mCopyXFace = factory->CreateFromSource(*msSource[i]);
40  if (mCopyXFace)
41  {
42  mCopyXFace->GetCShader()->Set("xMin", mXMin);
43  mCopyXFace->GetCShader()->Set("xMax", mXMax);
44  }
45 
46  factory->defines.Clear();
47  factory->defines.Set("USE_WRITE_X_FACE", 1);
48  factory->defines.Set("NUM_Y_THREADS", numYThreads);
49  factory->defines.Set("NUM_Z_THREADS", numZThreads);
50  mWriteXFace = factory->CreateFromSource(*msSource[i]);
51  if (mWriteXFace)
52  {
53  mWriteXFace->GetCShader()->Set("xMin", mXMin);
54  mWriteXFace->GetCShader()->Set("xMax", mXMax);
55  }
56 
57  factory->defines.Clear();
58  factory->defines.Set("USE_COPY_Y_FACE", 1);
59  factory->defines.Set("NUM_X_THREADS", numXThreads);
60  factory->defines.Set("NUM_Z_THREADS", numZThreads);
61  mCopyYFace = factory->CreateFromSource(*msSource[i]);
62  if (mCopyYFace)
63  {
64  mCopyYFace->GetCShader()->Set("yMin", mYMin);
65  mCopyYFace->GetCShader()->Set("yMax", mYMax);
66  }
67 
68  factory->defines.Clear();
69  factory->defines.Set("USE_WRITE_Y_FACE", 1);
70  factory->defines.Set("NUM_X_THREADS", numXThreads);
71  factory->defines.Set("NUM_Z_THREADS", numZThreads);
72  mWriteYFace = factory->CreateFromSource(*msSource[i]);
73  if (mWriteYFace)
74  {
75  mWriteYFace->GetCShader()->Set("yMin", mYMin);
76  mWriteYFace->GetCShader()->Set("yMax", mYMax);
77  }
78 
79  factory->defines.Clear();
80  factory->defines.Set("USE_COPY_Z_FACE", 1);
81  factory->defines.Set("NUM_X_THREADS", numXThreads);
82  factory->defines.Set("NUM_Y_THREADS", numYThreads);
83  mCopyZFace = factory->CreateFromSource(*msSource[i]);
84  if (mCopyZFace)
85  {
86  mCopyZFace->GetCShader()->Set("zMin", mZMin);
87  mCopyZFace->GetCShader()->Set("zMax", mZMax);
88  }
89 
90  factory->defines.Clear();
91  factory->defines.Set("USE_WRITE_Z_FACE", 1);
92  factory->defines.Set("NUM_X_THREADS", numXThreads);
93  factory->defines.Set("NUM_Y_THREADS", numYThreads);
94  mWriteZFace = factory->CreateFromSource(*msSource[i]);
95  if (mWriteZFace)
96  {
97  mWriteZFace->GetCShader()->Set("zMin", mZMin);
98  mWriteZFace->GetCShader()->Set("zMax", mZMax);
99  }
100 
101  factory->PopDefines();
102 }
103 
104 void Fluid3EnforceStateBoundary::Execute(std::shared_ptr<GraphicsEngine> const& engine,
105  std::shared_ptr<Texture3> const& state)
106 {
107  // in: state
108  // out: mXMin, mXMax
109  mCopyXFace->GetCShader()->Set("state", state);
110  engine->Execute(mCopyXFace, 1, mNumYGroups, mNumZGroups);
111 
112  // in: mXMin, mXMax
113  // out: state
114  mWriteXFace->GetCShader()->Set("state", state);
115  engine->Execute(mWriteXFace, 1, mNumYGroups, mNumZGroups);
116 
117  // in: state
118  // out: mYMin, mYMax
119  mCopyYFace->GetCShader()->Set("state", state);
120  engine->Execute(mCopyYFace, mNumXGroups, 1, mNumZGroups);
121 
122  // in: mYMin, mYMax
123  // out: state
124  mWriteYFace->GetCShader()->Set("state", state);
125  engine->Execute(mWriteYFace, mNumXGroups, 1, mNumZGroups);
126 
127  // in: state
128  // out: mZMin, mZMax
129  mCopyZFace->GetCShader()->Set("state", state);
130  engine->Execute(mCopyZFace, mNumXGroups, mNumYGroups, 1);
131 
132  // in: mZMin, mZMax
133  // out: state
134  mWriteZFace->GetCShader()->Set("state", state);
135  engine->Execute(mWriteZFace, mNumXGroups, mNumYGroups, 1);
136 }
137 
138 
140 "#if USE_COPY_X_FACE\n"
141 "layout(rgba32f) uniform readonly image3D state;\n"
142 "layout(rg32f) uniform writeonly image2D xMin;\n"
143 "layout(rg32f) uniform writeonly image2D xMax;\n"
144 "\n"
145 "layout (local_size_x = 1, local_size_y = NUM_Y_THREADS, local_size_z = NUM_Z_THREADS) in;\n"
146 "void main()\n"
147 "{\n"
148 " ivec3 c = ivec3(gl_GlobalInvocationID.xyz);\n"
149 " ivec3 dim = imageSize(state);\n"
150 " vec2 xMinValue = imageLoad(state, ivec3(1, c.y, c.z)).yz;\n"
151 " vec2 xMaxValue = imageLoad(state, ivec3(dim.x - 2, c.y, c.z)).yz;\n"
152 " imageStore(xMin, c.yz, vec4(xMinValue, 0.0f, 0.0f));\n"
153 " imageStore(xMax, c.yz, vec4(xMaxValue, 0.0f, 0.0f));\n"
154 "}\n"
155 "#endif\n"
156 "\n"
157 "#if USE_WRITE_X_FACE\n"
158 "layout(rg32f) uniform readonly image2D xMin;\n"
159 "layout(rg32f) uniform readonly image2D xMax;\n"
160 "layout(rgba32f) uniform writeonly image3D state;\n"
161 "\n"
162 "layout (local_size_x = 1, local_size_y = NUM_Y_THREADS, local_size_z = NUM_Z_THREADS) in;\n"
163 "void main()\n"
164 "{\n"
165 " ivec3 c = ivec3(gl_GlobalInvocationID.xyz);\n"
166 " ivec3 dim = imageSize(state);\n"
167 " vec2 xMinValue = imageLoad(xMin, c.yz).xy;\n"
168 " vec2 xMaxValue = imageLoad(xMax, c.yz).xy;\n"
169 " imageStore(state, ivec3(0, c.y, c.z), vec4(0.0f, xMinValue.x, xMinValue.y, 0.0f));\n"
170 " imageStore(state, ivec3(dim.x - 1, c.y, c.z), vec4(0.0f, xMaxValue.x, xMaxValue.y, 0.0f));\n"
171 "}\n"
172 "#endif\n"
173 "\n"
174 "#if USE_COPY_Y_FACE\n"
175 "layout(rgba32f) uniform readonly image3D state;\n"
176 "layout(rg32f) uniform writeonly image2D yMin;\n"
177 "layout(rg32f) uniform writeonly image2D yMax;\n"
178 "\n"
179 "layout (local_size_x = NUM_X_THREADS, local_size_y = 1, local_size_z = NUM_Z_THREADS) in;\n"
180 "void main()\n"
181 "{\n"
182 " ivec3 c = ivec3(gl_GlobalInvocationID.xyz);\n"
183 " ivec3 dim = imageSize(state);\n"
184 " vec2 yMinValue = imageLoad(state, ivec3(c.x, 1, c.z)).xz;\n"
185 " vec2 yMaxValue = imageLoad(state, ivec3(c.x, dim.y - 2, c.z)).xz;\n"
186 " imageStore(yMin, c.xz, vec4(yMinValue, 0.0f, 0.0f));\n"
187 " imageStore(yMax, c.xz, vec4(yMaxValue, 0.0f, 0.0f));\n"
188 "}\n"
189 "#endif\n"
190 "\n"
191 "#if USE_WRITE_Y_FACE\n"
192 "layout(rg32f) uniform readonly image2D yMin;\n"
193 "layout(rg32f) uniform readonly image2D yMax;\n"
194 "layout(rgba32f) uniform writeonly image3D state;\n"
195 "\n"
196 "layout (local_size_x = NUM_X_THREADS, local_size_y = 1, local_size_z = NUM_Z_THREADS) in;\n"
197 "void main()\n"
198 "{\n"
199 " ivec3 c = ivec3(gl_GlobalInvocationID.xyz);\n"
200 " ivec3 dim = imageSize(state);\n"
201 " vec2 yMinValue = imageLoad(yMin, c.xz).xy;\n"
202 " vec2 yMaxValue = imageLoad(yMax, c.xz).xy;\n"
203 " imageStore(state, ivec3(c.x, 0, c.z), vec4(yMinValue.x, 0.0f, yMinValue.y, 0.0f));\n"
204 " imageStore(state, ivec3(c.x, dim.y - 1, c.z), vec4(yMaxValue.x, 0.0f, yMaxValue.y, 0.0f));\n"
205 "}\n"
206 "#endif\n"
207 "\n"
208 "#if USE_COPY_Z_FACE\n"
209 "layout(rgba32f) uniform readonly image3D state;\n"
210 "layout(rg32f) uniform writeonly image2D zMin;\n"
211 "layout(rg32f) uniform writeonly image2D zMax;\n"
212 "\n"
213 "layout (local_size_x = NUM_X_THREADS, local_size_y = NUM_Y_THREADS, local_size_z = 1) in;\n"
214 "void main()\n"
215 "{\n"
216 " ivec3 c = ivec3(gl_GlobalInvocationID.xyz);\n"
217 " ivec3 dim = imageSize(state);\n"
218 " vec2 zMinValue = imageLoad(state, ivec3(c.x, c.y, 1)).xy;\n"
219 " vec2 zMaxValue = imageLoad(state, ivec3(c.x, c.y, dim.z - 2)).xy;\n"
220 " imageStore(zMin, c.xy, vec4(zMinValue, 0.0f, 0.0f));\n"
221 " imageStore(zMax, c.xy, vec4(zMaxValue, 0.0f, 0.0f));\n"
222 "}\n"
223 "#endif\n"
224 "\n"
225 "#if USE_WRITE_Z_FACE\n"
226 "layout(rg32f) uniform readonly image2D zMin;\n"
227 "layout(rg32f) uniform readonly image2D zMax;\n"
228 "layout(rgba32f) uniform writeonly image3D state;\n"
229 "\n"
230 "layout (local_size_x = NUM_X_THREADS, local_size_y = NUM_Y_THREADS, local_size_z = 1) in;\n"
231 "void main()\n"
232 "{\n"
233 " ivec3 c = ivec3(gl_GlobalInvocationID.xyz);\n"
234 " ivec3 dim = imageSize(state);\n"
235 " vec2 zMinValue = imageLoad(zMin, c.xy).xy;\n"
236 " vec2 zMaxValue = imageLoad(zMax, c.xy).xy;\n"
237 " imageStore(state, ivec3(c.x, c.y, 0), vec4(zMinValue.x, zMinValue.y, 0.0f, 0.0f));\n"
238 " imageStore(state, ivec3(c.x, c.y, dim.z - 1), vec4(zMaxValue.x, zMaxValue.y, 0.0f, 0.0f));\n"
239 "}\n"
240 "#endif\n";
241 
243 "#if USE_COPY_X_FACE\n"
244 "Texture3D<float4> state;\n"
245 "RWTexture2D<float2> xMin;\n"
246 "RWTexture2D<float2> xMax;\n"
247 "\n"
248 "[numthreads(1, NUM_Y_THREADS, NUM_Z_THREADS)]\n"
249 "void CSMain(uint3 c : SV_DispatchThreadID)\n"
250 "{\n"
251 " uint3 dim;\n"
252 " state.GetDimensions(dim.x, dim.y, dim.z);\n"
253 " xMin[c.yz] = state[uint3(1, c.y, c.z)].yz;\n"
254 " xMax[c.yz] = state[uint3(dim.x - 2, c.y, c.z)].yz;\n"
255 "}\n"
256 "#endif\n"
257 "\n"
258 "#if USE_WRITE_X_FACE\n"
259 "Texture2D<float2> xMin;\n"
260 "Texture2D<float2> xMax;\n"
261 "RWTexture3D<float4> state;\n"
262 "\n"
263 "[numthreads(1, NUM_Y_THREADS, NUM_Z_THREADS)]\n"
264 "void CSMain(uint3 c : SV_DispatchThreadID)\n"
265 "{\n"
266 " uint3 dim;\n"
267 " state.GetDimensions(dim.x, dim.y, dim.z);\n"
268 " state[uint3(0, c.y, c.z)] = float4(0.0f, xMin[c.yz].x, xMin[c.yz].y, 0.0f);\n"
269 " state[uint3(dim.x - 1, c.y, c.z)] = float4(0.0f, xMax[c.yz].x, xMax[c.yz].y, 0.0f);\n"
270 "}\n"
271 "#endif\n"
272 "\n"
273 "#if USE_COPY_Y_FACE\n"
274 "Texture3D<float4> state;\n"
275 "RWTexture2D<float2> yMin;\n"
276 "RWTexture2D<float2> yMax;\n"
277 "\n"
278 "[numthreads(NUM_X_THREADS, 1, NUM_Z_THREADS)]\n"
279 "void CSMain(uint3 c : SV_DispatchThreadID)\n"
280 "{\n"
281 " uint3 dim;\n"
282 " state.GetDimensions(dim.x, dim.y, dim.z);\n"
283 " yMin[c.xz] = state[uint3(c.x, 1, c.z)].xz;\n"
284 " yMax[c.xz] = state[uint3(c.x, dim.y - 2, c.z)].xz;\n"
285 "}\n"
286 "#endif\n"
287 "\n"
288 "#if USE_WRITE_Y_FACE\n"
289 "Texture2D<float2> yMin;\n"
290 "Texture2D<float2> yMax;\n"
291 "RWTexture3D<float4> state;\n"
292 "\n"
293 "[numthreads(NUM_X_THREADS, 1, NUM_Z_THREADS)]\n"
294 "void CSMain(uint3 c : SV_DispatchThreadID)\n"
295 "{\n"
296 " uint3 dim;\n"
297 " state.GetDimensions(dim.x, dim.y, dim.z);\n"
298 " state[uint3(c.x, 0, c.z)] = float4(yMin[c.xz].x, 0.0f, yMin[c.xz].y, 0.0f);\n"
299 " state[uint3(c.x, dim.y - 1, c.z)] = float4(yMax[c.xz].x, 0.0f, yMax[c.xz].y, 0.0f);\n"
300 "}\n"
301 "#endif\n"
302 "\n"
303 "#if USE_COPY_Z_FACE\n"
304 "Texture3D<float4> state;\n"
305 "RWTexture2D<float2> zMin;\n"
306 "RWTexture2D<float2> zMax;\n"
307 "\n"
308 "[numthreads(NUM_X_THREADS, NUM_Y_THREADS, 1)]\n"
309 "void CSMain(uint3 c : SV_DispatchThreadID)\n"
310 "{\n"
311 " uint3 dim;\n"
312 " state.GetDimensions(dim.x, dim.y, dim.z);\n"
313 " zMin[c.xy] = state[uint3(c.x, c.y, 1)].xy;\n"
314 " zMax[c.xy] = state[uint3(c.x, c.y, dim.z - 2)].xy;\n"
315 "}\n"
316 "#endif\n"
317 "\n"
318 "#if USE_WRITE_Z_FACE\n"
319 "Texture2D<float2> zMin;\n"
320 "Texture2D<float2> zMax;\n"
321 "RWTexture3D<float4> state;\n"
322 "\n"
323 "[numthreads(NUM_X_THREADS, NUM_Y_THREADS, 1)]\n"
324 "void CSMain(uint3 c : SV_DispatchThreadID)\n"
325 "{\n"
326 " uint3 dim;\n"
327 " state.GetDimensions(dim.x, dim.y, dim.z);\n"
328 " state[uint3(c.x, c.y, 0)] = float4(zMin[c.xy].x, zMin[c.xy].y, 0.0f, 0.0f);\n"
329 " state[uint3(c.x, c.y, dim.z - 1)] = float4(zMax[c.xy].x, zMax[c.xy].y, 0.0f, 0.0f);\n"
330 "}\n"
331 "#endif\n";
332 
334 {
335  &msGLSLSource,
336  &msHLSLSource
337 };
Fluid3EnforceStateBoundary(std::shared_ptr< ProgramFactory > const &factory, int xSize, int ySize, int zSize, int numXThreads, int numYThreads, int numZThreads)
std::shared_ptr< ComputeProgram > mCopyXFace
std::shared_ptr< ComputeProgram > mCopyZFace
std::shared_ptr< ComputeProgram > mWriteXFace
GLsizei const GLchar *const * string
Definition: glcorearb.h:809
std::shared_ptr< ComputeProgram > mWriteZFace
std::shared_ptr< ComputeProgram > mCopyYFace
DF_R32G32_FLOAT
Definition: GteDataFormat.h:20
static std::string const * msSource[ProgramFactory::PF_NUM_API]
void Execute(std::shared_ptr< GraphicsEngine > const &engine, std::shared_ptr< Texture3 > const &state)
std::shared_ptr< ComputeProgram > mWriteYFace


geometric_tools_engine
Author(s): Yijiang Huang
autogenerated on Thu Jul 18 2019 03:59:59