@@ -185,6 +185,114 @@ struct SMemoryBarrier
185
185
}
186
186
};
187
187
188
+ inline core::bitflag<PIPELINE_STAGE_FLAGS> allPreviousStages (core::bitflag<PIPELINE_STAGE_FLAGS> stages)
189
+ {
190
+ struct PerStagePreviousStages
191
+ {
192
+ public:
193
+ constexpr PerStagePreviousStages ()
194
+ {
195
+ add (PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT, data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)]);
196
+
197
+ add (PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT, data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)]);
198
+
199
+ // graphics primitive pipeline
200
+ auto primitivePrevStage = data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)];
201
+ for (const auto pipelineStage : {PIPELINE_STAGE_FLAGS::INDEX_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_ATTRIBUTE_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_CONTROL_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_EVALUATION_SHADER_BIT, PIPELINE_STAGE_FLAGS::GEOMETRY_SHADER_BIT, PIPELINE_STAGE_FLAGS::SHADING_RATE_ATTACHMENT_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT, PIPELINE_STAGE_FLAGS::LATE_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT})
202
+ {
203
+ if (pipelineStage == PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT)
204
+ primitivePrevStage |= PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT;
205
+ add (pipelineStage, primitivePrevStage);
206
+ primitivePrevStage |= pipelineStage;
207
+ }
208
+
209
+
210
+ }
211
+ constexpr const auto & operator [](const size_t ix) const {return data[ix];}
212
+
213
+ private:
214
+ constexpr static uint8_t findLSB (size_t val)
215
+ {
216
+ for (size_t ix=0ull ; ix<sizeof (size_t )*8 ; ix++)
217
+ if ((0x1ull <<ix)&val)
218
+ return ix;
219
+ return ~0u ;
220
+ }
221
+ constexpr void add (PIPELINE_STAGE_FLAGS stageFlag, PIPELINE_STAGE_FLAGS previousStageFlags)
222
+ {
223
+ const auto bitIx = findLSB (static_cast <size_t >(stageFlag));
224
+ data[bitIx] |= previousStageFlags;
225
+ }
226
+
227
+ PIPELINE_STAGE_FLAGS data[32 ] = {};
228
+ };
229
+
230
+ constexpr PerStagePreviousStages bitToAccess = {};
231
+
232
+ core::bitflag<PIPELINE_STAGE_FLAGS> retval = PIPELINE_STAGE_FLAGS::NONE;
233
+ while (bool (stages.value ))
234
+ {
235
+ const auto bitIx = hlsl::findLSB (stages);
236
+ retval |= bitToAccess[bitIx];
237
+ stages ^= static_cast <PIPELINE_STAGE_FLAGS>(0x1u <<bitIx);
238
+ }
239
+
240
+ return retval;
241
+ }
242
+
243
+ inline core::bitflag<PIPELINE_STAGE_FLAGS> allLaterStages (core::bitflag<PIPELINE_STAGE_FLAGS> stages)
244
+ {
245
+ struct PerStageLaterStages
246
+ {
247
+ public:
248
+ constexpr PerStageLaterStages ()
249
+ {
250
+ add (PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT);
251
+ add (PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT);
252
+
253
+ // graphics primitive pipeline
254
+ PIPELINE_STAGE_FLAGS laterStage = PIPELINE_STAGE_FLAGS::NONE;
255
+ for (const auto pipelineStage : std::reverse{PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::INDEX_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_ATTRIBUTE_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_CONTROL_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_EVALUATION_SHADER_BIT, PIPELINE_STAGE_FLAGS::GEOMETRY_SHADER_BIT, PIPELINE_STAGE_FLAGS::SHADING_RATE_ATTACHMENT_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT, PIPELINE_STAGE_FLAGS::LATE_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT})
256
+ {
257
+ add (pipelineStage, laterStage);
258
+ laterStage |= pipelineStage;
259
+ }
260
+
261
+ add (PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT, data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT)]);
262
+
263
+ }
264
+ constexpr const auto & operator [](const size_t ix) const {return data[ix];}
265
+
266
+ private:
267
+ constexpr static uint8_t findLSB (size_t val)
268
+ {
269
+ for (size_t ix=0ull ; ix<sizeof (size_t )*8 ; ix++)
270
+ if ((0x1ull <<ix)&val)
271
+ return ix;
272
+ return ~0u ;
273
+ }
274
+ constexpr void add (PIPELINE_STAGE_FLAGS stageFlag, PIPELINE_STAGE_FLAGS laterStageFlags)
275
+ {
276
+ const auto bitIx = findLSB (static_cast <size_t >(stageFlag));
277
+ data[bitIx] |= laterStageFlags;
278
+ }
279
+
280
+ PIPELINE_STAGE_FLAGS data[32 ] = {};
281
+ };
282
+
283
+ constexpr PerStageLaterStages bitToAccess = {};
284
+
285
+ core::bitflag<PIPELINE_STAGE_FLAGS> retval = PIPELINE_STAGE_FLAGS::NONE;
286
+ while (bool (stages.value ))
287
+ {
288
+ const auto bitIx = hlsl::findLSB (stages);
289
+ retval |= bitToAccess[bitIx];
290
+ stages ^= static_cast <PIPELINE_STAGE_FLAGS>(0x1u <<bitIx);
291
+ }
292
+
293
+ return retval;
294
+ }
295
+
188
296
inline core::bitflag<ACCESS_FLAGS> allAccessesFromStages (core::bitflag<PIPELINE_STAGE_FLAGS> stages)
189
297
{
190
298
struct PerStageAccesses
0 commit comments